From a3eaccec6e84a89ccc02e86cc855456ba5c0e0cf Mon Sep 17 00:00:00 2001 From: ryardley Date: Sun, 18 May 2025 13:03:59 +0200 Subject: [PATCH 001/106] Add branch file --- .deleteme | 1 + 1 file changed, 1 insertion(+) create mode 100644 .deleteme diff --git a/.deleteme b/.deleteme new file mode 100644 index 0000000000..afcd3158e2 --- /dev/null +++ b/.deleteme @@ -0,0 +1 @@ +This is a file to signify the start of the hacknet branch and should be deleted with the first PR From 337c98d25c9f716557818ec10c9eaacfac7d2a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 18 May 2025 12:13:52 +0000 Subject: [PATCH 002/106] Add template file (#410) --- .github/PULL_REQUEST_TEMPLATE/hacknet.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/hacknet.md diff --git a/.github/PULL_REQUEST_TEMPLATE/hacknet.md b/.github/PULL_REQUEST_TEMPLATE/hacknet.md new file mode 100644 index 0000000000..d2e4893380 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/hacknet.md @@ -0,0 +1,11 @@ +## Title + +Content. + +#### Reviewers + +- [ ] Reviewer + +#### Notes + +Remember you can request a coderabbit review by adding `@coderabbitai review` as a comment From 8399f6c8c6f80bdbb00c6ca97fa30b2db91395a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 18 May 2025 13:11:12 +0000 Subject: [PATCH 003/106] This wont work with github so reverting (#412) --- .github/PULL_REQUEST_TEMPLATE/hacknet.md | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE/hacknet.md diff --git a/.github/PULL_REQUEST_TEMPLATE/hacknet.md b/.github/PULL_REQUEST_TEMPLATE/hacknet.md deleted file mode 100644 index d2e4893380..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE/hacknet.md +++ /dev/null @@ -1,11 +0,0 @@ -## Title - -Content. - -#### Reviewers - -- [ ] Reviewer - -#### Notes - -Remember you can request a coderabbit review by adding `@coderabbitai review` as a comment From 81c5997bee4054b17f1eeb402fe280a411e74abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 18 May 2025 19:20:11 +0000 Subject: [PATCH 004/106] Add hacknet branch to actions and fix scoping (#413) * Add hacknet branch to actions and fix scoping * Run tests no matter what --- .github/workflows/ci.yml | 1 + .github/workflows/crisp-e2e.yaml | 13 +++++-------- .github/workflows/ec2-deployment.yml | 2 ++ .github/workflows/integration.yml | 1 + .github/workflows/rust-ci.yml | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d0a816318..8a28db27c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,7 @@ on: push: branches: - main + - hacknet jobs: ci: diff --git a/.github/workflows/crisp-e2e.yaml b/.github/workflows/crisp-e2e.yaml index 056c9fdd53..e0e546c96c 100644 --- a/.github/workflows/crisp-e2e.yaml +++ b/.github/workflows/crisp-e2e.yaml @@ -1,15 +1,12 @@ name: CRISP on: - push: - branches: [main] - paths: - - "examples/CRISP/**" + workflow_dispatch: pull_request: - branches: [main] - paths: - - "examples/CRISP/**" - workflow_dispatch: # Allow manual triggering + push: + branches: + - main + - hacknet jobs: test: diff --git a/.github/workflows/ec2-deployment.yml b/.github/workflows/ec2-deployment.yml index 72aa34a9d1..8dd961f7c2 100644 --- a/.github/workflows/ec2-deployment.yml +++ b/.github/workflows/ec2-deployment.yml @@ -4,6 +4,7 @@ on: branches: - release - main + - hacknet paths: - "packages/ciphernode/**" - "packages/evm/contracts/**" @@ -11,6 +12,7 @@ on: branches: - release - main + - hacknet paths: - "packages/ciphernode/**" - "packages/evm/contracts/**" diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 8870c53b3a..90aa5c4431 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -10,6 +10,7 @@ on: push: branches: - main + - hacknet jobs: test-net: diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 241aea27d7..4bb92fcfcc 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -5,6 +5,7 @@ on: push: branches: - main + - hacknet jobs: ci: From 61ae0c7ff54cc834eb5698303dbfd57eb095376f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 18 May 2025 19:42:27 +0000 Subject: [PATCH 005/106] commons -> enclave-sdk (#415) --- examples/CRISP/apps/program/core/Cargo.toml | 2 +- examples/CRISP/apps/program/core/src/lib.rs | 2 +- examples/CRISP/apps/server/Cargo.lock | 2 +- examples/CRISP/apps/server/Cargo.toml | 2 +- examples/CRISP/apps/server/src/cli/commands.rs | 6 ++---- examples/CRISP/apps/server/src/server/routes/rounds.rs | 2 +- examples/CRISP/apps/wasm-crypto/Cargo.toml | 4 ++-- examples/CRISP/apps/wasm-crypto/src/lib.rs | 2 +- packages/ciphernode/Dockerfile | 4 ++-- packages/ciphernode/fhe/Cargo.toml | 2 +- packages/ciphernode/fhe/src/utils.rs | 2 +- packages/ciphernode/test_helpers/Cargo.toml | 2 +- packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs | 2 +- packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs | 2 +- packages/ciphernode/tests/Cargo.toml | 2 +- .../tests/tests/test_aggregation_and_decryption.rs | 2 +- packages/{commons => enclave-sdk}/Cargo.lock | 0 packages/{commons => enclave-sdk}/Cargo.toml | 4 ++-- packages/{commons => enclave-sdk}/src/bfv/mod.rs | 0 packages/{commons => enclave-sdk}/src/lib.rs | 0 20 files changed, 21 insertions(+), 23 deletions(-) rename packages/{commons => enclave-sdk}/Cargo.lock (100%) rename packages/{commons => enclave-sdk}/Cargo.toml (87%) rename packages/{commons => enclave-sdk}/src/bfv/mod.rs (100%) rename packages/{commons => enclave-sdk}/src/lib.rs (100%) diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index 9341fef2f0..b98b0de3b3 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -7,4 +7,4 @@ edition = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } compute-provider = { path = "../../../../../packages/compute_provider" } -commons = { path = "../../../../../packages/commons" } +enclave-sdk = { path = "../../../../../packages/enclave-sdk" } diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index d709e9f427..02cffdba76 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,5 +1,5 @@ -use commons::bfv::deserialize_bfv_params_arc; use compute_provider::FHEInputs; +use enclave_sdk::bfv::deserialize_bfv_params_arc; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 9421b1ecbf..23c78cce72 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -4887,7 +4887,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec 0.6.3", - "bitflags 2.5.0", + "bitflags 2.9.1", "lazy_static", "num-traits", "rand 0.8.5", diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index a61b4bc31a..5edb1bd1b1 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -37,7 +37,7 @@ sha2 = "0.10.8" # Local dependencies compute-provider = { path = "../../../../packages/compute_provider" } -commons = { path = "../../../../packages/commons" } +enclave-sdk = { path = "../../../../packages/enclave-sdk" } voting-host = { path = "../program/host" } # CLI and user interaction diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index 9bb8ecb9f7..a36fde5f4c 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -6,11 +6,9 @@ use serde::{Deserialize, Serialize}; use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; -use commons::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; use crisp::server::blockchain::relayer::EnclaveContract; -use fhe_rs::bfv::{ - BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey, -}; +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, Serialize as FheSerialize, diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 913d611325..e4939c4061 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -8,7 +8,7 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use commons::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index f764fc7703..8c548853fe 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -commons = { path = "../../../../packages/commons" } +enclave-sdk = { path = "../../../../packages/enclave-sdk" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" @@ -30,4 +30,4 @@ console_log = "0.2" log = "0.4" [lib] -crate-type = ["cdylib", "rlib"] \ No newline at end of file +crate-type = ["cdylib", "rlib"] diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index 9e663b1c81..89f9ab0a76 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -1,8 +1,8 @@ mod greco; mod util; -use commons::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use console_log; +use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; use rand::thread_rng; diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 5a6caacb73..6d1358665f 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -43,8 +43,8 @@ COPY ./packages/ciphernode/test_helpers/Cargo.toml ./test_helpers/Cargo.toml COPY ./packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml COPY ./packages/ciphernode/rust-toolchain.toml . -# Copy commons package -COPY ./packages/commons ../commons +# Copy enclave-sdk package +COPY ./packages/enclave-sdk ../enclave-sdk RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 6afdaf8545..84ad02ee5f 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -18,4 +18,4 @@ rand = { workspace = true } rand_chacha = { workspace = true } e3_request = { workspace = true } serde = { workspace = true } -commons = { path = "../../commons" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/fhe/src/utils.rs b/packages/ciphernode/fhe/src/utils.rs index c98b0e501d..fcca593899 100644 --- a/packages/ciphernode/fhe/src/utils.rs +++ b/packages/ciphernode/fhe/src/utils.rs @@ -1,5 +1,5 @@ use super::SharedRng; -use commons::bfv::build_bfv_params_arc; +use enclave_sdk::bfv::build_bfv_params_arc; use fhe_rs::bfv::BfvParameters; use fhe_rs::mbfv::CommonRandomPoly; use fhe_traits::Serialize; diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index a59d053bf1..22bdad5ccc 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -14,4 +14,4 @@ fhe-traits = { workspace = true } rand_chacha = { workspace = true } rand = { workspace = true } tracing = { workspace = true } -commons = { path = "../../commons" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs index bfe13c8a23..27c16f5634 100644 --- a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs +++ b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs @@ -1,6 +1,6 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use commons::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; diff --git a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs index dd4b7681e0..26d4ba3a45 100644 --- a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs +++ b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs @@ -1,5 +1,5 @@ use clap::{command, Parser}; -use commons::bfv::{build_bfv_params_arc, encode_bfv_params}; +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params}; use std::{error::Error, num::ParseIntError, process}; fn parse_hex(arg: &str) -> Result { diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index 387832bd3c..5de1edba00 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -30,4 +30,4 @@ bincode = { workspace = true } base64 = { workspace = true } actix = { workspace = true } anyhow = { workspace = true } -commons = { path = "../../commons" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index f2ed8c2d95..2ddfe019e9 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -2,11 +2,11 @@ use actix::prelude::*; use aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; use alloy::primitives::Address; use anyhow::*; -use commons::bfv::params::SET_2048_1032193_1; use crypto::Cipher; use data::RepositoriesFactory; use data::{DataStore, InMemStore}; use e3_request::E3Router; +use enclave_sdk::bfv::params::SET_2048_1032193_1; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, GetErrors, diff --git a/packages/commons/Cargo.lock b/packages/enclave-sdk/Cargo.lock similarity index 100% rename from packages/commons/Cargo.lock rename to packages/enclave-sdk/Cargo.lock diff --git a/packages/commons/Cargo.toml b/packages/enclave-sdk/Cargo.toml similarity index 87% rename from packages/commons/Cargo.toml rename to packages/enclave-sdk/Cargo.toml index 48e58689ed..18e254686c 100644 --- a/packages/commons/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "commons" +name = "enclave-sdk" version = "0.1.0" edition = "2021" [dependencies] fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -anyhow = "1.0.86" \ No newline at end of file +anyhow = "1.0.86" diff --git a/packages/commons/src/bfv/mod.rs b/packages/enclave-sdk/src/bfv/mod.rs similarity index 100% rename from packages/commons/src/bfv/mod.rs rename to packages/enclave-sdk/src/bfv/mod.rs diff --git a/packages/commons/src/lib.rs b/packages/enclave-sdk/src/lib.rs similarity index 100% rename from packages/commons/src/lib.rs rename to packages/enclave-sdk/src/lib.rs From 3f51d476501b111ff0daf968335202aee63236ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 18 May 2025 23:23:16 +0000 Subject: [PATCH 006/106] Program extraction pt1: Extract Enclave contract from CRISP to shared library (#414) * Add app entrypoint to program * Add architectural explanation * Extract EnclaveContract from CRISP into enclave-sdk * Differentiate between isomorphic libs and non-isomorphic libs * Add isomorphic package to Dockerfile --- examples/CRISP/apps/program/Cargo.lock | 24 +- examples/CRISP/apps/program/Cargo.toml | 2 +- examples/CRISP/apps/program/README.md | 31 + examples/CRISP/apps/program/app/Cargo.toml | 6 + examples/CRISP/apps/program/app/src/main.rs | 3 + examples/CRISP/apps/program/core/Cargo.toml | 2 +- examples/CRISP/apps/program/core/src/lib.rs | 2 +- examples/CRISP/apps/program/host/Cargo.lock | 7660 ----------------- examples/CRISP/apps/program/host/README.md | 3 + .../CRISP/apps/program/methods/Cargo.lock | 4107 --------- .../apps/program/methods/guest/Cargo.lock | 140 +- examples/CRISP/apps/server/Cargo.lock | 34 +- examples/CRISP/apps/server/Cargo.toml | 3 +- .../CRISP/apps/server/src/cli/commands.rs | 35 +- .../server/src/server/blockchain/handlers.rs | 25 +- .../apps/server/src/server/blockchain/mod.rs | 1 - .../apps/server/src/server/blockchain/sync.rs | 13 +- examples/CRISP/apps/server/src/server/mod.rs | 2 +- .../apps/server/src/server/routes/rounds.rs | 12 +- .../apps/server/src/server/routes/voting.rs | 23 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 44 +- examples/CRISP/apps/wasm-crypto/Cargo.toml | 2 +- examples/CRISP/apps/wasm-crypto/src/lib.rs | 2 +- packages/ciphernode/Cargo.lock | 66 +- packages/ciphernode/Cargo.toml | 2 +- packages/ciphernode/Dockerfile | 1 + packages/ciphernode/fhe/Cargo.toml | 2 +- packages/ciphernode/fhe/src/utils.rs | 2 +- packages/ciphernode/test_helpers/Cargo.toml | 2 +- .../test_helpers/src/bin/fake_encrypt.rs | 2 +- .../test_helpers/src/bin/pack_e3_params.rs | 2 +- packages/ciphernode/tests/Cargo.toml | 2 +- .../tests/test_aggregation_and_decryption.rs | 2 +- .../enclave-sdk-isomorphic}/Cargo.lock | 343 +- packages/enclave-sdk-isomorphic/Cargo.toml | 10 + .../src/bfv/mod.rs | 0 packages/enclave-sdk-isomorphic/src/lib.rs | 1 + packages/enclave-sdk/Cargo.lock | 4291 ++++++++- packages/enclave-sdk/Cargo.toml | 8 +- .../enclave-sdk/src/evm/contracts.rs | 15 +- packages/enclave-sdk/src/evm/mod.rs | 1 + packages/enclave-sdk/src/lib.rs | 2 +- 42 files changed, 4194 insertions(+), 12736 deletions(-) create mode 100644 examples/CRISP/apps/program/README.md create mode 100644 examples/CRISP/apps/program/app/Cargo.toml create mode 100644 examples/CRISP/apps/program/app/src/main.rs delete mode 100644 examples/CRISP/apps/program/host/Cargo.lock create mode 100644 examples/CRISP/apps/program/host/README.md delete mode 100644 examples/CRISP/apps/program/methods/Cargo.lock rename {examples/CRISP/apps/program/core => packages/enclave-sdk-isomorphic}/Cargo.lock (76%) create mode 100644 packages/enclave-sdk-isomorphic/Cargo.toml rename packages/{enclave-sdk => enclave-sdk-isomorphic}/src/bfv/mod.rs (100%) create mode 100644 packages/enclave-sdk-isomorphic/src/lib.rs rename examples/CRISP/apps/server/src/server/blockchain/relayer.rs => packages/enclave-sdk/src/evm/contracts.rs (95%) create mode 100644 packages/enclave-sdk/src/evm/mod.rs diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 8d101479c6..11b52bb6fe 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -644,6 +644,10 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "app" +version = "0.1.0" + [[package]] name = "ark-bn254" version = "0.4.0" @@ -1387,15 +1391,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "compute-provider" version = "0.1.0" @@ -1868,6 +1863,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe", + "fhe-traits", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -5218,8 +5222,8 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" name = "voting-core" version = "0.1.0" dependencies = [ - "commons", "compute-provider", + "enclave-sdk-isomorphic", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index 3d499f1561..33d712cfa1 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["host", "core", "methods"] +members = ["host", "core", "methods", "app"] exclude = ["methods/guests"] [workspace.package] diff --git a/examples/CRISP/apps/program/README.md b/examples/CRISP/apps/program/README.md new file mode 100644 index 0000000000..cabe4dcc7a --- /dev/null +++ b/examples/CRISP/apps/program/README.md @@ -0,0 +1,31 @@ +# Program + +This module does the following: + +- Listens for Enclave `events` from the blockchain +- Manages `risc0` computations +- Persist processed `events` + +This is the program component for our architecture here. + +```mermaid +graph TD + subgraph ec2_1["Docker swarm cluster"] + compute_engine["program"]--store completed--> cpdb[(events)] + server["server"] --> db + db[(DB)] + client --"proofs/get_data"--> server + + end + compute_engine ---> bonsai + compute_engine -."listen for events".-> evm + compute_engine -- "publishCiphertextOutput(proof)" ---> evm + + bonsai["bonsai (risc0)"] + server -. "listen for events" ..-> evm + server --".publishInput()"--> evm + subgraph evm + esol1["Enclave.sol"] + csol1["CRISP.sol"] + end +``` diff --git a/examples/CRISP/apps/program/app/Cargo.toml b/examples/CRISP/apps/program/app/Cargo.toml new file mode 100644 index 0000000000..f0be1d2be7 --- /dev/null +++ b/examples/CRISP/apps/program/app/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "app" +version.workspace = true +edition.workspace = true + +[dependencies] diff --git a/examples/CRISP/apps/program/app/src/main.rs b/examples/CRISP/apps/program/app/src/main.rs new file mode 100644 index 0000000000..e7a11a969c --- /dev/null +++ b/examples/CRISP/apps/program/app/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index b98b0de3b3..47014371b9 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -7,4 +7,4 @@ edition = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } compute-provider = { path = "../../../../../packages/compute_provider" } -enclave-sdk = { path = "../../../../../packages/enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../../../../packages/enclave-sdk-isomorphic" } diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index 02cffdba76..8f96fee1bd 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,5 +1,5 @@ use compute_provider::FHEInputs; -use enclave_sdk::bfv::deserialize_bfv_params_arc; +use enclave_sdk_isomorphic::bfv::deserialize_bfv_params_arc; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; diff --git a/examples/CRISP/apps/program/host/Cargo.lock b/examples/CRISP/apps/program/host/Cargo.lock deleted file mode 100644 index ac7331a462..0000000000 --- a/examples/CRISP/apps/program/host/Cargo.lock +++ /dev/null @@ -1,7660 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-network", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives 0.8.25", - "num_enum", - "strum 0.27.1", -] - -[[package]] -name = "alloy-consensus" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" -dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.25", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 2.0.1", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "serde", - "serde_with", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives 0.8.25", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.25", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-sol-types 0.8.25", - "alloy-transport", - "futures", - "futures-util", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives 0.8.25", - "alloy-rlp", - "alloy-sol-types 0.8.25", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" -dependencies = [ - "alloy-json-abi", - "alloy-primitives 0.8.25", - "alloy-sol-type-parser", - "alloy-sol-types 0.8.25", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2124" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-rlp", - "crc", - "serde", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-rlp", - "serde", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-eips" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives 0.8.25", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "c-kzg", - "derive_more 2.0.1", - "either", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" -dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.25", - "alloy-serde", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27434beae2514d4a2aa90f53832cbdf6f23e4b5e2656d95eaf15f9276e2418b6" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-types 0.8.25", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives 0.8.25", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types 0.8.25", - "async-trait", - "auto_impl", - "derive_more 2.0.1", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives 0.8.25", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600d34d8de81e23b6d909c094e23b3d357e01ca36b78a8c5424c501eedbe86f0" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 0.99.20", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-primitives" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 2.0.1", - "foldhash", - "hashbrown 0.15.3", - "indexmap 2.9.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.8.5", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.25", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-sol-types 0.8.25", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest 0.12.15", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives 0.8.25", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "futures", - "pin-project", - "reqwest 0.12.15", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "tracing-futures", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives 0.8.25", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types 0.8.25", - "itertools 0.14.0", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-serde" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1cd73fc054de6353c7f22ff9b846b0f0f145cd0112da07d4119e41e9959207" -dependencies = [ - "alloy-primitives 0.8.25", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96fbde54bee943cd94ebacc8a62c50b38c7dfd2552dcd79ff61aea778b1bfcc" -dependencies = [ - "alloy-primitives 0.8.25", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-signer-local" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives 0.8.25", - "alloy-signer", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86ec0a47740b20bc5613b8712d0d321d031c4efc58e9645af96085d5cccfc27" -dependencies = [ - "const-hex", - "dunce", - "heck 0.4.1", - "indexmap 2.9.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity 0.6.4", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck 0.5.0", - "indexmap 2.9.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity 0.8.25", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck 0.5.0", - "macro-string", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.101", - "syn-solidity 0.8.25", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad09ec5853fa700d12d778ad224dcdec636af424d29fad84fb9a2f16a5b0ef09" -dependencies = [ - "alloy-primitives 0.6.4", - "alloy-sol-macro 0.6.4", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-sol-types" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" -dependencies = [ - "alloy-json-abi", - "alloy-primitives 0.8.25", - "alloy-sol-macro 0.8.25", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "derive_more 2.0.1", - "futures", - "futures-utils-wasm", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.15", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", - "serde", - "smallvec", - "tracing", -] - -[[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 = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" -dependencies = [ - "anstyle", - "once_cell", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-std 0.4.0", -] - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-crypto-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" -dependencies = [ - "ahash", - "ark-crypto-primitives-macros", - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-snark", - "ark-std 0.5.0", - "blake2", - "derivative", - "digest 0.10.7", - "fnv", - "merlin", - "sha2", -] - -[[package]] -name = "ark-crypto-primitives-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff 0.4.2", - "ark-poly 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "hashbrown 0.13.2", - "itertools 0.10.5", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-groth16" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" -dependencies = [ - "ark-crypto-primitives", - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive 0.4.2", - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-snark" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" -dependencies = [ - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arraydeque" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[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 = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[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.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bonsai-sdk" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" -dependencies = [ - "duplicate", - "maybe-async", - "reqwest 0.12.15", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "cc" -version = "1.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[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.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clap" -version = "4.5.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac", - "k256", - "serde", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.7", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror 1.0.69", -] - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - -[[package]] -name = "const-hex" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.101", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.101", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "docker-generate" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "duplicate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "elf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "ena" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" -dependencies = [ - "log", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" -dependencies = [ - "base64 0.21.7", - "bytes", - "hex", - "k256", - "log", - "rand 0.8.5", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand 0.8.5", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror 1.0.69", - "uuid", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror 1.0.69", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "ethers-etherscan", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest 0.11.27", - "serde", - "serde_json", - "syn 2.0.101", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.101", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata 0.18.1", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum 0.26.3", - "syn 2.0.101", - "tempfile", - "thiserror 1.0.69", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" -dependencies = [ - "chrono", - "ethers-core", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.7", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http 0.2.12", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" -dependencies = [ - "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core", - "glob", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver 1.0.26", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror 1.0.69", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "ethnum" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fhe" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "doc-comment", - "fhe-math", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-traits", - "prost 0.12.6", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "thiserror 1.0.69", - "zeroize", - "zeroize_derive", -] - -[[package]] -name = "fhe-math" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "ethnum", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-bigint-dig", - "num-traits", - "prost 0.12.6", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sha2", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "fhe-traits" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "fhe-util" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "itertools 0.12.1", - "num-bigint-dig", - "num-traits", - "prime_factorization", - "rand 0.8.5", - "rayon", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" -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 = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[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 = "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.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.9.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - -[[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.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.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.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -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 = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.3.1", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http 1.3.1", - "hyper 1.6.0", - "hyper-util", - "rustls 0.23.27", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.2", - "tower-service", - "webpki-roots 0.26.11", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.6.0", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "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 = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.3", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi 0.5.1", - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.2", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.7", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lalrpop" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" -dependencies = [ - "ascii-canvas", - "bit-set 0.5.3", - "ena", - "itertools 0.11.0", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.8.5", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", - "walkdir", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" -dependencies = [ - "regex-automata 0.4.9", -] - -[[package]] -name = "lazy-regex" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.101", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "lean-imt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" -dependencies = [ - "hashbrown 0.15.3", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.0", - "libc", -] - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "num-bigint", - "thiserror 1.0.69", -] - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "lru" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" -dependencies = [ - "hashbrown 0.15.3", -] - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -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 = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[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.101", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "methods" -version = "0.1.0" -dependencies = [ - "hex", - "risc0-build", - "risc0-build-ethereum", - "risc0-zkp", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "no_std_strings" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" - -[[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" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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", - "serde", - "smallvec", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[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.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl" -version = "0.10.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" -dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "foreign-types 0.3.2", - "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.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parity-scale-codec" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.9.0", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "postcard" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy 0.8.25", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn 2.0.101", -] - -[[package]] -name = "prime_factorization" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" -dependencies = [ - "itertools 0.10.5", - "num", - "rand 0.8.5", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" -dependencies = [ - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.8.5", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive 0.12.6", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck 0.5.0", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost 0.12.6", - "prost-types", - "regex", - "syn 2.0.101", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost 0.12.6", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quinn" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.27", - "socket2", - "thiserror 2.0.12", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" -dependencies = [ - "bytes", - "getrandom 0.3.2", - "rand 0.9.1", - "ring 0.17.14", - "rustc-hash", - "rustls 0.23.27", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[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_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[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 = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.5", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.27", - "rustls-pemfile 2.2.0", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tokio-native-tls", - "tokio-rustls 0.26.2", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.11", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[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 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[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 = "risc0-binfmt" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" -dependencies = [ - "anyhow", - "borsh", - "derive_more 2.0.1", - "elf", - "lazy_static", - "postcard", - "risc0-zkp", - "risc0-zkvm-platform", - "semver 1.0.26", - "serde", - "tracing", -] - -[[package]] -name = "risc0-build" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" -dependencies = [ - "anyhow", - "cargo_metadata 0.19.2", - "derive_builder", - "dirs", - "docker-generate", - "hex", - "risc0-binfmt", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rzup", - "semver 1.0.26", - "serde", - "serde_json", - "stability", - "tempfile", -] - -[[package]] -name = "risc0-build-ethereum" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "risc0-build", - "risc0-zkp", - "risc0-zkvm", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt", - "risc0-circuit-recursion", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" -dependencies = [ - "anyhow", - "bit-vec 0.8.0", - "bytemuck", - "derive_more 2.0.1", - "paste", - "risc0-binfmt", - "risc0-core", - "risc0-zkp", - "serde", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core 0.6.4", -] - -[[package]] -name = "risc0-ethereum-contracts" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" -dependencies = [ - "alloy", - "alloy-sol-types 0.8.25", - "anyhow", - "cfg-if", - "risc0-zkvm", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "risc0-groth16" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" -dependencies = [ - "anyhow", - "ark-bn254 0.5.0", - "ark-ec 0.5.0", - "ark-groth16", - "ark-serialize 0.5.0", - "bytemuck", - "hex", - "num-bigint", - "num-traits", - "risc0-binfmt", - "risc0-zkp", - "serde", - "stability", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkp" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" -dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest 0.10.7", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core 0.6.4", - "risc0-core", - "risc0-zkvm-platform", - "serde", - "sha2", - "stability", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" -dependencies = [ - "anyhow", - "bincode", - "bonsai-sdk", - "borsh", - "bytemuck", - "bytes", - "derive_more 2.0.1", - "getrandom 0.2.16", - "hex", - "lazy-regex", - "prost 0.13.5", - "risc0-binfmt", - "risc0-build", - "risc0-circuit-keccak", - "risc0-circuit-recursion", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-groth16", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rrs-lib", - "rzup", - "semver 1.0.26", - "serde", - "sha2", - "stability", - "tempfile", - "tracing", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" -dependencies = [ - "bytemuck", - "cfg-if", - "getrandom 0.2.16", - "getrandom 0.3.2", - "libm", - "stability", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rrs-lib" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" -dependencies = [ - "downcast-rs", - "paste", -] - -[[package]] -name = "ruint" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.1", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[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.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.26", -] - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" -dependencies = [ - "once_cell", - "ring 0.17.14", - "rustls-pki-types", - "rustls-webpki 0.103.2", - "subtle", - "zeroize", -] - -[[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 = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" -dependencies = [ - "ring 0.17.14", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "rzup" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" -dependencies = [ - "semver 1.0.26", - "serde", - "strum 0.26.3", - "tempfile", - "thiserror 2.0.12", - "toml", - "yaml-rust2", -] - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[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 = "scale-info" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" -dependencies = [ - "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[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.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.9.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "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 = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[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 = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -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 = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.12", - "time", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "solang-parser" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" -dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "svm-rs" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "sha2", - "thiserror 1.0.69", - "url", - "zip", -] - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3d0961cd53c23ea94eeec56ba940f636f6394788976e9f16ca5ee0aca7464a" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "syn-solidity" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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 = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -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.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls 0.23.27", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite", - "webpki-roots 0.25.4", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap 2.9.0", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -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 = [ - "futures", - "futures-task", - "pin-project", - "tracing", -] - -[[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-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[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 = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.16", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "voting-core" -version = "0.1.0" -dependencies = [ - "commons", - "compute-provider", - "fhe", - "fhe-traits", -] - -[[package]] -name = "voting-host" -version = "0.1.0" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-types 0.6.4", - "anyhow", - "bincode", - "bytemuck", - "clap", - "compute-provider", - "env_logger", - "ethers", - "fhe", - "fhe-traits", - "fhe-util", - "log", - "methods", - "rand 0.8.5", - "risc0-ethereum-contracts", - "risc0-zkvm", - "serde", - "tokio", - "tracing-subscriber 0.3.19", - "voting-core", -] - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" -dependencies = [ - "rustls-pki-types", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings 0.4.0", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" -dependencies = [ - "windows-link", -] - -[[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.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper 0.6.0", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yaml-rust2" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.101", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/examples/CRISP/apps/program/host/README.md b/examples/CRISP/apps/program/host/README.md new file mode 100644 index 0000000000..7dd618f26a --- /dev/null +++ b/examples/CRISP/apps/program/host/README.md @@ -0,0 +1,3 @@ +# Risc0 Host + +Exposes a function to run the computation found in `voting-core::fhe_processor` whilst also generating a risc0 proof assuming `risc0_dev_mode` is _not_ set. diff --git a/examples/CRISP/apps/program/methods/Cargo.lock b/examples/CRISP/apps/program/methods/Cargo.lock deleted file mode 100644 index 5ba7c8be2f..0000000000 --- a/examples/CRISP/apps/program/methods/Cargo.lock +++ /dev/null @@ -1,4107 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy-primitives" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600d34d8de81e23b6d909c094e23b3d357e01ca36b78a8c5424c501eedbe86f0" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 0.99.20", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-primitives" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 2.0.1", - "foldhash", - "hashbrown 0.15.3", - "indexmap", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.8.5", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" -dependencies = [ - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86ec0a47740b20bc5613b8712d0d321d031c4efc58e9645af96085d5cccfc27" -dependencies = [ - "const-hex", - "dunce", - "heck 0.4.1", - "indexmap", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-types" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad09ec5853fa700d12d778ad224dcdec636af424d29fad84fb9a2f16a5b0ef09" -dependencies = [ - "alloy-primitives 0.6.4", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-crypto-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" -dependencies = [ - "ahash", - "ark-crypto-primitives-macros", - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-snark", - "ark-std 0.5.0", - "blake2", - "derivative", - "digest 0.10.7", - "fnv", - "merlin", - "sha2", -] - -[[package]] -name = "ark-crypto-primitives-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-groth16" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" -dependencies = [ - "ark-crypto-primitives", - "ark-ec", - "ark-ff 0.5.0", - "ark-poly", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-snark" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" -dependencies = [ - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arraydeque" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[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.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bonsai-sdk" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" -dependencies = [ - "duplicate", - "maybe-async", - "reqwest", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "cc" -version = "1.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" -dependencies = [ - "shlex", -] - -[[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.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "const-hex" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.101", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.101", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "docker-generate" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "duplicate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", - "foldhash", -] - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[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 = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 0.26.11", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.3", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy-regex" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.101", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.0", - "libc", -] - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[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.101", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "methods" -version = "0.1.0" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-types", - "hex", - "risc0-build", - "risc0-build-ethereum", - "risc0-zkp", - "risc0-zkvm", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "no_std_strings" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parity-scale-codec" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "postcard" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy 0.8.25", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.9.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quinn" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.12", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" -dependencies = [ - "bytes", - "getrandom 0.3.2", - "rand 0.9.1", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[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_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[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 = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.11", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "risc0-binfmt" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" -dependencies = [ - "anyhow", - "borsh", - "derive_more 2.0.1", - "elf", - "lazy_static", - "postcard", - "risc0-zkp", - "risc0-zkvm-platform", - "semver 1.0.26", - "serde", - "tracing", -] - -[[package]] -name = "risc0-build" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" -dependencies = [ - "anyhow", - "cargo_metadata", - "derive_builder", - "dirs", - "docker-generate", - "hex", - "risc0-binfmt", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rzup", - "semver 1.0.26", - "serde", - "serde_json", - "stability", - "tempfile", -] - -[[package]] -name = "risc0-build-ethereum" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "risc0-build", - "risc0-zkp", - "risc0-zkvm", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt", - "risc0-circuit-recursion", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" -dependencies = [ - "anyhow", - "bit-vec", - "bytemuck", - "derive_more 2.0.1", - "paste", - "risc0-binfmt", - "risc0-core", - "risc0-zkp", - "serde", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core 0.6.4", -] - -[[package]] -name = "risc0-groth16" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" -dependencies = [ - "anyhow", - "ark-bn254", - "ark-ec", - "ark-groth16", - "ark-serialize 0.5.0", - "bytemuck", - "hex", - "num-bigint", - "num-traits", - "risc0-binfmt", - "risc0-zkp", - "serde", - "stability", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkp" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" -dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest 0.10.7", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core 0.6.4", - "risc0-core", - "risc0-zkvm-platform", - "serde", - "sha2", - "stability", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" -dependencies = [ - "anyhow", - "bincode", - "bonsai-sdk", - "borsh", - "bytemuck", - "bytes", - "derive_more 2.0.1", - "getrandom 0.2.16", - "hex", - "lazy-regex", - "prost", - "risc0-binfmt", - "risc0-build", - "risc0-circuit-keccak", - "risc0-circuit-recursion", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-groth16", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rrs-lib", - "rzup", - "semver 1.0.26", - "serde", - "sha2", - "stability", - "tempfile", - "tracing", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" -dependencies = [ - "bytemuck", - "cfg-if", - "getrandom 0.2.16", - "getrandom 0.3.2", - "libm", - "stability", -] - -[[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 = "rrs-lib" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" -dependencies = [ - "downcast-rs", - "paste", -] - -[[package]] -name = "ruint" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.1", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[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.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.26", -] - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "rzup" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" -dependencies = [ - "semver 1.0.26", - "serde", - "strum", - "tempfile", - "thiserror 2.0.12", - "toml", - "yaml-rust2", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[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 = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "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 = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[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 = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" - -[[package]] -name = "socket2" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3d0961cd53c23ea94eeec56ba940f636f6394788976e9f16ca5ee0aca7464a" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -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.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[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 = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - -[[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.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yaml-rust2" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.101", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 711878f91d..5aa20e457c 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -31,9 +31,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -43,31 +43,36 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 1.0.0", - "hex-literal", + "derive_more", + "foldhash", + "hashbrown 0.15.2", + "indexmap", "itoa", "k256", "keccak-asm", + "paste", "proptest", "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-rlp" -version = "0.3.5" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ "arrayvec", "bytes", @@ -75,9 +80,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.13" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0279d09463a4695788a3622fd95443625f7be307422deba4b55dd491a9c7a1" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -89,9 +94,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.13" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4feea540fc8233df2ad1156efd744b2075372f43a8f942a68b3b19c8a00e2c12" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -107,13 +112,14 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.13" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0ad281f3d1b613af814b66977ee698e443d4644a1510962d0241f26e0e53ae" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" dependencies = [ "const-hex", "dunce", "heck", + "macro-string", "proc-macro2", "quote", "syn 2.0.98", @@ -132,9 +138,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -713,9 +719,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.98" +version = "1.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -735,15 +744,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "compute-provider" version = "0.1.0" @@ -762,9 +762,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" dependencies = [ "cfg-if", "cpufeatures", @@ -889,34 +889,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -1039,6 +1018,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe", + "fhe-traits", +] + [[package]] name = "enum-ordinalize" version = "4.3.0" @@ -1303,12 +1291,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.2" @@ -1318,6 +1300,7 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash", + "serde", ] [[package]] @@ -1378,12 +1361,13 @@ checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" [[package]] name = "indexmap" -version = "2.2.6" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", + "serde", ] [[package]] @@ -1471,9 +1455,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" @@ -1505,6 +1489,17 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1950,6 +1945,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -2053,7 +2049,7 @@ checksum = "0f147f96a8a3058e699a5d39fc7e59d982f633751543ff4437cc0fb21f40b2e0" dependencies = [ "anyhow", "borsh", - "derive_more 2.0.1", + "derive_more", "elf", "lazy_static", "postcard", @@ -2104,7 +2100,7 @@ dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more 2.0.1", + "derive_more", "paste", "risc0-binfmt", "risc0-core", @@ -2189,7 +2185,7 @@ dependencies = [ "anyhow", "borsh", "bytemuck", - "derive_more 2.0.1", + "derive_more", "getrandom", "hex", "risc0-binfmt", @@ -2274,6 +2270,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -2433,6 +2435,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "2.2.0" @@ -2685,8 +2693,8 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" name = "voting-core" version = "0.1.0" dependencies = [ - "commons", "compute-provider", + "enclave-sdk-isomorphic", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 23c78cce72..732d55c887 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -2206,15 +2206,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "compute-provider" version = "0.1.0" @@ -2414,11 +2405,12 @@ dependencies = [ "bincode", "chrono", "clap", - "commons", "compute-provider", "config", "dialoguer", "dotenvy", + "enclave-sdk", + "enclave-sdk-isomorphic", "env_logger", "eyre", "fhe", @@ -2849,6 +2841,26 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "enclave-sdk" +version = "0.1.0" +dependencies = [ + "alloy 0.8.3", + "anyhow", + "eyre", + "fhe", + "fhe-traits", +] + +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe", + "fhe-traits", +] + [[package]] name = "encode_unicode" version = "1.0.0" @@ -6760,8 +6772,8 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" name = "voting-core" version = "0.1.0" dependencies = [ - "commons", "compute-provider", + "enclave-sdk-isomorphic", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index 5edb1bd1b1..667f6dd8c6 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -26,7 +26,7 @@ tokio = "1.38" futures = "0.3.30" # Cryptography and blockchain -alloy = { version = "0.8", features = ["full", "rpc-types-eth"] } +alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } @@ -38,6 +38,7 @@ sha2 = "0.10.8" # Local dependencies compute-provider = { path = "../../../../packages/compute_provider" } enclave-sdk = { path = "../../../../packages/enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../../../packages/enclave-sdk-isomorphic" } voting-host = { path = "../program/host" } # CLI and user interaction diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index a36fde5f4c..f3a8fea3a8 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -6,8 +6,11 @@ use serde::{Deserialize, Serialize}; use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; -use crisp::server::blockchain::relayer::EnclaveContract; -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use crisp::server::config::CONFIG as SERVER_CONFIG; // TODO: unify configuration +use enclave_sdk::evm::contracts::EnclaveContract; +use enclave_sdk_isomorphic::bfv::{ + build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1, +}; use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, @@ -44,7 +47,12 @@ struct CTRequest { pub async fn initialize_crisp_round() -> Result<(), Box> { info!("Starting new CRISP round!"); - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await?; + let contract = EnclaveContract::new( + &SERVER_CONFIG.http_rpc_url, + &SERVER_CONFIG.private_key, + &SERVER_CONFIG.enclave_address, + ) + .await?; let e3_program: Address = CONFIG.e3_program_address.parse()?; info!("Enabling E3 Program..."); @@ -100,7 +108,12 @@ pub async fn activate_e3_round() -> Result<(), Box::try_decode(&pt, Encoding::poly())?[0]; info!("Vote count: {:?}", votes); - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await?; + let contract = EnclaveContract::new( + &SERVER_CONFIG.http_rpc_url, + &SERVER_CONFIG.private_key, + &SERVER_CONFIG.enclave_address, + ) + .await?; let res = contract .publish_plaintext_output(U256::from(input_crisp_id), Bytes::from(votes.to_be_bytes())) .await?; diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index b43c91adad..2652f12a6e 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -1,9 +1,6 @@ -use super::{ - events::{ - CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, - PlaintextOutputPublished, - }, - relayer::EnclaveContract, +use super::events::{ + CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, + PlaintextOutputPublished, }; use crate::server::{ config::CONFIG, @@ -12,6 +9,7 @@ use crate::server::{ }; use chrono::Utc; use compute_provider::FHEInputs; +use enclave_sdk::evm::contracts::EnclaveContract; use log::info; use std::error::Error; use std::time::{Duration, SystemTime, UNIX_EPOCH}; @@ -25,7 +23,12 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { info!("Handling E3 request with id {}", e3_id); // Fetch E3 from the contract - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await?; + let contract = EnclaveContract::new( + &CONFIG.http_rpc_url, + &CONFIG.private_key, + &CONFIG.enclave_address, + ) + .await?; let e3 = contract.get_e3(e3_activated.e3Id).await?; info!("Fetched E3 from the contract."); @@ -194,7 +197,13 @@ pub async fn handle_committee_published(committee_published: CommitteePublished) committee_published.e3Id ); - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await?; + let contract = EnclaveContract::new( + &CONFIG.http_rpc_url, + &CONFIG.private_key, + &CONFIG.enclave_address, + ) + .await?; + let tx = contract .activate(committee_published.e3Id, committee_published.publicKey) .await?; diff --git a/examples/CRISP/apps/server/src/server/blockchain/mod.rs b/examples/CRISP/apps/server/src/server/blockchain/mod.rs index 0d017d32fb..a2cce8ccb0 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/mod.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/mod.rs @@ -1,5 +1,4 @@ pub mod events; pub mod handlers; pub mod listener; -pub mod relayer; pub mod sync; diff --git a/examples/CRISP/apps/server/src/server/blockchain/sync.rs b/examples/CRISP/apps/server/src/server/blockchain/sync.rs index c0590529a2..11c14f2f80 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/sync.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/sync.rs @@ -1,7 +1,5 @@ use super::events::InputPublished; -use super::relayer::E3 as ContractE3; use crate::server::{ - blockchain::relayer::EnclaveContract, config::CONFIG, database::{generate_emoji, get_e3, update_e3_status, GLOBAL_DB}, models::{CurrentRound, E3}, @@ -13,6 +11,7 @@ use alloy::{ sol_types::SolEvent, }; use compute_provider::FHEInputs; +use enclave_sdk::evm::contracts::{EnclaveContract, E3 as ContractE3}; use futures::future::join_all; use log::{error, info, warn}; use std::{ @@ -29,7 +28,15 @@ use voting_host::run_compute; type Result = std::result::Result>; pub async fn sync_server() -> Result<()> { info!("Starting server synchronization..."); - let contract = Arc::new(EnclaveContract::new(CONFIG.enclave_address.clone()).await?); + + let contract = Arc::new( + EnclaveContract::new( + &CONFIG.http_rpc_url, + &CONFIG.private_key, + &CONFIG.enclave_address, + ) + .await?, + ); // Retrieve the current round from the database. let current_round = match GLOBAL_DB.get::("e3:current_round").await? { diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index 89bf45b184..fa7cf78df6 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -1,5 +1,5 @@ pub mod blockchain; -mod config; +pub mod config; mod database; mod models; mod routes; diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index e4939c4061..31341a7f1f 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -1,4 +1,3 @@ -use crate::server::blockchain::relayer::EnclaveContract; use crate::server::config::CONFIG; use crate::server::database::get_e3; use crate::server::models::{ @@ -8,7 +7,8 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use enclave_sdk::evm::contracts::EnclaveContract; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { @@ -115,8 +115,12 @@ async fn get_public_key(data: web::Json) -> impl Responder { /// * A result indicating the success of the operation pub async fn initialize_crisp_round() -> Result<(), Box> { info!("Starting new CRISP round!"); - - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await?; + let contract = EnclaveContract::new( + &CONFIG.http_rpc_url, + &CONFIG.private_key, + &CONFIG.enclave_address, + ) + .await?; let e3_program: Address = CONFIG.e3_program_address.parse()?; // Enable E3 Program diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index 376925426a..34cfa3fe57 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -1,16 +1,16 @@ +use crate::server::{ + config::CONFIG, + database::{get_e3, GLOBAL_DB}, + models::{EncryptedVote, VoteResponse, VoteResponseStatus, E3}, +}; use actix_web::{web, HttpResponse, Responder}; -use log::info; use alloy::{ dyn_abi::DynSolValue, primitives::{Bytes, U256}, }; +use enclave_sdk::evm::contracts::EnclaveContract; use eyre::Error; -use crate::server::{ - blockchain::relayer::EnclaveContract, - config::CONFIG, - database::{get_e3, GLOBAL_DB}, - models::{EncryptedVote, VoteResponse, VoteResponseStatus, E3}, -}; +use log::info; pub fn setup_routes(config: &mut web::ServiceConfig) { config.service( @@ -46,7 +46,14 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon let encoded_params = Bytes::from(params_value.abi_encode_params()); // Broadcast vote to blockchain - let contract = EnclaveContract::new(CONFIG.enclave_address.clone()).await.unwrap(); + let contract = EnclaveContract::new( + &CONFIG.http_rpc_url, + &CONFIG.private_key, + &CONFIG.enclave_address, + ) + .await + .unwrap(); + match contract.publish_input(e3_id, encoded_params).await { Ok(hash) => HttpResponse::Ok().json(VoteResponse { status: VoteResponseStatus::Success, diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index fe7f2a601b..2f9737c1fa 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -386,15 +386,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "console" version = "0.15.8" @@ -430,9 +421,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.3" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" dependencies = [ "cfg-if", "cpufeatures", @@ -492,9 +483,9 @@ name = "crisp-wasm-crypto" version = "0.1.0" dependencies = [ "bincode", - "commons", "console", "console_log", + "enclave-sdk-isomorphic", "ethers", "fhe", "fhe-math", @@ -727,6 +718,15 @@ dependencies = [ "log", ] +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe", + "fhe-traits", +] + [[package]] name = "encode_unicode" version = "0.3.6" @@ -1447,9 +1447,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "hashers" @@ -1630,9 +1630,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.2.6" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown", @@ -1791,9 +1791,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" @@ -2097,9 +2097,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3386,9 +3386,9 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index 8c548853fe..65d392614c 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -enclave-sdk = { path = "../../../../packages/enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../../../packages/enclave-sdk-isomorphic" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index 89f9ab0a76..e5ff8b5f8d 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -2,7 +2,7 @@ mod greco; mod util; use console_log; -use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; use rand::thread_rng; diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 606746be3c..4c706b7804 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix" @@ -291,15 +291,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.16", + "getrandom 0.3.2", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -1797,15 +1797,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe 0.1.0-beta.7", - "fhe-traits", -] - [[package]] name = "compile-time" version = "0.2.0" @@ -2428,6 +2419,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe 0.1.0-beta.7", + "fhe-traits", +] + [[package]] name = "enclave_core" version = "0.1.0" @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature/greco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" dependencies = [ "doc-comment", "fhe-math", @@ -2654,10 +2654,10 @@ dependencies = [ "anyhow", "async-trait", "bincode", - "commons", "config", "data", "e3_request", + "enclave-sdk-isomorphic", "events", "fhe 0.1.0-beta.7", "fhe-traits", @@ -2670,7 +2670,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature/greco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" dependencies = [ "ethnum", "fhe-traits", @@ -2692,7 +2692,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature/greco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" dependencies = [ "rand 0.8.5", ] @@ -2700,7 +2700,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature/greco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" dependencies = [ "itertools 0.12.1", "num-bigint-dig", @@ -5200,7 +5200,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] @@ -6510,7 +6510,7 @@ dependencies = [ "actix", "bincode", "clap", - "commons", + "enclave-sdk-isomorphic", "events", "fhe 0.1.0", "fhe 0.1.0-beta.7", @@ -6533,10 +6533,10 @@ dependencies = [ "base64", "bincode", "clap", - "commons", "crypto", "data", "e3_request", + "enclave-sdk-isomorphic", "events", "evm", "fhe 0.1.0", @@ -7719,33 +7719,13 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 3ce3bd65e1..ac5468b8e4 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -44,7 +44,7 @@ tests = { path = "./tests" } actix = "0.13.5" actix-web = "4.10.2" aes-gcm = "0.10.3" -alloy = { version = "0.8", features = ["node-bindings", "full"] } +alloy = { version = "0.8.3", features = ["node-bindings", "full"] } alloy-primitives = { version = "0.8", default-features = false, features = [ "rlp", "serde", diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 6d1358665f..01da2180ea 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -45,6 +45,7 @@ COPY ./packages/ciphernode/rust-toolchain.toml . # Copy enclave-sdk package COPY ./packages/enclave-sdk ../enclave-sdk +COPY ./packages/enclave-sdk-isomorphic ../enclave-sdk-isomorphic RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 84ad02ee5f..242b82db44 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -18,4 +18,4 @@ rand = { workspace = true } rand_chacha = { workspace = true } e3_request = { workspace = true } serde = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } diff --git a/packages/ciphernode/fhe/src/utils.rs b/packages/ciphernode/fhe/src/utils.rs index fcca593899..7aa259fa84 100644 --- a/packages/ciphernode/fhe/src/utils.rs +++ b/packages/ciphernode/fhe/src/utils.rs @@ -1,5 +1,5 @@ use super::SharedRng; -use enclave_sdk::bfv::build_bfv_params_arc; +use enclave_sdk_isomorphic::bfv::build_bfv_params_arc; use fhe_rs::bfv::BfvParameters; use fhe_rs::mbfv::CommonRandomPoly; use fhe_traits::Serialize; diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index 22bdad5ccc..4584a1ba54 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -14,4 +14,4 @@ fhe-traits = { workspace = true } rand_chacha = { workspace = true } rand = { workspace = true } tracing = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } diff --git a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs index 27c16f5634..af3bc26a49 100644 --- a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs +++ b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs @@ -1,6 +1,6 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; diff --git a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs index 26d4ba3a45..1326387dae 100644 --- a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs +++ b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs @@ -1,5 +1,5 @@ use clap::{command, Parser}; -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params}; +use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, encode_bfv_params}; use std::{error::Error, num::ParseIntError, process}; fn parse_hex(arg: &str) -> Result { diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index 5de1edba00..143d380aa8 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -30,4 +30,4 @@ bincode = { workspace = true } base64 = { workspace = true } actix = { workspace = true } anyhow = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index 2ddfe019e9..ad11e18d0e 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -6,7 +6,7 @@ use crypto::Cipher; use data::RepositoriesFactory; use data::{DataStore, InMemStore}; use e3_request::E3Router; -use enclave_sdk::bfv::params::SET_2048_1032193_1; +use enclave_sdk_isomorphic::bfv::params::SET_2048_1032193_1; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, GetErrors, diff --git a/examples/CRISP/apps/program/core/Cargo.lock b/packages/enclave-sdk-isomorphic/Cargo.lock similarity index 76% rename from examples/CRISP/apps/program/core/Cargo.lock rename to packages/enclave-sdk-isomorphic/Cargo.lock index fbf6b18406..e4cc9a4acc 100644 --- a/examples/CRISP/apps/program/core/Cargo.lock +++ b/packages/enclave-sdk-isomorphic/Cargo.lock @@ -2,18 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -23,135 +11,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "anyhow" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools 0.10.5", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand", -] - [[package]] name = "autocfg" version = "1.4.0" @@ -191,31 +56,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "commons" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-ff", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -260,17 +100,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "digest" version = "0.10.7" @@ -293,6 +122,15 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +dependencies = [ + "anyhow", + "fhe", + "fhe-traits", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -393,12 +231,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "generic-array" version = "0.14.7" @@ -434,23 +266,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -458,12 +276,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "indexmap" version = "2.9.0" @@ -471,7 +283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown", ] [[package]] @@ -492,15 +304,6 @@ dependencies = [ "either", ] -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -510,15 +313,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lean-imt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "libc" version = "0.2.172" @@ -527,21 +321,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" - -[[package]] -name = "light-poseidon" -version = "0.2.0" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254", - "ark-ff", - "num-bigint", - "thiserror", -] +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" [[package]] name = "linux-raw-sys" @@ -686,12 +468,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "petgraph" version = "0.6.5" @@ -708,7 +484,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] @@ -718,7 +494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn", ] [[package]] @@ -768,7 +544,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.101", + "syn", "tempfile", ] @@ -782,7 +558,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -894,20 +670,11 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags", "errno", @@ -916,12 +683,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" - [[package]] name = "serde" version = "1.0.219" @@ -939,7 +700,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -953,16 +714,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - [[package]] name = "smallvec" version = "1.15.0" @@ -975,17 +726,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[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.101" @@ -1027,7 +767,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1048,16 +788,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "voting-core" -version = "0.1.0" -dependencies = [ - "commons", - "compute-provider", - "fhe", - "fhe-traits", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1155,33 +885,13 @@ dependencies = [ "bitflags", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] @@ -1192,7 +902,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1200,9 +910,6 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] [[package]] name = "zeroize_derive" @@ -1212,5 +919,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] diff --git a/packages/enclave-sdk-isomorphic/Cargo.toml b/packages/enclave-sdk-isomorphic/Cargo.toml new file mode 100644 index 0000000000..0a17c28131 --- /dev/null +++ b/packages/enclave-sdk-isomorphic/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "enclave-sdk-isomorphic" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } + diff --git a/packages/enclave-sdk/src/bfv/mod.rs b/packages/enclave-sdk-isomorphic/src/bfv/mod.rs similarity index 100% rename from packages/enclave-sdk/src/bfv/mod.rs rename to packages/enclave-sdk-isomorphic/src/bfv/mod.rs diff --git a/packages/enclave-sdk-isomorphic/src/lib.rs b/packages/enclave-sdk-isomorphic/src/lib.rs new file mode 100644 index 0000000000..5e4e17e4fd --- /dev/null +++ b/packages/enclave-sdk-isomorphic/src/lib.rs @@ -0,0 +1 @@ +pub mod bfv; diff --git a/packages/enclave-sdk/Cargo.lock b/packages/enclave-sdk/Cargo.lock index 23659a86dc..2a62c54c49 100644 --- a/packages/enclave-sdk/Cargo.lock +++ b/packages/enclave-sdk/Cargo.lock @@ -2,6 +2,34 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.2", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -12,795 +40,3980 @@ dependencies = [ ] [[package]] -name = "anyhow" -version = "1.0.98" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "autocfg" -version = "1.4.0" +name = "alloy" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] [[package]] -name = "bitflags" -version = "2.9.0" +name = "alloy-chains" +version = "0.1.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "alloy-consensus" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ - "generic-array", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "k256", + "serde", ] [[package]] -name = "byteorder" -version = "1.5.0" +name = "alloy-consensus-any" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] [[package]] -name = "bytes" -version = "1.10.1" +name = "alloy-contract" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.12", +] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "alloy-core" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] [[package]] -name = "commons" +name = "alloy-eip2930" version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "anyhow", - "fhe", - "fhe-traits", + "alloy-primitives", + "alloy-rlp", + "serde", ] [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "alloy-eip7702" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ - "libc", + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "k256", + "serde", ] [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "alloy-eips" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "alloy-genesis" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" dependencies = [ - "crossbeam-utils", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "alloy-json-abi" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "alloy-json-rpc" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ - "generic-array", - "typenum", + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", ] [[package]] -name = "digest" -version = "0.10.7" +name = "alloy-network" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" dependencies = [ - "block-buffer", - "crypto-common", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", ] [[package]] -name = "doc-comment" -version = "0.3.3" +name = "alloy-network-primitives" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] [[package]] -name = "either" -version = "1.15.0" +name = "alloy-primitives" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.2", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] [[package]] -name = "equivalent" -version = "1.0.2" +name = "alloy-provider" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] [[package]] -name = "errno" -version = "0.3.11" +name = "alloy-pubsub" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" dependencies = [ - "libc", - "windows-sys", + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", ] [[package]] -name = "ethnum" -version = "1.5.1" +name = "alloy-rlp" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] [[package]] -name = "fastrand" -version = "2.3.0" +name = "alloy-rlp-derive" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] [[package]] -name = "fhe" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ - "doc-comment", - "fhe-math", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-traits", - "prost", - "prost-build", - "rand", - "rand_chacha", + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", "serde", - "thiserror", - "zeroize", - "zeroize_derive", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", ] [[package]] -name = "fhe-math" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +name = "alloy-rpc-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ - "ethnum", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-bigint-dig", - "num-traits", - "prost", - "prost-build", - "rand", - "rand_chacha", - "sha2", - "thiserror", - "zeroize", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", ] [[package]] -name = "fhe-traits" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" dependencies = [ - "rand", + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", ] [[package]] -name = "fhe-util" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +name = "alloy-rpc-types-engine" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" dependencies = [ - "itertools 0.12.1", - "num-bigint-dig", - "num-traits", - "prime_factorization", - "rand", - "rayon", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more 1.0.0", + "serde", + "strum 0.26.3", ] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "alloy-rpc-types-eth" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] [[package]] -name = "generic-array" -version = "0.14.7" +name = "alloy-serde" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" dependencies = [ - "typenum", - "version_check", + "alloy-primitives", + "serde", + "serde_json", ] [[package]] -name = "getrandom" -version = "0.2.16" +name = "alloy-signer" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", ] [[package]] -name = "getrandom" -version = "0.3.2" +name = "alloy-signer-local" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cc" +version = "1.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enclave-sdk" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "eyre", + "fhe", + "fhe-traits", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "ethnum" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fhe" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +dependencies = [ + "doc-comment", + "fhe-math", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "thiserror 1.0.69", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "fhe-math" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +dependencies = [ + "ethnum", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-bigint-dig", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "sha2", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "fhe-traits" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "fhe-util" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +dependencies = [ + "itertools 0.12.1", + "num-bigint-dig", + "num-traits", + "prime_factorization", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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 = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[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 = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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", + "serde", + "smallvec", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "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 = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags", + "cfg-if", + "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.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand 0.8.5", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.101", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[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 = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[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 = "ruint" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "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 = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", ] [[package]] -name = "hashbrown" -version = "0.15.2" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "heck" -version = "0.5.0" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] -name = "indexmap" -version = "2.9.0" +name = "syn" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ - "equivalent", - "hashbrown", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "syn-solidity" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" dependencies = [ - "either", + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "itertools" -version = "0.12.1" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "either", + "futures-core", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "spin", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "libc" -version = "0.2.172" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] -name = "libm" -version = "0.2.13" +name = "tempfile" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] [[package]] -name = "linux-raw-sys" -version = "0.9.4" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] [[package]] -name = "log" -version = "0.4.27" +name = "thiserror" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] [[package]] -name = "matrixmultiply" -version = "0.3.9" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "autocfg", - "rawpointer", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "thiserror-impl" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] [[package]] -name = "multimap" -version = "0.10.0" +name = "threadpool" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] [[package]] -name = "ndarray" -version = "0.15.6" +name = "tiny-keccak" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", + "crunchy", ] [[package]] -name = "num" -version = "0.4.3" +name = "tinystr" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", + "displaydoc", + "zerovec", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "tokio" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ - "num-integer", - "num-traits", + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", ] [[package]] -name = "num-bigint-dig" -version = "0.8.4" +name = "tokio-macros" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "serde", - "smallvec", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "num-complex" -version = "0.4.6" +name = "tokio-native-tls" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "num-traits", + "native-tls", + "tokio", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "tokio-rustls" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "num-traits", + "rustls", + "tokio", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "tokio-stream" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", ] [[package]] -name = "num-rational" -version = "0.4.2" +name = "tokio-tungstenite" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "tokio-util" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ - "autocfg", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "toml_datetime" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" [[package]] -name = "petgraph" -version = "0.6.5" +name = "toml_edit" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "fixedbitset", "indexmap", + "toml_datetime", + "winnow", ] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "tower" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ - "zerocopy", + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", ] [[package]] -name = "prettyplease" -version = "0.2.32" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] -name = "prime_factorization" -version = "1.0.5" +name = "tower-service" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "itertools 0.10.5", - "num", - "rand", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "proc-macro2" -version = "1.0.95" +name = "tracing-attributes" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "unicode-ident", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "prost" -version = "0.12.6" +name = "tracing-core" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ - "bytes", - "prost-derive", + "once_cell", ] [[package]] -name = "prost-build" -version = "0.12.6" +name = "try-lock" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ + "byteorder", "bytes", - "heck", - "itertools 0.12.1", + "data-encoding", + "http", + "httparse", "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn", - "tempfile", + "rand 0.8.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 1.0.69", + "utf-8", ] [[package]] -name = "prost-derive" -version = "0.12.6" +name = "typenum" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn", -] +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] -name = "prost-types" -version = "0.12.6" +name = "ucd-trie" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] -name = "quote" -version = "1.0.40" +name = "uint" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ - "proc-macro2", + "byteorder", + "crunchy", + "hex", + "static_assertions", ] [[package]] -name = "r-efi" -version = "5.2.0" +name = "unarray" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "rand" -version = "0.8.5" +name = "url" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ - "libc", - "rand_chacha", - "rand_core", + "form_urlencoded", + "idna", + "percent-encoding", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "utf-8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "rand_core" -version = "0.6.4" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "rawpointer" -version = "0.2.1" +name = "valuable" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] -name = "rayon" -version = "1.10.0" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "rayon-core" -version = "1.12.1" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "regex" -version = "1.11.1" +name = "wait-timeout" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "libc", ] [[package]] -name = "regex-automata" -version = "0.4.9" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "try-lock", ] [[package]] -name = "regex-syntax" -version = "0.8.5" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "rustix" -version = "1.0.5" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", + "wit-bindgen-rt", ] [[package]] -name = "serde" -version = "1.0.219" +name = "wasm-bindgen" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "serde_derive", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", ] [[package]] -name = "serde_derive" -version = "1.0.219" +name = "wasm-bindgen-backend" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ + "bumpalo", + "log", "proc-macro2", "quote", - "syn", + "syn 2.0.101", + "wasm-bindgen-shared", ] [[package]] -name = "sha2" -version = "0.10.9" +name = "wasm-bindgen-futures" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "smallvec" -version = "1.15.0" +name = "wasm-bindgen-macro" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] [[package]] -name = "spin" -version = "0.9.8" +name = "wasm-bindgen-macro-support" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] [[package]] -name = "syn" -version = "2.0.101" +name = "wasm-bindgen-shared" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ - "proc-macro2", - "quote", "unicode-ident", ] [[package]] -name = "tempfile" -version = "3.19.1" +name = "wasmtimer" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys", + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", ] [[package]] -name = "thiserror" -version = "1.0.69" +name = "web-sys" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ - "thiserror-impl", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "thiserror-impl" -version = "1.0.69" +name = "webpki-roots" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "proc-macro2", - "quote", - "syn", + "webpki-roots 1.0.0", ] [[package]] -name = "typenum" -version = "1.18.0" +name = "webpki-roots" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] [[package]] -name = "unicode-ident" -version = "1.0.18" +name = "widestring" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] -name = "version_check" -version = "0.9.5" +name = "windows-link" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "windows-registry" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "windows-result" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" dependencies = [ - "wit-bindgen-rt", + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[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.6", ] [[package]] @@ -809,7 +4022,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -818,14 +4031,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -834,48 +4063,105 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -885,6 +4171,64 @@ dependencies = [ "bitflags", ] +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.25" @@ -902,7 +4246,28 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", ] [[package]] @@ -910,6 +4275,9 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] [[package]] name = "zeroize_derive" @@ -919,5 +4287,38 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml index 18e254686c..df62c2953c 100644 --- a/packages/enclave-sdk/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -3,7 +3,11 @@ name = "enclave-sdk" version = "0.1.0" edition = "2021" +# Core dependencies compatible with everything [dependencies] -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } anyhow = "1.0.86" +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } +eyre = { version = "0.6.12" } + diff --git a/examples/CRISP/apps/server/src/server/blockchain/relayer.rs b/packages/enclave-sdk/src/evm/contracts.rs similarity index 95% rename from examples/CRISP/apps/server/src/server/blockchain/relayer.rs rename to packages/enclave-sdk/src/evm/contracts.rs index d5b41f891b..c2b624d60b 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/relayer.rs +++ b/packages/enclave-sdk/src/evm/contracts.rs @@ -1,4 +1,3 @@ -use crate::server::CONFIG; use alloy::providers::fillers::BlobGasFiller; use alloy::{ network::{Ethereum, EthereumWallet}, @@ -52,7 +51,7 @@ sol! { } } -type CRISPProvider = FillProvider< +pub type CRISPProvider = FillProvider< JoinFill< JoinFill< Identity, @@ -71,13 +70,17 @@ pub struct EnclaveContract { } impl EnclaveContract { - pub async fn new(contract_address: String) -> Result { - let signer: PrivateKeySigner = CONFIG.private_key.parse()?; - let wallet = EthereumWallet::from(signer.clone()); + pub async fn new( + http_rpc_url: &str, + private_key: &str, + contract_address: &str, + ) -> Result { + let signer: PrivateKeySigner = private_key.parse()?; + let wallet = EthereumWallet::from(signer); let provider = ProviderBuilder::new() .with_recommended_fillers() .wallet(wallet) - .on_builtin(&CONFIG.http_rpc_url) + .on_builtin(http_rpc_url) .await?; Ok(Self { diff --git a/packages/enclave-sdk/src/evm/mod.rs b/packages/enclave-sdk/src/evm/mod.rs new file mode 100644 index 0000000000..3f152f8b75 --- /dev/null +++ b/packages/enclave-sdk/src/evm/mod.rs @@ -0,0 +1 @@ +pub mod contracts; diff --git a/packages/enclave-sdk/src/lib.rs b/packages/enclave-sdk/src/lib.rs index 5e4e17e4fd..c469d0c8ed 100644 --- a/packages/enclave-sdk/src/lib.rs +++ b/packages/enclave-sdk/src/lib.rs @@ -1 +1 @@ -pub mod bfv; +pub mod evm; From bf50c4d56e78b5b1001b3cf58b5ed92791a5d712 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Mon, 19 May 2025 15:09:23 +0500 Subject: [PATCH 007/106] Fix E3 Handler Expiration and Wallet Network (#416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix a couple of small bugs * Update examples/CRISP/apps/client/src/providers/Web3Provider.tsx Co-authored-by: гλ * fix: emit correct timestamp * Update EVM Test * Formatting --------- Co-authored-by: гλ --- .../CRISP/apps/client/src/providers/Web3Provider.tsx | 9 +++++---- .../CRISP/apps/server/src/server/blockchain/handlers.rs | 7 ++++--- packages/evm/contracts/Enclave.sol | 6 +++--- packages/evm/test/Enclave.spec.ts | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/examples/CRISP/apps/client/src/providers/Web3Provider.tsx b/examples/CRISP/apps/client/src/providers/Web3Provider.tsx index 1ef0e7291f..0f26bd06fa 100644 --- a/examples/CRISP/apps/client/src/providers/Web3Provider.tsx +++ b/examples/CRISP/apps/client/src/providers/Web3Provider.tsx @@ -25,10 +25,11 @@ const queryClient = new QueryClient() const options = import.meta.env.DEV ? ({ - // NOTE: this ensures that clicking the button doesn't force the change of network which we need for testing - initialChainId: 0, - } as ConnectkitOptions) - : undefined + initialChainId: 0, + } as ConnectkitOptions) + : ({ + initialChainId: sepolia.id, + } as ConnectkitOptions); export const Web3Provider = ({ children }: { children: React.ReactNode }) => { return ( diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index 2652f12a6e..7f098db4ba 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -35,6 +35,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { info!("E3: {:?}", e3); let start_time = Utc::now().timestamp() as u64; + let expiration = e3_activated.expiration.to::(); let e3_obj = E3 { // Identifiers @@ -53,7 +54,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { start_time, block_start: e3.requestBlock.to::(), duration: e3.duration.to::(), - expiration: e3.expiration.to::(), + expiration, // Parameters e3_params: e3.e3ProgramParams.to_vec(), @@ -79,7 +80,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { GLOBAL_DB.insert("e3:current_round", ¤t_round).await?; let expiration = Instant::now() - + (UNIX_EPOCH + Duration::from_secs(e3.expiration.to::())) + + (UNIX_EPOCH + Duration::from_secs(expiration)) .duration_since(SystemTime::now()) .unwrap_or_else(|_| Duration::ZERO); @@ -128,7 +129,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { info!("E3 has no votes to decrypt. Setting status to Finished."); e3.status = "Finished".to_string(); - GLOBAL_DB.insert(&key, &e3_obj).await?; + GLOBAL_DB.insert(&key, &e3).await?; } info!("E3 request handled successfully."); Ok(()) diff --git a/packages/evm/contracts/Enclave.sol b/packages/evm/contracts/Enclave.sol index da2ce7b735..5cdca8b419 100644 --- a/packages/evm/contracts/Enclave.sol +++ b/packages/evm/contracts/Enclave.sol @@ -199,11 +199,11 @@ contract Enclave is IEnclave, OwnableUpgradeable { keccak256(publicKey) == publicKeyHash, CommitteeSelectionFailed() ); - - e3s[e3Id].expiration = block.timestamp + e3.duration; + uint256 expiresAt = block.timestamp + e3.duration; + e3s[e3Id].expiration = expiresAt; e3s[e3Id].committeePublicKey = keccak256(publicKey); - emit E3Activated(e3Id, e3.expiration, publicKey); + emit E3Activated(e3Id, expiresAt, publicKey); return true; } diff --git a/packages/evm/test/Enclave.spec.ts b/packages/evm/test/Enclave.spec.ts index e93cfd9171..000f91812f 100644 --- a/packages/evm/test/Enclave.spec.ts +++ b/packages/evm/test/Enclave.spec.ts @@ -1,3 +1,4 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; import { loadFixture, mine, @@ -823,11 +824,10 @@ describe("Enclave", function () { ); const e3Id = 0; - const e3 = await enclave.getE3(e3Id); await expect(enclave.activate(e3Id, ethers.ZeroHash)) .to.emit(enclave, "E3Activated") - .withArgs(e3Id, e3.expiration, e3.committeePublicKey); + .withArgs(e3Id, anyValue, ethers.ZeroHash); }); }); From 4bcdfa7971296b32d8f1bf66c573c9826ecf42d9 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Mon, 19 May 2025 17:40:42 +0500 Subject: [PATCH 008/106] Add Features to Enclave SDK (#420) --- examples/CRISP/apps/program/core/Cargo.toml | 2 +- packages/enclave-sdk-isomorphic/Cargo.toml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index 47014371b9..1b18484c32 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -7,4 +7,4 @@ edition = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } compute-provider = { path = "../../../../../packages/compute_provider" } -enclave-sdk-isomorphic = { path = "../../../../../packages/enclave-sdk-isomorphic" } +enclave-sdk-isomorphic = { path = "../../../../../packages/enclave-sdk-isomorphic", default-features = false, features = ["guest"] } diff --git a/packages/enclave-sdk-isomorphic/Cargo.toml b/packages/enclave-sdk-isomorphic/Cargo.toml index 0a17c28131..aee4cd8291 100644 --- a/packages/enclave-sdk-isomorphic/Cargo.toml +++ b/packages/enclave-sdk-isomorphic/Cargo.toml @@ -8,3 +8,12 @@ anyhow = "1.0.86" fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +[dependencies.alloy] +version = "0.8.3" +default-features = false +optional = true + +[features] +default = ["host"] +host = ["alloy/full"] +guest = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] \ No newline at end of file From 6d4ae79881e81757a396fd3abbe60200d2daba8d Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Mon, 19 May 2025 18:20:08 +0500 Subject: [PATCH 009/106] Update Deployment files (#421) --- examples/CRISP/apps/program/Cargo.lock | 125 +- .../apps/program/methods/guest/Cargo.lock | 239 ++- examples/CRISP/apps/server/Cargo.lock | 1 + examples/CRISP/apps/wasm-crypto/Cargo.lock | 1648 ++++++++++++++++- packages/ciphernode/Cargo.lock | 1 + .../sepolia/CiphernodeRegistryOwnable.json | 60 +- packages/evm/deployments/sepolia/Enclave.json | 142 +- .../sepolia/NaiveRegistryFilter.json | 46 +- .../1560ab6aa11f44088d4445eb3d74156d.json | 74 + 9 files changed, 2103 insertions(+), 233 deletions(-) create mode 100644 packages/evm/deployments/sepolia/solcInputs/1560ab6aa11f44088d4445eb3d74156d.json diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 11b52bb6fe..ee967b8540 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -44,22 +44,34 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-core", + "alloy-eips 0.8.3", + "alloy-serde 0.8.3", +] + [[package]] name = "alloy" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.12.6", "alloy-contract", "alloy-core", - "alloy-eips", + "alloy-eips 0.12.6", "alloy-genesis", "alloy-network", "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde", + "alloy-serde 0.12.6", "alloy-signer", "alloy-signer-local", "alloy-transport", @@ -77,16 +89,32 @@ dependencies = [ "strum 0.27.1", ] +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "alloy-trie", + "auto_impl", + "derive_more 1.0.0", + "serde", +] + [[package]] name = "alloy-consensus" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" dependencies = [ - "alloy-eips", + "alloy-eips 0.12.6", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.12.6", "alloy-trie", "auto_impl", "c-kzg", @@ -106,11 +134,11 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.12.6", "serde", ] @@ -120,7 +148,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.12.6", "alloy-dyn-abi", "alloy-json-abi", "alloy-network", @@ -189,6 +217,18 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + [[package]] name = "alloy-eip7702" version = "0.5.1" @@ -201,6 +241,23 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702 0.4.2", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "c-kzg", + "derive_more 1.0.0", + "serde", + "sha2", +] + [[package]] name = "alloy-eips" version = "0.12.6" @@ -209,10 +266,10 @@ checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" dependencies = [ "alloy-eip2124", "alloy-eip2930", - "alloy-eip7702", + "alloy-eip7702 0.5.1", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.12.6", "auto_impl", "c-kzg", "derive_more 2.0.1", @@ -228,9 +285,9 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" dependencies = [ - "alloy-eips", + "alloy-eips 0.12.6", "alloy-primitives", - "alloy-serde", + "alloy-serde 0.12.6", "alloy-trie", "serde", ] @@ -267,15 +324,15 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.12.6", "alloy-consensus-any", - "alloy-eips", + "alloy-eips 0.12.6", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-any", "alloy-rpc-types-eth", - "alloy-serde", + "alloy-serde 0.12.6", "alloy-signer", "alloy-sol-types", "async-trait", @@ -293,10 +350,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", "alloy-primitives", - "alloy-serde", + "alloy-serde 0.12.6", "serde", ] @@ -334,8 +391,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" dependencies = [ "alloy-chains", - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", "alloy-json-rpc", "alloy-network", "alloy-network-primitives", @@ -419,7 +476,7 @@ checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde", + "alloy-serde 0.12.6", "serde", ] @@ -431,7 +488,7 @@ checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", - "alloy-serde", + "alloy-serde 0.12.6", ] [[package]] @@ -440,13 +497,13 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.12.6", "alloy-consensus-any", - "alloy-eips", + "alloy-eips 0.12.6", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.12.6", "alloy-sol-types", "itertools 0.14.0", "serde", @@ -454,6 +511,17 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + [[package]] name = "alloy-serde" version = "0.12.6" @@ -486,7 +554,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.12.6", "alloy-network", "alloy-primitives", "alloy-signer", @@ -1867,6 +1935,7 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" name = "enclave-sdk-isomorphic" version = "0.1.0" dependencies = [ + "alloy 0.8.3", "anyhow", "fhe", "fhe-traits", @@ -4046,7 +4115,7 @@ name = "risc0-ethereum-contracts" version = "2.0.0" source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" dependencies = [ - "alloy", + "alloy 0.12.6", "alloy-sol-types", "anyhow", "cfg-if", diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 5aa20e457c..67c76d5f63 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -29,6 +29,101 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-serde", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "serde", + "sha2", +] + [[package]] name = "alloy-json-abi" version = "0.8.25" @@ -51,7 +146,7 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more", + "derive_more 2.0.1", "foldhash", "hashbrown 0.15.2", "indexmap", @@ -74,10 +169,33 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ + "alloy-rlp-derive", "arrayvec", "bytes", ] +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + [[package]] name = "alloy-sol-macro" version = "0.8.25" @@ -149,6 +267,22 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + [[package]] name = "anyhow" version = "1.0.86" @@ -551,6 +685,9 @@ name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] [[package]] name = "auto_impl" @@ -653,6 +790,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "borsh" version = "1.5.5" @@ -717,6 +866,20 @@ dependencies = [ "serde", ] +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "serde", +] + [[package]] name = "cc" version = "1.2.23" @@ -889,13 +1052,33 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -1022,6 +1205,7 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" name = "enclave-sdk-isomorphic" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "fhe", "fhe-traits", @@ -1258,6 +1442,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "group" version = "0.13.0" @@ -1309,6 +1499,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[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" @@ -1668,6 +1864,27 @@ dependencies = [ "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 = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "const-hex", + "serde", + "smallvec", +] + [[package]] name = "objc" version = "0.2.7" @@ -2049,7 +2266,7 @@ checksum = "0f147f96a8a3058e699a5d39fc7e59d982f633751543ff4437cc0fb21f40b2e0" dependencies = [ "anyhow", "borsh", - "derive_more", + "derive_more 2.0.1", "elf", "lazy_static", "postcard", @@ -2100,7 +2317,7 @@ dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more", + "derive_more 2.0.1", "paste", "risc0-binfmt", "risc0-core", @@ -2185,7 +2402,7 @@ dependencies = [ "anyhow", "borsh", "bytemuck", - "derive_more", + "derive_more 2.0.1", "getrandom", "hex", "risc0-binfmt", @@ -2456,6 +2673,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "spin" @@ -2567,6 +2787,15 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "tiny-keccak" version = "2.0.2" diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 732d55c887..ac0407663c 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -2856,6 +2856,7 @@ dependencies = [ name = "enclave-sdk-isomorphic" version = "0.1.0" dependencies = [ + "alloy 0.8.3", "anyhow", "fhe", "fhe-traits", diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 2f9737c1fa..fe119eda99 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -38,6 +38,19 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -47,17 +60,760 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "k256", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "k256", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more 1.0.0", + "serde", + "strum 0.26.2", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-signer-local" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-transport", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.3.1", + "rustls 0.23.27", + "serde_json", + "tokio", + "tokio-tungstenite 0.24.0", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + [[package]] name = "anyhow" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] [[package]] name = "ascii-canvas" @@ -68,6 +824,28 @@ dependencies = [ "term", ] +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "async-trait" version = "0.1.80" @@ -87,7 +865,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -140,6 +918,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -152,6 +936,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bincode" version = "1.3.3" @@ -209,6 +999,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "bs58" version = "0.5.1" @@ -267,6 +1069,21 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "camino" version = "1.1.6" @@ -293,10 +1110,10 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.22", "serde", "serde_json", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -342,12 +1159,12 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest", + "digest 0.10.7", "hmac", "k256", "serde", "sha2", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -363,7 +1180,7 @@ dependencies = [ "pbkdf2 0.12.2", "rand", "sha2", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -375,7 +1192,7 @@ dependencies = [ "base64 0.21.7", "bech32", "bs58", - "digest", + "digest 0.10.7", "generic-array", "hex", "ripemd", @@ -383,7 +1200,7 @@ dependencies = [ "serde_derive", "sha2", "sha3", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -491,7 +1308,7 @@ dependencies = [ "fhe-math", "fhe-traits", "fhe-util", - "getrandom", + "getrandom 0.2.14", "itertools 0.13.0", "log", "ndarray", @@ -568,6 +1385,20 @@ dependencies = [ "cipher", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -593,6 +1424,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -604,6 +1446,57 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" @@ -664,6 +1557,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "dunce" version = "1.0.4" @@ -677,7 +1576,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -698,7 +1597,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -722,6 +1621,7 @@ dependencies = [ name = "enclave-sdk-isomorphic" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "fhe", "fhe-traits", @@ -784,7 +1684,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest", + "digest 0.10.7", "hex", "hmac", "pbkdf2 0.11.0", @@ -794,7 +1694,7 @@ dependencies = [ "serde_json", "sha2", "sha3", - "thiserror", + "thiserror 1.0.58", "uuid", ] @@ -811,7 +1711,7 @@ dependencies = [ "serde", "serde_json", "sha3", - "thiserror", + "thiserror 1.0.58", "uint", ] @@ -890,7 +1790,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -955,10 +1855,10 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum", + "strum 0.26.2", "syn 2.0.101", "tempfile", - "thiserror", + "thiserror 1.0.58", "tiny-keccak", "unicode-xid", ] @@ -972,10 +1872,10 @@ dependencies = [ "chrono", "ethers-core", "reqwest", - "semver", + "semver 1.0.22", "serde", "serde_json", - "thiserror", + "thiserror 1.0.58", "tracing", ] @@ -999,7 +1899,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.58", "tokio", "tracing", "tracing-futures", @@ -1023,7 +1923,7 @@ dependencies = [ "futures-timer", "futures-util", "hashers", - "http", + "http 0.2.12", "instant", "jsonwebtoken", "once_cell", @@ -1031,9 +1931,9 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.58", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.20.1", "tracing", "tracing-futures", "url", @@ -1058,7 +1958,7 @@ dependencies = [ "ethers-core", "rand", "sha2", - "thiserror", + "thiserror 1.0.58", "tracing", ] @@ -1081,12 +1981,12 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver", + "semver 1.0.22", "serde", "serde_json", "solang-parser", "svm-rs", - "thiserror", + "thiserror 1.0.58", "tiny-keccak", "tokio", "tracing", @@ -1116,6 +2016,17 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.13.0" @@ -1144,7 +2055,7 @@ dependencies = [ "rand", "rand_chacha", "serde", - "thiserror", + "thiserror 1.0.58", "zeroize", "zeroize_derive", ] @@ -1167,7 +2078,7 @@ dependencies = [ "rand", "rand_chacha", "sha2", - "thiserror", + "thiserror 1.0.58", "zeroize", ] @@ -1224,6 +2135,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1358,6 +2275,12 @@ dependencies = [ "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "fxhash" version = "0.2.1" @@ -1387,10 +2310,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.28.1" @@ -1437,7 +2372,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap", "slab", "tokio", @@ -1445,11 +2380,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] [[package]] name = "hashers" @@ -1483,6 +2436,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hmac" @@ -1490,7 +2446,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1513,6 +2469,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1520,7 +2487,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", "pin-project-lite", ] @@ -1547,7 +2514,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "httparse", "httpdate", @@ -1567,11 +2534,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", + "http 0.2.12", "hyper", - "rustls", + "rustls 0.21.10", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -1635,7 +2602,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.3", + "serde", ] [[package]] @@ -1656,12 +2624,36 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "ipnet" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1750,6 +2742,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "lalrpop" version = "0.20.2" @@ -1833,6 +2835,26 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "matrixmultiply" version = "0.3.8" @@ -1850,7 +2872,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -1891,7 +2913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -2023,6 +3045,17 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "const-hex", + "serde", + "smallvec", +] + [[package]] name = "object" version = "0.32.2" @@ -2129,6 +3162,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "path-slash" version = "0.2.1" @@ -2141,7 +3180,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", "hmac", "password-hash", "sha2", @@ -2153,7 +3192,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", "hmac", ] @@ -2172,6 +3211,17 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + [[package]] name = "petgraph" version = "0.6.4" @@ -2189,7 +3239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -2361,6 +3411,28 @@ dependencies = [ "toml_edit 0.21.1", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -2376,6 +3448,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ + "bit-set", + "bit-vec", "bitflags 2.5.0", "lazy_static", "num-traits", @@ -2383,6 +3457,8 @@ dependencies = [ "rand_chacha", "rand_xorshift", "regex-syntax", + "rusty-fork", + "tempfile", "unarray", ] @@ -2439,6 +3515,12 @@ dependencies = [ "prost", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.36" @@ -2448,6 +3530,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -2463,6 +3551,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -2481,7 +3570,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.14", ] [[package]] @@ -2519,6 +3608,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2534,9 +3629,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom", + "getrandom 0.2.14", "libredox", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -2580,7 +3675,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "hyper", "hyper-rustls", @@ -2591,21 +3686,21 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", + "rustls 0.21.10", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] @@ -2642,7 +3737,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.14", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -2655,7 +3750,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2680,25 +3775,70 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[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 = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.22", ] [[package]] @@ -2722,10 +3862,24 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring 0.17.8", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "once_cell", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.103.3", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -2735,6 +3889,15 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -2745,12 +3908,35 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.17" @@ -2782,7 +3968,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ "cfg-if", - "derive_more", + "derive_more 0.99.17", "parity-scale-codec", "scale-info-derive", ] @@ -2799,6 +3985,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -2847,6 +4044,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.22" @@ -2856,6 +4062,15 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + [[package]] name = "send_wrapper" version = "0.4.0" @@ -2929,7 +4144,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -2940,7 +4155,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -2949,17 +4164,27 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "signature" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -2971,7 +4196,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.58", "time", ] @@ -2995,6 +4220,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3016,7 +4244,7 @@ dependencies = [ "lalrpop", "lalrpop-util", "phf", - "thiserror", + "thiserror 1.0.58", "unicode-xid", ] @@ -3067,7 +4295,16 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" dependencies = [ - "strum_macros", + "strum_macros 0.26.2", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", ] [[package]] @@ -3083,6 +4320,19 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + [[package]] name = "subtle" version = "2.5.0" @@ -3100,11 +4350,11 @@ dependencies = [ "hex", "once_cell", "reqwest", - "semver", + "semver 1.0.22", "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.58", "url", "zip", ] @@ -3131,12 +4381,30 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "sync_wrapper" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "system-configuration" version = "0.5.1" @@ -3193,7 +4461,16 @@ version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.58", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -3207,6 +4484,26 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "time" version = "0.3.36" @@ -3275,17 +4572,51 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.48.0", ] +[[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.101", +] + [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.10", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls 0.23.27", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -3296,11 +4627,27 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.10", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite 0.20.1", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.27", + "rustls-pki-types", "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", + "tokio-rustls 0.26.2", + "tungstenite 0.24.0", + "webpki-roots 0.26.11", ] [[package]] @@ -3384,6 +4731,26 @@ dependencies = [ "winnow 0.6.6", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3446,23 +4813,49 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.12", "httparse", "log", "rand", - "rustls", + "rustls 0.21.10", "sha1", - "thiserror", + "thiserror 1.0.58", "url", "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand", + "rustls 0.23.27", + "rustls-pki-types", + "sha1", + "thiserror 1.0.58", + "utf-8", +] + [[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -3549,16 +4942,31 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom", + "getrandom 0.2.14", "serde", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -3584,6 +4992,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.93" @@ -3677,6 +5094,20 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -3693,6 +5124,30 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "winapi" version = "0.3.9" @@ -3881,6 +5336,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -3891,6 +5355,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -3902,9 +5375,9 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version", + "rustc_version 0.4.0", "send_wrapper 0.6.0", - "thiserror", + "thiserror 1.0.58", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -3925,11 +5398,34 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[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" diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 4c706b7804..1c7a2391a9 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2423,6 +2423,7 @@ dependencies = [ name = "enclave-sdk-isomorphic" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "fhe 0.1.0-beta.7", "fhe-traits", diff --git a/packages/evm/deployments/sepolia/CiphernodeRegistryOwnable.json b/packages/evm/deployments/sepolia/CiphernodeRegistryOwnable.json index 16c8c42fc1..857bf3339a 100644 --- a/packages/evm/deployments/sepolia/CiphernodeRegistryOwnable.json +++ b/packages/evm/deployments/sepolia/CiphernodeRegistryOwnable.json @@ -1,5 +1,5 @@ { - "address": "0x78b57cfC6702F90b581914014e2DA4ba8532753C", + "address": "0x4A6701c770c53584b7d781ccC0267152d128bd4E", "abi": [ { "inputs": [ @@ -631,67 +631,67 @@ "type": "function" } ], - "transactionHash": "0xf28fde0a32f792fc54b8dbade3edb29b6a60fac689e7c637ba83d79438d69143", + "transactionHash": "0x146099bfb03e2f479887283ec82df6c4c8d11384eebfb22d640e07c50f957dd7", "receipt": { "to": null, "from": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", - "contractAddress": "0x78b57cfC6702F90b581914014e2DA4ba8532753C", - "transactionIndex": 170, + "contractAddress": "0x4A6701c770c53584b7d781ccC0267152d128bd4E", + "transactionIndex": 136, "gasUsed": "1212915", - "logsBloom": "0x00000000000000000001000000000000000000000000000000800000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000001000000000000000000000000000020000000008000000000800000000000000000000000000000000400000000000000000002800000000000000000000004080000000000000000000000000000000000000000008000000000000000000000000000000000000000000000020000000000000000000000002000000000004200000000000000020000000000000000000000000000000000000000000000000000000000000000002", - "blockHash": "0x562182aa93f3713fd06c67d4d35b3a575ffdc939d4159c474baec34a65ac084f", - "transactionHash": "0xf28fde0a32f792fc54b8dbade3edb29b6a60fac689e7c637ba83d79438d69143", + "logsBloom": "0x00000000000000000001000000000002000000000000000000800000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000000000040000000000020000000000000000000800000000000000000000000000000000400000000000000000000800000000000000000000004080000000000000000000000000000000000000000000010000000000000000000040000000000004000000000020000000000000020000000002000000000004000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x483fe0f85cc08b523999f1e6edb7c182a737467d9289ca75f5074c445b152fd0", + "transactionHash": "0x146099bfb03e2f479887283ec82df6c4c8d11384eebfb22d640e07c50f957dd7", "logs": [ { - "transactionIndex": 170, - "blockNumber": 8332809, - "transactionHash": "0xf28fde0a32f792fc54b8dbade3edb29b6a60fac689e7c637ba83d79438d69143", - "address": "0x78b57cfC6702F90b581914014e2DA4ba8532753C", + "transactionIndex": 136, + "blockNumber": 8360699, + "transactionHash": "0x146099bfb03e2f479887283ec82df6c4c8d11384eebfb22d640e07c50f957dd7", + "address": "0x4A6701c770c53584b7d781ccC0267152d128bd4E", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b" ], "data": "0x", - "logIndex": 349, - "blockHash": "0x562182aa93f3713fd06c67d4d35b3a575ffdc939d4159c474baec34a65ac084f" + "logIndex": 163, + "blockHash": "0x483fe0f85cc08b523999f1e6edb7c182a737467d9289ca75f5074c445b152fd0" }, { - "transactionIndex": 170, - "blockNumber": 8332809, - "transactionHash": "0xf28fde0a32f792fc54b8dbade3edb29b6a60fac689e7c637ba83d79438d69143", - "address": "0x78b57cfC6702F90b581914014e2DA4ba8532753C", + "transactionIndex": 136, + "blockNumber": 8360699, + "transactionHash": "0x146099bfb03e2f479887283ec82df6c4c8d11384eebfb22d640e07c50f957dd7", + "address": "0x4A6701c770c53584b7d781ccC0267152d128bd4E", "topics": [ "0x2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c9", - "0x00000000000000000000000055eb3e7e3ffd6c5b7ef2c52c0744dc78ad26d2c9" + "0x0000000000000000000000006307a84b88f2641f197359a95bc6029bf33f54fb" ], "data": "0x", - "logIndex": 350, - "blockHash": "0x562182aa93f3713fd06c67d4d35b3a575ffdc939d4159c474baec34a65ac084f" + "logIndex": 164, + "blockHash": "0x483fe0f85cc08b523999f1e6edb7c182a737467d9289ca75f5074c445b152fd0" }, { - "transactionIndex": 170, - "blockNumber": 8332809, - "transactionHash": "0xf28fde0a32f792fc54b8dbade3edb29b6a60fac689e7c637ba83d79438d69143", - "address": "0x78b57cfC6702F90b581914014e2DA4ba8532753C", + "transactionIndex": 136, + "blockNumber": 8360699, + "transactionHash": "0x146099bfb03e2f479887283ec82df6c4c8d11384eebfb22d640e07c50f957dd7", + "address": "0x4A6701c770c53584b7d781ccC0267152d128bd4E", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 351, - "blockHash": "0x562182aa93f3713fd06c67d4d35b3a575ffdc939d4159c474baec34a65ac084f" + "logIndex": 165, + "blockHash": "0x483fe0f85cc08b523999f1e6edb7c182a737467d9289ca75f5074c445b152fd0" } ], - "blockNumber": 8332809, - "cumulativeGasUsed": "25785929", + "blockNumber": 8360699, + "cumulativeGasUsed": "10145917", "status": 1, "byzantium": true }, "args": [ "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", - "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9" + "0x6307a84B88F2641f197359a95BC6029bF33f54fb" ], - "numDeployments": 2, + "numDeployments": 3, "solcInputHash": "7505270e9ddb813a3809c10e5d95f372", "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enclave\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"CiphernodeNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeAlreadyRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafGreaterThanSnarkScalarField\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEnclave\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyFilter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongSiblingNodes\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numNodes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"name\":\"CiphernodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numNodes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"name\":\"CiphernodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"CommitteePublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"CommitteeRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enclave\",\"type\":\"address\"}],\"name\":\"EnclaveSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"addCiphernode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ciphernodes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"committeePublicKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"publicKeyHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enclave\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"filters\",\"outputs\":[{\"internalType\":\"contract IRegistryFilter\",\"name\":\"filter\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getFilter\",\"outputs\":[{\"internalType\":\"contract IRegistryFilter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enclave\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"isCiphernodeEligible\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"isEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numCiphernodes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"publicKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"publicKeyHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"publishCommittee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"siblingNodes\",\"type\":\"uint256[]\"}],\"name\":\"removeCiphernode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"requestCommittee\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"root\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"rootAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"roots\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"root\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_enclave\",\"type\":\"address\"}],\"name\":\"setEnclave\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"treeSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"CiphernodeAdded(address,uint256,uint256,uint256)\":{\"params\":{\"index\":\"Index of the ciphernode in the registry.\",\"node\":\"Address of the ciphernode.\",\"numNodes\":\"Number of ciphernodes in the registry.\",\"size\":\"Size of the registry.\"}},\"CiphernodeRemoved(address,uint256,uint256,uint256)\":{\"params\":{\"index\":\"Index of the ciphernode in the registry.\",\"node\":\"Address of the ciphernode.\",\"numNodes\":\"Number of ciphernodes in the registry.\",\"size\":\"Size of the registry.\"}},\"CommitteePublished(uint256,bytes)\":{\"params\":{\"e3Id\":\"ID of the E3 for which the committee was selected.\",\"publicKey\":\"Public key of the committee.\"}},\"CommitteeRequested(uint256,address,uint32[2])\":{\"params\":{\"e3Id\":\"ID of the E3 for which the committee was selected.\",\"filter\":\"Address of the contract that will coordinate committee selection.\",\"threshold\":\"The M/N threshold for the committee.\"}},\"EnclaveSet(address)\":{\"params\":{\"enclave\":\"Address of the enclave contract.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"committeePublicKey(uint256)\":{\"details\":\"This function MUST revert if no committee has been requested for the given E3.This function MUST revert if the committee has not yet published a public key.\",\"params\":{\"e3Id\":\"ID of the E3 for which to get the committee public key.\"},\"returns\":{\"publicKeyHash\":\"The hash of the public key of the given committee.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"requestCommittee(uint256,address,uint32[2])\":{\"details\":\"This function MUST revert when not called by the Enclave contract.\",\"params\":{\"e3Id\":\"ID of the E3 for which to select the committee.\",\"filter\":\"The address of the filter responsible for the committee selection process.\",\"threshold\":\"The M/N threshold for the committee.\"},\"returns\":{\"success\":\"True if committee selection was successfully initiated.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"CiphernodeAdded(address,uint256,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when a ciphernode is added to the registry.\"},\"CiphernodeRemoved(address,uint256,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when a ciphernode is removed from the registry.\"},\"CommitteePublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when a committee is selected for an E3.\"},\"CommitteeRequested(uint256,address,uint32[2])\":{\"notice\":\"This event MUST be emitted when a committee is selected for an E3.\"},\"EnclaveSet(address)\":{\"notice\":\"This event MUST be emitted when `enclave` is set.\"}},\"kind\":\"user\",\"methods\":{\"committeePublicKey(uint256)\":{\"notice\":\"This function should be called by the Enclave contract to get the public key of a committee.\"},\"requestCommittee(uint256,address,uint32[2])\":{\"notice\":\"Initiates the committee selection process for a specified E3.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/registry/CiphernodeRegistryOwnable.sol\":\"CiphernodeRegistryOwnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"@zk-kit/lean-imt.sol/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xb1944a1d9f63069b2f22260935adb2d11546f82fbb7d12d853a90134a92f4b5b\",\"license\":\"UNLICENSED\"},\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\nimport {SNARK_SCALAR_FIELD} from \\\"./Constants.sol\\\";\\n\\nstruct LeanIMTData {\\n // Tracks the current number of leaves in the tree.\\n uint256 size;\\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\\n uint256 depth;\\n // A mapping from each level of the tree to the node value of the last even position at that level.\\n // Used for efficient inserts, updates and root calculations.\\n mapping(uint256 => uint256) sideNodes;\\n // A mapping from leaf values to their respective indices in the tree.\\n // This facilitates checks for leaf existence and retrieval of leaf positions.\\n mapping(uint256 => uint256) leaves;\\n}\\n\\nerror WrongSiblingNodes();\\nerror LeafGreaterThanSnarkScalarField();\\nerror LeafCannotBeZero();\\nerror LeafAlreadyExists();\\nerror LeafDoesNotExist();\\n\\n/// @title Lean Incremental binary Merkle tree.\\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\\n/// it is updated based on the number of leaves in the tree. This approach\\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\\nlibrary InternalLeanIMT {\\n /// @dev Inserts a new leaf into the incremental merkle tree.\\n /// The function ensures that the leaf is valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the new leaf to be inserted into the tree.\\n /// @return The new hash of the node after the leaf has been inserted.\\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\\n if (leaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaf == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = self.size;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // A new insertion can increase a tree's depth by at most 1,\\n // and only if the number of leaves supported by the current\\n // depth is less than the number of leaves to be supported after insertion.\\n if (2 ** treeDepth < index + 1) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n uint256 node = leaf;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n node = PoseidonT3.hash([self.sideNodes[level], node]);\\n } else {\\n self.sideNodes[level] = node;\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n self.size = ++index;\\n\\n self.sideNodes[treeDepth] = node;\\n self.leaves[leaf] = index;\\n\\n return node;\\n }\\n\\n /// @dev Inserts many leaves into the incremental merkle tree.\\n /// The function ensures that the leaves are valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaves: The values of the new leaves to be inserted into the tree.\\n /// @return The root after the leaves have been inserted.\\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\\n // Cache tree size to optimize gas\\n uint256 treeSize = self.size;\\n\\n // Check that all the new values are correct to be added.\\n for (uint256 i = 0; i < leaves.length; ) {\\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaves[i] == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaves[i])) {\\n revert LeafAlreadyExists();\\n }\\n\\n self.leaves[leaves[i]] = treeSize + 1 + i;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Array to save the nodes that will be used to create the next level of the tree.\\n uint256[] memory currentLevelNewNodes;\\n\\n currentLevelNewNodes = leaves;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // Calculate the depth of the tree after adding the new values.\\n // Unlike the 'insert' function, we need a while here as\\n // N insertions can increase the tree's depth more than once.\\n while (2 ** treeDepth < treeSize + leaves.length) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n // First index to change in every level.\\n uint256 currentLevelStartIndex = treeSize;\\n\\n // Size of the level used to create the next level.\\n uint256 currentLevelSize = treeSize + leaves.length;\\n\\n // The index where changes begin at the next level.\\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\\n\\n // The size of the next level.\\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n // The number of nodes for the new level that will be created,\\n // only the new values, not the entire level.\\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\\n for (uint256 i = 0; i < numberOfNewNodes; ) {\\n uint256 leftNode;\\n\\n // Assign the left node using the saved path or the position in the array.\\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\\n leftNode = self.sideNodes[level];\\n } else {\\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\\n }\\n\\n uint256 rightNode;\\n\\n // Assign the right node if the value exists.\\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\\n }\\n\\n uint256 parentNode;\\n\\n // Assign the parent node.\\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\\n // it will be the leftNode.\\n if (rightNode != 0) {\\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\\n } else {\\n parentNode = leftNode;\\n }\\n\\n nextLevelNewNodes[i] = parentNode;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Update the `sideNodes` variable.\\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\\n // will be the value before the last one.\\n // If it is even and there is only one element, there is no need to save anything because\\n // the correct value for this level was already saved before.\\n if (currentLevelSize & 1 == 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\\n } else if (currentLevelNewNodes.length > 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\\n }\\n\\n currentLevelStartIndex = nextLevelStartIndex;\\n\\n // Calculate the next level startIndex value.\\n // It is the position of the parent node which is pos/2.\\n nextLevelStartIndex >>= 1;\\n\\n // Update the next array that will be used to calculate the next level.\\n currentLevelNewNodes = nextLevelNewNodes;\\n\\n currentLevelSize = nextLevelSize;\\n\\n // Calculate the size of the next level.\\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n // Update tree size\\n self.size = treeSize + leaves.length;\\n\\n // Update tree root\\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\\n\\n return currentLevelNewNodes[0];\\n }\\n\\n /// @dev Updates the value of an existing leaf and recalculates hashes\\n /// to maintain tree integrity.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf that is to be updated.\\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\\n /// @return The new hash of the updated node after the leaf has been updated.\\n function _update(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256 newLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n if (newLeaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (!_has(self, oldLeaf)) {\\n revert LeafDoesNotExist();\\n } else if (_has(self, newLeaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = _indexOf(self, oldLeaf);\\n uint256 node = newLeaf;\\n uint256 oldRoot = oldLeaf;\\n\\n uint256 lastIndex = self.size - 1;\\n uint256 i = 0;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([siblingNodes[i], node]);\\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n if (index >> level != lastIndex >> level) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([node, siblingNodes[i]]);\\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n self.sideNodes[i] = node;\\n }\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n if (oldRoot != _root(self)) {\\n revert WrongSiblingNodes();\\n }\\n\\n self.sideNodes[treeDepth] = node;\\n\\n if (newLeaf != 0) {\\n self.leaves[newLeaf] = self.leaves[oldLeaf];\\n }\\n\\n self.leaves[oldLeaf] = 0;\\n\\n return node;\\n }\\n\\n /// @dev Removes a leaf from the tree by setting its value to zero.\\n /// This function utilizes the update function to set the leaf's value\\n /// to zero and update the tree's state accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf to be removed.\\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\\n /// @return The new root hash of the tree after the leaf has been removed.\\n function _remove(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n return _update(self, oldLeaf, 0, siblingNodes);\\n }\\n\\n /// @dev Checks if a leaf exists in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf to check for existence.\\n /// @return A boolean value indicating whether the leaf exists in the tree.\\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\\n return self.leaves[leaf] != 0;\\n }\\n\\n /// @dev Retrieves the index of a given leaf in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf whose index is to be found.\\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\\n /// reverts with a custom error.\\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\\n if (self.leaves[leaf] == 0) {\\n revert LeafDoesNotExist();\\n }\\n\\n return self.leaves[leaf] - 1;\\n }\\n\\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\\n /// current tree depth.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @return The root hash of the tree.\\n function _root(LeanIMTData storage self) internal view returns (uint256) {\\n return self.sideNodes[self.depth];\\n }\\n}\\n\",\"keccak256\":\"0x6385ce9153d11d9824163464193d4ba3dd304e662dccd365ba2fc381a359762b\",\"license\":\"MIT\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IRegistryFilter.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IRegistryFilter {\\n function requestCommittee(\\n uint256 e3Id,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0x6bd13d0b188e54393b1a030a43f95042161091d49428e880c301d882c4583100\",\"license\":\"LGPL-3.0-only\"},\"contracts/registry/CiphernodeRegistryOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { ICiphernodeRegistry } from \\\"../interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IRegistryFilter } from \\\"../interfaces/IRegistryFilter.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n InternalLeanIMT,\\n LeanIMTData\\n} from \\\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\\\";\\n\\ncontract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable {\\n using InternalLeanIMT for LeanIMTData;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n address public enclave;\\n uint256 public numCiphernodes;\\n LeanIMTData public ciphernodes;\\n\\n mapping(uint256 e3Id => IRegistryFilter filter) public filters;\\n mapping(uint256 e3Id => uint256 root) public roots;\\n mapping(uint256 e3Id => bytes32 publicKeyHash) public publicKeyHashes;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeAlreadyRequested();\\n error CommitteeAlreadyPublished();\\n error OnlyFilter();\\n error CommitteeNotPublished();\\n error CiphernodeNotEnabled(address node);\\n error OnlyEnclave();\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Modifiers //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n modifier onlyEnclave() {\\n require(msg.sender == enclave, OnlyEnclave());\\n _;\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n constructor(address _owner, address _enclave) {\\n initialize(_owner, _enclave);\\n }\\n\\n function initialize(address _owner, address _enclave) public initializer {\\n __Ownable_init(msg.sender);\\n setEnclave(_enclave);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external onlyEnclave returns (bool success) {\\n require(\\n filters[e3Id] == IRegistryFilter(address(0)),\\n CommitteeAlreadyRequested()\\n );\\n filters[e3Id] = IRegistryFilter(filter);\\n roots[e3Id] = root();\\n\\n IRegistryFilter(filter).requestCommittee(e3Id, threshold);\\n emit CommitteeRequested(e3Id, filter, threshold);\\n success = true;\\n }\\n\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata,\\n bytes calldata publicKey\\n ) external {\\n // only to be published by the filter\\n require(address(filters[e3Id]) == msg.sender, OnlyFilter());\\n\\n publicKeyHashes[e3Id] = keccak256(publicKey);\\n emit CommitteePublished(e3Id, publicKey);\\n }\\n\\n function addCiphernode(address node) external onlyOwner {\\n uint160 ciphernode = uint160(node);\\n ciphernodes._insert(ciphernode);\\n numCiphernodes++;\\n emit CiphernodeAdded(\\n node,\\n ciphernodes._indexOf(ciphernode),\\n numCiphernodes,\\n ciphernodes.size\\n );\\n }\\n\\n function removeCiphernode(\\n address node,\\n uint256[] calldata siblingNodes\\n ) external onlyOwner {\\n uint160 ciphernode = uint160(node);\\n uint256 index = ciphernodes._indexOf(ciphernode);\\n ciphernodes._remove(ciphernode, siblingNodes);\\n numCiphernodes--;\\n emit CiphernodeRemoved(node, index, numCiphernodes, ciphernodes.size);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setEnclave(address _enclave) public onlyOwner {\\n enclave = _enclave;\\n emit EnclaveSet(_enclave);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash) {\\n publicKeyHash = publicKeyHashes[e3Id];\\n require(publicKeyHash != bytes32(0), CommitteeNotPublished());\\n }\\n\\n function isCiphernodeEligible(address node) external view returns (bool) {\\n return isEnabled(node);\\n }\\n\\n function isEnabled(address node) public view returns (bool) {\\n return ciphernodes._has(uint160(node));\\n }\\n\\n function root() public view returns (uint256) {\\n return (ciphernodes._root());\\n }\\n\\n function rootAt(uint256 e3Id) public view returns (uint256) {\\n return roots[e3Id];\\n }\\n\\n function getFilter(uint256 e3Id) public view returns (IRegistryFilter) {\\n return filters[e3Id];\\n }\\n\\n function treeSize() public view returns (uint256) {\\n return ciphernodes.size;\\n }\\n}\\n\",\"keccak256\":\"0xe911e14c085551d0e3c200279ebf8ce5a70076b68a08303658782b0694593f21\",\"license\":\"LGPL-3.0-only\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60803461022457601f6116dc38819003918201601f19168301916001600160401b0383118484101761022957808492604094855283398101031261022457610052602061004b8361023f565b920161023f565b6000805160206116bc83398151915254604081901c60ff16159291906001600160401b0381168015908161021c575b6001149081610212575b159081610209575b506101f8576001600160401b031981166001176000805160206116bc83398151915255836101cd575b506100c56102c9565b6100cd6102c9565b6100d633610253565b6100de6102f7565b600080546001600160a01b0319166001600160a01b039290921691821781557f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c99080a260008051602061169c833981519152546001600160a01b03908116908216036101b6575b5061015a575b60405161136e908161032e8239f35b68ff0000000000000000196000805160206116bc83398151915254166000805160206116bc833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a161014b565b6101c7906101c26102f7565b610253565b38610145565b6001600160481b03191668010000000000000001176000805160206116bc83398151915255386100bc565b63f92ee8a960e01b60005260046000fd5b90501538610093565b303b15915061008b565b859150610081565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361022457565b6001600160a01b031680156102b35760008051602061169c83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff6000805160206116bc8339815191525460401c16156102e657565b631afcd79f60e31b60005260046000fd5b60008051602061169c833981519152546001600160a01b0316330361031857565b63118cdaa760e01b6000523360045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c90816306e341501461108c575080632c92fb99146110575780632e7b716d14610a0b578063485cc95514610e0957806370e36bbe14610da6578063715018a614610d0d5780638a78bb1514610adf5780638cb89ecb14610ab35780638d1ddfb114610a955780638da5cb5b14610a4f5780639015d37114610a0b5780639ccb58d514610897578063a04e606514610387578063c2b40ae41461035b578063ca2869a01461035b578063d9bbec9514610221578063dbb06c93146101fa578063e82f3b70146101b6578063ebf0c71714610184578063f2fde38b14610159578063f379b0df146101345763f6fc05d51461011157600080fd5b3461012f57600036600319011261012f576020600154604051908152f35b600080fd5b3461012f57600036600319011261012f57604060025460035482519182526020820152f35b3461012f57602036600319011261012f576101826101756110bd565b61017d611243565b61119d565b005b3461012f57600036600319011261012f5760206101ae600354600052600460205260406000205490565b604051908152f35b3461012f57602036600319011261012f57600435600052600860205260406000205480156101e957602090604051908152f35b6322e679e360e11b60005260046000fd5b3461012f57600036600319011261012f5760206001600160a01b0360005416604051908152f35b3461012f57606036600319011261012f5760043560243567ffffffffffffffff811161012f576102559036906004016110e9565b505060443567ffffffffffffffff811161012f576102779036906004016110e9565b8260005260066020526001600160a01b0360406000205416330361034a5767ffffffffffffffff811161033457604051601f8201601f1916926102bd6020850183611142565b8282526020820193368483011161012f578460409385847f8d0ca30515bbff1268ae5868080463444e5002373f7bc7d8d8869dca0a5ffc01983760006020878301015251902086600052600860205283600020556000838581519687956020875281602088015283870137840101528101030190a2005b634e487b7160e01b600052604160045260246000fd5b63be19562360e01b60005260046000fd5b3461012f57602036600319011261012f5760043560005260076020526020604060002054604051908152f35b3461012f57604036600319011261012f576103a06110bd565b60243567ffffffffffffffff811161012f573660238201121561012f5780600401359167ffffffffffffffff831161012f576024820191602436918560051b01011161012f576001600160a01b03906103f7611243565b1691610402836112b9565b9161041a846000526005602052604060002054151590565b61042f57631c811d5b60e21b60005260046000fd5b6000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461088657610467846112b9565b600092859160025493600019850194851161087257600354948693849392915b87851061054d575050505050506104ab600354600052600460205260406000205490565b0361053c57600052600460205260406000205581600052600560205260006040812055600154908115610526576000199091016001819055600254604080519384526020840192909252908201527f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d59080606081015b0390a2005b634e487b7160e01b600052601160045260246000fd5b631fd4986360e11b60005260046000fd5b90919293949584861c6001808216146000146106ed57507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161059088858761133b565b3510156106dc576105eb6020733333333C0A88F9BE4fd23ed0536F9B6c427e3B939a604051906105bf82611126565b6105ca8b888a61133b565b3582528282015260405180938192632b0aac7f60e11b83526004830161128b565b03818d5af490811561069d576000916106a9575b50610642916020919a6040519161061583611126565b6106208b888a61133b565b358352838301526040518080958194632b0aac7f60e11b83526004830161128b565b03915af490811561069d57600091610668575b50600180919701955b0193929190610487565b906020823d8211610695575b8161068160209383611142565b810103126106925750516001610655565b80fd5b3d9150610674565b6040513d6000823e3d90fd5b906020823d82116106d4575b816106c260209383611142565b810103126106925750516106426105ff565b3d91506106b5565b6361c0541760e11b60005260046000fd5b82871c14610858577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161072188858761133b565b3510156106dc5761077c6020733333333C0A88F9BE4fd23ed0536F9B6c427e3B939a6040519061075082611126565b815261075d8a878961133b565b358282015260405180938192632b0aac7f60e11b83526004830161128b565b03818d5af490811561069d57600091610825575b506107d3916020919a604051916107a683611126565b82526107b38a878961133b565b35838301526040518080958194632b0aac7f60e11b83526004830161128b565b03915af490811561069d576000916107f3575b506001809197019561065e565b906020823d821161081d575b8161080c60209383611142565b8101031261069257505160016107e6565b3d91506107ff565b906020823d8211610850575b8161083e60209383611142565b810103126106925750516107d3610790565b3d9150610831565b95946001908660005260046020528960406000205561065e565b634e487b7160e01b86526011600452602486fd5b6312c50cad60e11b60005260046000fd5b3461012f57608036600319011261012f576004356108b36110d3565b3660841161012f576001600160a01b036000541633036109fa578160005260066020526001600160a01b03604060002054166109e9576001600160a01b03168160005260066020526040600020816001600160a01b0319825416179055610927600354600052600460205260406000205490565b826000526007602052604060002055604051631590527b60e11b815282600482015261095560248201611164565b6020816064816000865af1801561069d576109ae575b5060607fa17377d4a5c0ff5c67888a6b08d9bf3a8505b47e922b6186b259471ebf12738e916040519081526109a260208201611164565ba2602060405160018152f35b6020813d6020116109e1575b816109c760209383611142565b8101031261012f5751801515810361012f5750606061096b565b3d91506109ba565b6374ff462560e11b60005260046000fd5b63e4c2a7eb60e01b60005260046000fd5b3461012f57602036600319011261012f576020610a45610a296110bd565b6001600160a01b03166000526005602052604060002054151590565b6040519015158152f35b3461012f57600036600319011261012f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461012f57600036600319011261012f576020600254604051908152f35b3461012f57602036600319011261012f5760043560005260086020526020604060002054604051908152f35b3461012f57602036600319011261012f576001600160a01b03610b006110bd565b610b08611243565b167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610b41576361c0541760e11b60005260046000fd5b80610b57576314b48df160e11b60005260046000fd5b610b6e816000526005602052604060002054151590565b610886576002546003549060ff82116105265760018101808211610526576001831b10610cfd575b81600355829060005b838110610c2e5750610bb090611117565b918260025560005260046020526040600020558160005260056020526040600020557f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db53610bfe600154611117565b80600155610c0b836112b9565b610521600254604051938493846040919493926060820195825260208201520152565b9160018083851c1614600014610ce4576020610c7f9160405190610c5182611126565b856000526004835260406000205482528282015260405180938192632b0aac7f60e11b83526004830161128b565b0381733333333C0A88F9BE4fd23ed0536F9B6c427e3B935af4801561069d57600090610cb2575b60019150925b01610b9f565b6020823d8211610cdc575b81610cca60209383611142565b81010312610692575060019051610ca6565b3d9150610cbd565b9180600191600052600460205283604060002055610cac565b90610d0790611117565b90610b96565b3461012f57600036600319011261012f57610d26611243565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461012f57602036600319011261012f576001600160a01b03610dc76110bd565b610dcf611243565b16806001600160a01b031960005416176000557f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c9600080a2005b3461012f57604036600319011261012f57610e226110bd565b610e2a6110d3565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159267ffffffffffffffff82168015908161104f575b6001149081611045575b15908161103c575b5061102b5767ffffffffffffffff1982166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556001600160a01b039184610fec575b50610eca6112fb565b610ed26112fb565b610edb3361119d565b610ee3611243565b16806001600160a01b031960005416176000557f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c9600080a26001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b03821603610fda575b50610f5d57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b610fe69061017d611243565b81610f56565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005584610ec1565b63f92ee8a960e01b60005260046000fd5b90501585610e7c565b303b159150610e74565b859150610e6a565b3461012f57602036600319011261012f57600435600052600660205260206001600160a01b0360406000205416604051908152f35b3461012f57602036600319011261012f57602090600435600052600682526001600160a01b03604060002054168152f35b600435906001600160a01b038216820361012f57565b602435906001600160a01b038216820361012f57565b9181601f8401121561012f5782359167ffffffffffffffff831161012f576020838186019501011161012f57565b60001981146105265760010190565b6040810190811067ffffffffffffffff82111761033457604052565b90601f8019910116810190811067ffffffffffffffff82111761033457604052565b60446000915b6002831061117757505050565b81359063ffffffff821680920361012f576020816001938293520192019201919061116a565b6001600160a01b0316801561122d576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361127657565b63118cdaa760e01b6000523360045260246000fd5b919060408301926000905b600282106112a357505050565b6020806001928551815201930191019091611296565b806000526005602052604060002054156112ea57600052600560205260406000205460001981019081116105265790565b631c811d5b60e21b60005260046000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561132a57565b631afcd79f60e31b60005260046000fd5b919081101561134b5760051b0190565b634e487b7160e01b600052603260045260246000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", diff --git a/packages/evm/deployments/sepolia/Enclave.json b/packages/evm/deployments/sepolia/Enclave.json index 609a1531cf..1d6de1db32 100644 --- a/packages/evm/deployments/sepolia/Enclave.json +++ b/packages/evm/deployments/sepolia/Enclave.json @@ -1,5 +1,5 @@ { - "address": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", + "address": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", "abi": [ { "inputs": [ @@ -1353,70 +1353,70 @@ "type": "function" } ], - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", "receipt": { "to": null, "from": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", - "contractAddress": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", - "transactionIndex": 180, - "gasUsed": "2178019", - "logsBloom": "0x00000000000020000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000100000000000000000020000000000000000000800000000000000000000020000000400420000000000000000000800000000000000000000004080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000010000000000000000000000000004000000000000000020000000000000000000000000000001000000000800000000040000000000000000", - "blockHash": "0x35e6bde2d00cb80aabc8c7af84289131649dc636413c6a1a66629198e2193dd9", - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", + "contractAddress": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", + "transactionIndex": 321, + "gasUsed": "2177587", + "logsBloom": "0x00000000000000000000000000000000000002000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000001000000001000000000100000000000000000020000000000000000000800000000000000000000000000000400420000000000000000000800000000000000000000004080000000000000000000000000000000000000000000000000000000000000000000004000000000000000000020000000010000000000000000000000000004000000000000000020000000000000000000000000000001000000000800000000000000000000000000", + "blockHash": "0xd72f5ec2bb616c64c8f5bbf6802669638ee6244ce86aec2a47250ac3173c82f4", + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", "logs": [ { - "transactionIndex": 180, - "blockNumber": 8332807, - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", - "address": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", + "transactionIndex": 321, + "blockNumber": 8360698, + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", + "address": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b" ], "data": "0x", - "logIndex": 517, - "blockHash": "0x35e6bde2d00cb80aabc8c7af84289131649dc636413c6a1a66629198e2193dd9" + "logIndex": 469, + "blockHash": "0xd72f5ec2bb616c64c8f5bbf6802669638ee6244ce86aec2a47250ac3173c82f4" }, { - "transactionIndex": 180, - "blockNumber": 8332807, - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", - "address": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", + "transactionIndex": 321, + "blockNumber": 8360698, + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", + "address": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", "topics": [ "0xba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552" ], "data": "0x0000000000000000000000000000000000000000000000000000000000278d00", - "logIndex": 518, - "blockHash": "0x35e6bde2d00cb80aabc8c7af84289131649dc636413c6a1a66629198e2193dd9" + "logIndex": 470, + "blockHash": "0xd72f5ec2bb616c64c8f5bbf6802669638ee6244ce86aec2a47250ac3173c82f4" }, { - "transactionIndex": 180, - "blockNumber": 8332807, - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", - "address": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", + "transactionIndex": 321, + "blockNumber": 8360698, + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", + "address": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", "topics": [ "0x80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 519, - "blockHash": "0x35e6bde2d00cb80aabc8c7af84289131649dc636413c6a1a66629198e2193dd9" + "logIndex": 471, + "blockHash": "0xd72f5ec2bb616c64c8f5bbf6802669638ee6244ce86aec2a47250ac3173c82f4" }, { - "transactionIndex": 180, - "blockNumber": 8332807, - "transactionHash": "0xebc4f5263c91ed286bc907a82a642ee1c93cc7b86d36a75196317010ec695309", - "address": "0x55eb3E7e3fFd6c5B7EF2C52c0744DC78aD26D2C9", + "transactionIndex": 321, + "blockNumber": 8360698, + "transactionHash": "0x6c1ef01dba2714a518dca4fd47afa33ea9b0f7903e67e69613be23c8332535d1", + "address": "0x6307a84B88F2641f197359a95BC6029bF33f54fb", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 520, - "blockHash": "0x35e6bde2d00cb80aabc8c7af84289131649dc636413c6a1a66629198e2193dd9" + "logIndex": 472, + "blockHash": "0xd72f5ec2bb616c64c8f5bbf6802669638ee6244ce86aec2a47250ac3173c82f4" } ], - "blockNumber": 8332807, - "cumulativeGasUsed": "27324349", + "blockNumber": 8360698, + "cumulativeGasUsed": "28107948", "status": 1, "byzantium": true }, @@ -1425,11 +1425,11 @@ "0x0000000000000000000000000000000000000001", 2592000 ], - "numDeployments": 2, - "solcInputHash": "af1a33d80136fdacbd4916512487a8ab", - "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeSelectionFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3AlreadyActivated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3DoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3Expired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3NotActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3NotReady\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlineNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlinePassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"InvalidCiphernodeRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"}],\"name\":\"InvalidComputationRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"InvalidEncryptionScheme\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"output\",\"type\":\"bytes\"}],\"name\":\"InvalidOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStartWindow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafGreaterThanSnarkScalarField\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"PaymentRequired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"PlaintextOutputAlreadyPublished\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"CiphernodeRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"}],\"name\":\"CiphertextOutputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"committeePublicKey\",\"type\":\"bytes\"}],\"name\":\"E3Activated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3Requested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inputHash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"InputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxDuration\",\"type\":\"uint256\"}],\"name\":\"MaxDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"name\":\"PlaintextOutputPublished\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"activate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ciphernodeRegistry\",\"outputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"decryptionVerifiers\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"disableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"disableEncryptionScheme\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"e3Programs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"e3s\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"enableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"getDecryptionVerifier\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getE3\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getInputRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputCounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"inputCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nexte3Id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishCiphertextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"publishInput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishPlaintextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"computeProviderParams\",\"type\":\"bytes\"}],\"name\":\"request\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"setCiphernodeRegistry\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"name\":\"setDecryptionVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"setMaxDuration\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"CiphernodeRegistrySet(address)\":{\"params\":{\"ciphernodeRegistry\":\"The address of the CiphernodeRegistry contract.\"}},\"CiphertextOutputPublished(uint256,bytes)\":{\"params\":{\"ciphertextOutput\":\"ABI encoded ciphertext output.\",\"e3Id\":\"ID of the E3.\"}},\"E3Activated(uint256,uint256,bytes)\":{\"params\":{\"committeePublicKey\":\"Public key of the committee.\",\"e3Id\":\"ID of the E3.\",\"expiration\":\"Timestamp when committee duties expire.\"}},\"E3ProgramDisabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3ProgramEnabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"params\":{\"e3\":\"Details of the E3.\",\"e3Id\":\"ID of the E3.\",\"e3Program\":\"Address of the Computation module selected.\",\"filter\":\"Address of the pool of nodes from which the Cipher Node committee was selected.\"}},\"EncryptionSchemeDisabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was disabled.\"}},\"EncryptionSchemeEnabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was enabled.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"params\":{\"data\":\"ABI encoded input data.\",\"e3Id\":\"ID of the E3.\"}},\"MaxDurationSet(uint256)\":{\"params\":{\"maxDuration\":\"The maximum duration of a computation in seconds.\"}},\"PlaintextOutputPublished(uint256,bytes)\":{\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\"}}},\"kind\":\"dev\",\"methods\":{\"activate(uint256,bytes)\":{\"details\":\"This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"publicKey\":\"Public key of the committee.\"},\"returns\":{\"success\":\"True if the E3 was successfully activated.\"}},\"constructor\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"getE3(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"e3\":\"The struct representing the requested E3.\"}},\"getInputRoot(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"_0\":\"The root of the input merkle tree.\"}},\"initialize(address,address,uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST emit the CiphertextOutputPublished event.\",\"params\":{\"ciphertextOutput\":\"ABI encoded output data to verify.\",\"e3Id\":\"ID of the E3.\",\"proof\":\"ABI encoded data to verify the ciphertextOutput.\"},\"returns\":{\"success\":\"True if the output was successfully published.\"}},\"publishInput(uint256,bytes)\":{\"details\":\"This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.\",\"params\":{\"data\":\"ABI encoded input data to publish.\",\"e3Id\":\"ID of the E3.\"},\"returns\":{\"success\":\"True if the input was successfully published.\"}},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\",\"proof\":\"ABI encoded data to verify the plaintextOutput.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"details\":\"This function MUST emit the E3Requested event.\",\"params\":{\"computeProviderParams\":\"ABI encoded compute provider parameters.\",\"duration\":\"The duration of the computation in seconds.\",\"e3Program\":\"Address of the E3 Program.\",\"e3ProgramParams\":\"ABI encoded computation parameters.\",\"filter\":\"IDs of the pool of nodes from which to select the committee.\",\"threshold\":\"The M/N threshold for the committee.\"},\"returns\":{\"e3\":\"The E3 struct.\",\"e3Id\":\"ID of the E3.\"}},\"setMaxDuration(uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds.\"},\"returns\":{\"success\":\"True if the max duration was successfully set.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"CiphernodeRegistrySet(address)\":{\"notice\":\"This event MUST be emitted any time the CiphernodeRegistry is set.\"},\"CiphertextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published.\"},\"E3Activated(uint256,uint256,bytes)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\"},\"E3ProgramDisabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is disabled.\"},\"E3ProgramEnabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is enabled.\"},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\"},\"EncryptionSchemeDisabled(bytes32)\":{\"notice\":\"This event MUST be emitted any time an encryption scheme is disabled.\"},\"EncryptionSchemeEnabled(bytes32)\":{\"notice\":\"The event MUST be emitted any time an encryption scheme is enabled.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published.\"},\"MaxDurationSet(uint256)\":{\"notice\":\"This event MUST be emitted any time the `maxDuration` is set.\"},\"PlaintextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published.\"}},\"kind\":\"user\",\"methods\":{\"activate(uint256,bytes)\":{\"notice\":\"This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input.\"},\"getE3(uint256)\":{\"notice\":\"This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\"},\"getInputRoot(uint256)\":{\"notice\":\"This function returns root of the input merkle tree for a given E3.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function should be called to publish output data for an Encrypted Execution Environment (E3).\"},\"publishInput(uint256,bytes)\":{\"notice\":\"This function should be called to publish input data for Encrypted Execution Environment (E3).\"},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function publishes the plaintext output of an Encrypted Execution Environment (E3).\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"notice\":\"This function should be called to request a computation within an Encrypted Execution Environment (E3).\"},\"setMaxDuration(uint256)\":{\"notice\":\"This function should be called to set the maximum duration of requested computations.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Enclave.sol\":\"Enclave\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"@zk-kit/lean-imt.sol/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xb1944a1d9f63069b2f22260935adb2d11546f82fbb7d12d853a90134a92f4b5b\",\"license\":\"UNLICENSED\"},\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\nimport {SNARK_SCALAR_FIELD} from \\\"./Constants.sol\\\";\\n\\nstruct LeanIMTData {\\n // Tracks the current number of leaves in the tree.\\n uint256 size;\\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\\n uint256 depth;\\n // A mapping from each level of the tree to the node value of the last even position at that level.\\n // Used for efficient inserts, updates and root calculations.\\n mapping(uint256 => uint256) sideNodes;\\n // A mapping from leaf values to their respective indices in the tree.\\n // This facilitates checks for leaf existence and retrieval of leaf positions.\\n mapping(uint256 => uint256) leaves;\\n}\\n\\nerror WrongSiblingNodes();\\nerror LeafGreaterThanSnarkScalarField();\\nerror LeafCannotBeZero();\\nerror LeafAlreadyExists();\\nerror LeafDoesNotExist();\\n\\n/// @title Lean Incremental binary Merkle tree.\\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\\n/// it is updated based on the number of leaves in the tree. This approach\\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\\nlibrary InternalLeanIMT {\\n /// @dev Inserts a new leaf into the incremental merkle tree.\\n /// The function ensures that the leaf is valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the new leaf to be inserted into the tree.\\n /// @return The new hash of the node after the leaf has been inserted.\\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\\n if (leaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaf == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = self.size;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // A new insertion can increase a tree's depth by at most 1,\\n // and only if the number of leaves supported by the current\\n // depth is less than the number of leaves to be supported after insertion.\\n if (2 ** treeDepth < index + 1) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n uint256 node = leaf;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n node = PoseidonT3.hash([self.sideNodes[level], node]);\\n } else {\\n self.sideNodes[level] = node;\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n self.size = ++index;\\n\\n self.sideNodes[treeDepth] = node;\\n self.leaves[leaf] = index;\\n\\n return node;\\n }\\n\\n /// @dev Inserts many leaves into the incremental merkle tree.\\n /// The function ensures that the leaves are valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaves: The values of the new leaves to be inserted into the tree.\\n /// @return The root after the leaves have been inserted.\\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\\n // Cache tree size to optimize gas\\n uint256 treeSize = self.size;\\n\\n // Check that all the new values are correct to be added.\\n for (uint256 i = 0; i < leaves.length; ) {\\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaves[i] == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaves[i])) {\\n revert LeafAlreadyExists();\\n }\\n\\n self.leaves[leaves[i]] = treeSize + 1 + i;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Array to save the nodes that will be used to create the next level of the tree.\\n uint256[] memory currentLevelNewNodes;\\n\\n currentLevelNewNodes = leaves;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // Calculate the depth of the tree after adding the new values.\\n // Unlike the 'insert' function, we need a while here as\\n // N insertions can increase the tree's depth more than once.\\n while (2 ** treeDepth < treeSize + leaves.length) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n // First index to change in every level.\\n uint256 currentLevelStartIndex = treeSize;\\n\\n // Size of the level used to create the next level.\\n uint256 currentLevelSize = treeSize + leaves.length;\\n\\n // The index where changes begin at the next level.\\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\\n\\n // The size of the next level.\\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n // The number of nodes for the new level that will be created,\\n // only the new values, not the entire level.\\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\\n for (uint256 i = 0; i < numberOfNewNodes; ) {\\n uint256 leftNode;\\n\\n // Assign the left node using the saved path or the position in the array.\\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\\n leftNode = self.sideNodes[level];\\n } else {\\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\\n }\\n\\n uint256 rightNode;\\n\\n // Assign the right node if the value exists.\\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\\n }\\n\\n uint256 parentNode;\\n\\n // Assign the parent node.\\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\\n // it will be the leftNode.\\n if (rightNode != 0) {\\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\\n } else {\\n parentNode = leftNode;\\n }\\n\\n nextLevelNewNodes[i] = parentNode;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Update the `sideNodes` variable.\\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\\n // will be the value before the last one.\\n // If it is even and there is only one element, there is no need to save anything because\\n // the correct value for this level was already saved before.\\n if (currentLevelSize & 1 == 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\\n } else if (currentLevelNewNodes.length > 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\\n }\\n\\n currentLevelStartIndex = nextLevelStartIndex;\\n\\n // Calculate the next level startIndex value.\\n // It is the position of the parent node which is pos/2.\\n nextLevelStartIndex >>= 1;\\n\\n // Update the next array that will be used to calculate the next level.\\n currentLevelNewNodes = nextLevelNewNodes;\\n\\n currentLevelSize = nextLevelSize;\\n\\n // Calculate the size of the next level.\\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n // Update tree size\\n self.size = treeSize + leaves.length;\\n\\n // Update tree root\\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\\n\\n return currentLevelNewNodes[0];\\n }\\n\\n /// @dev Updates the value of an existing leaf and recalculates hashes\\n /// to maintain tree integrity.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf that is to be updated.\\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\\n /// @return The new hash of the updated node after the leaf has been updated.\\n function _update(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256 newLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n if (newLeaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (!_has(self, oldLeaf)) {\\n revert LeafDoesNotExist();\\n } else if (_has(self, newLeaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = _indexOf(self, oldLeaf);\\n uint256 node = newLeaf;\\n uint256 oldRoot = oldLeaf;\\n\\n uint256 lastIndex = self.size - 1;\\n uint256 i = 0;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([siblingNodes[i], node]);\\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n if (index >> level != lastIndex >> level) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([node, siblingNodes[i]]);\\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n self.sideNodes[i] = node;\\n }\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n if (oldRoot != _root(self)) {\\n revert WrongSiblingNodes();\\n }\\n\\n self.sideNodes[treeDepth] = node;\\n\\n if (newLeaf != 0) {\\n self.leaves[newLeaf] = self.leaves[oldLeaf];\\n }\\n\\n self.leaves[oldLeaf] = 0;\\n\\n return node;\\n }\\n\\n /// @dev Removes a leaf from the tree by setting its value to zero.\\n /// This function utilizes the update function to set the leaf's value\\n /// to zero and update the tree's state accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf to be removed.\\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\\n /// @return The new root hash of the tree after the leaf has been removed.\\n function _remove(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n return _update(self, oldLeaf, 0, siblingNodes);\\n }\\n\\n /// @dev Checks if a leaf exists in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf to check for existence.\\n /// @return A boolean value indicating whether the leaf exists in the tree.\\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\\n return self.leaves[leaf] != 0;\\n }\\n\\n /// @dev Retrieves the index of a given leaf in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf whose index is to be found.\\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\\n /// reverts with a custom error.\\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\\n if (self.leaves[leaf] == 0) {\\n revert LeafDoesNotExist();\\n }\\n\\n return self.leaves[leaf] - 1;\\n }\\n\\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\\n /// current tree depth.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @return The root hash of the tree.\\n function _root(LeanIMTData storage self) internal view returns (uint256) {\\n return self.sideNodes[self.depth];\\n }\\n}\\n\",\"keccak256\":\"0x6385ce9153d11d9824163464193d4ba3dd304e662dccd365ba2fc381a359762b\",\"license\":\"MIT\"},\"contracts/Enclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IEnclave, E3, IE3Program } from \\\"./interfaces/IEnclave.sol\\\";\\nimport { IInputValidator } from \\\"./interfaces/IInputValidator.sol\\\";\\nimport { ICiphernodeRegistry } from \\\"./interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./interfaces/IDecryptionVerifier.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n InternalLeanIMT,\\n LeanIMTData,\\n PoseidonT3\\n} from \\\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\\\";\\n\\ncontract Enclave is IEnclave, OwnableUpgradeable {\\n using InternalLeanIMT for LeanIMTData;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n ICiphernodeRegistry public ciphernodeRegistry; // address of the Ciphernode registry.\\n uint256 public maxDuration; // maximum duration of a computation in seconds.\\n uint256 public nexte3Id; // ID of the next E3.\\n uint256 public requests; // total number of requests made to Enclave.\\n\\n // Mapping of allowed E3 Programs.\\n mapping(IE3Program e3Program => bool allowed) public e3Programs;\\n\\n // Mapping of E3s.\\n mapping(uint256 e3Id => E3 e3) public e3s;\\n\\n // Mapping of input merkle trees.\\n mapping(uint256 e3Id => LeanIMTData imt) public inputs;\\n\\n // Mapping counting the number of inputs for each E3.\\n mapping(uint256 e3Id => uint256 inputCount) public inputCounts;\\n\\n // Mapping of enabled encryption schemes.\\n mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier)\\n public decryptionVerifiers;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeSelectionFailed();\\n error E3ProgramNotAllowed(IE3Program e3Program);\\n error E3AlreadyActivated(uint256 e3Id);\\n error E3Expired();\\n error E3NotActivated(uint256 e3Id);\\n error E3NotReady();\\n error E3DoesNotExist(uint256 e3Id);\\n error ModuleAlreadyEnabled(address module);\\n error ModuleNotEnabled(address module);\\n error InvalidEncryptionScheme(bytes32 encryptionSchemeId);\\n error InputDeadlinePassed(uint256 e3Id, uint256 expiration);\\n error InputDeadlineNotPassed(uint256 e3Id, uint256 expiration);\\n error InvalidComputationRequest(IInputValidator inputValidator);\\n error InvalidCiphernodeRegistry(ICiphernodeRegistry ciphernodeRegistry);\\n error InvalidDuration(uint256 duration);\\n error InvalidOutput(bytes output);\\n error InvalidInput();\\n error InvalidStartWindow();\\n error InvalidThreshold(uint32[2] threshold);\\n error CiphertextOutputAlreadyPublished(uint256 e3Id);\\n error CiphertextOutputNotPublished(uint256 e3Id);\\n error PaymentRequired(uint256 value);\\n error PlaintextOutputAlreadyPublished(uint256 e3Id);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n constructor(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration\\n ) {\\n initialize(_owner, _ciphernodeRegistry, _maxDuration);\\n }\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n function initialize(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration\\n ) public initializer {\\n __Ownable_init(msg.sender);\\n setMaxDuration(_maxDuration);\\n setCiphernodeRegistry(_ciphernodeRegistry);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3) {\\n // TODO: allow for other payment methods or only native tokens?\\n // TODO: should payment checks be somewhere else? Perhaps in the E3 Program or ciphernode registry?\\n require(msg.value > 0, PaymentRequired(msg.value));\\n require(\\n threshold[1] >= threshold[0] && threshold[0] > 0,\\n InvalidThreshold(threshold)\\n );\\n require(\\n // TODO: do we need a minimum start window to allow time for committee selection?\\n startWindow[1] >= startWindow[0] &&\\n startWindow[1] >= block.timestamp,\\n InvalidStartWindow()\\n );\\n require(\\n duration > 0 && duration <= maxDuration,\\n InvalidDuration(duration)\\n );\\n require(e3Programs[e3Program], E3ProgramNotAllowed(e3Program));\\n\\n // TODO: should IDs be incremental or produced deterministically?\\n e3Id = nexte3Id;\\n nexte3Id++;\\n uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id)));\\n\\n (bytes32 encryptionSchemeId, IInputValidator inputValidator) = e3Program\\n .validate(e3Id, seed, e3ProgramParams, computeProviderParams);\\n IDecryptionVerifier decryptionVerifier = decryptionVerifiers[\\n encryptionSchemeId\\n ];\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n require(\\n address(inputValidator) != address(0),\\n InvalidComputationRequest(inputValidator)\\n );\\n\\n e3 = E3({\\n seed: seed,\\n threshold: threshold,\\n requestBlock: block.number,\\n startWindow: startWindow,\\n duration: duration,\\n expiration: 0,\\n encryptionSchemeId: encryptionSchemeId,\\n e3Program: e3Program,\\n e3ProgramParams: e3ProgramParams,\\n inputValidator: inputValidator,\\n decryptionVerifier: decryptionVerifier,\\n committeePublicKey: hex\\\"\\\",\\n ciphertextOutput: hex\\\"\\\",\\n plaintextOutput: hex\\\"\\\"\\n });\\n e3s[e3Id] = e3;\\n\\n require(\\n ciphernodeRegistry.requestCommittee(e3Id, filter, threshold),\\n CommitteeSelectionFailed()\\n );\\n\\n emit E3Requested(e3Id, e3, filter, e3Program);\\n }\\n\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n require(e3.expiration == 0, E3AlreadyActivated(e3Id));\\n require(e3.startWindow[0] <= block.timestamp, E3NotReady());\\n // TODO: handle what happens to the payment if the start window has passed.\\n require(e3.startWindow[1] >= block.timestamp, E3Expired());\\n\\n bytes32 publicKeyHash = ciphernodeRegistry.committeePublicKey(e3Id);\\n require(\\n keccak256(publicKey) == publicKeyHash,\\n CommitteeSelectionFailed()\\n );\\n\\n e3s[e3Id].expiration = block.timestamp + e3.duration;\\n e3s[e3Id].committeePublicKey = keccak256(publicKey);\\n\\n emit E3Activated(e3Id, e3.expiration, publicKey);\\n\\n return true;\\n }\\n\\n function publishInput(\\n uint256 e3Id,\\n bytes memory data\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n // TODO: should we have an input window, including both a start and end timestamp?\\n require(\\n e3.expiration > block.timestamp,\\n InputDeadlinePassed(e3Id, e3.expiration)\\n );\\n\\n bytes memory input = e3.inputValidator.validate(msg.sender, data);\\n uint256 inputHash = PoseidonT3.hash(\\n [uint256(keccak256(input)), inputCounts[e3Id]]\\n );\\n\\n inputCounts[e3Id]++;\\n inputs[e3Id]._insert(inputHash);\\n success = true;\\n\\n emit InputPublished(e3Id, input, inputHash, inputCounts[e3Id] - 1);\\n }\\n\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.expiration <= block.timestamp,\\n InputDeadlineNotPassed(e3Id, e3.expiration)\\n );\\n // TODO: should the output verifier be able to change its mind?\\n //i.e. should we be able to call this multiple times?\\n require(\\n e3.ciphertextOutput == bytes32(0),\\n CiphertextOutputAlreadyPublished(e3Id)\\n );\\n bytes32 ciphertextOutputHash = keccak256(ciphertextOutput);\\n (success) = e3.e3Program.verify(e3Id, ciphertextOutputHash, proof);\\n require(success, InvalidOutput(ciphertextOutput));\\n e3s[e3Id].ciphertextOutput = ciphertextOutputHash;\\n\\n emit CiphertextOutputPublished(e3Id, ciphertextOutput);\\n }\\n\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.ciphertextOutput != bytes32(0),\\n CiphertextOutputNotPublished(e3Id)\\n );\\n require(\\n e3.plaintextOutput.length == 0,\\n PlaintextOutputAlreadyPublished(e3Id)\\n );\\n (success) = e3.decryptionVerifier.verify(\\n e3Id,\\n keccak256(plaintextOutput),\\n proof\\n );\\n require(success, InvalidOutput(plaintextOutput));\\n e3s[e3Id].plaintextOutput = plaintextOutput;\\n\\n emit PlaintextOutputPublished(e3Id, plaintextOutput);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) public onlyOwner returns (bool success) {\\n maxDuration = _maxDuration;\\n success = true;\\n emit MaxDurationSet(_maxDuration);\\n }\\n\\n function setCiphernodeRegistry(\\n ICiphernodeRegistry _ciphernodeRegistry\\n ) public onlyOwner returns (bool success) {\\n require(\\n address(_ciphernodeRegistry) != address(0) &&\\n _ciphernodeRegistry != ciphernodeRegistry,\\n InvalidCiphernodeRegistry(_ciphernodeRegistry)\\n );\\n ciphernodeRegistry = _ciphernodeRegistry;\\n success = true;\\n emit CiphernodeRegistrySet(address(_ciphernodeRegistry));\\n }\\n\\n function enableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(\\n !e3Programs[e3Program],\\n ModuleAlreadyEnabled(address(e3Program))\\n );\\n e3Programs[e3Program] = true;\\n success = true;\\n emit E3ProgramEnabled(e3Program);\\n }\\n\\n function disableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(e3Programs[e3Program], ModuleNotEnabled(address(e3Program)));\\n delete e3Programs[e3Program];\\n success = true;\\n emit E3ProgramDisabled(e3Program);\\n }\\n\\n function setDecryptionVerifier(\\n bytes32 encryptionSchemeId,\\n IDecryptionVerifier decryptionVerifier\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifier != IDecryptionVerifier(address(0)) &&\\n decryptionVerifiers[encryptionSchemeId] != decryptionVerifier,\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = decryptionVerifier;\\n success = true;\\n emit EncryptionSchemeEnabled(encryptionSchemeId);\\n }\\n\\n function disableEncryptionScheme(\\n bytes32 encryptionSchemeId\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = IDecryptionVerifier(\\n address(0)\\n );\\n success = true;\\n emit EncryptionSchemeDisabled(encryptionSchemeId);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function getE3(uint256 e3Id) public view returns (E3 memory e3) {\\n e3 = e3s[e3Id];\\n require(e3.e3Program != IE3Program(address(0)), E3DoesNotExist(e3Id));\\n }\\n\\n function getInputRoot(uint256 e3Id) public view returns (uint256) {\\n require(\\n e3s[e3Id].e3Program != IE3Program(address(0)),\\n E3DoesNotExist(e3Id)\\n );\\n return InternalLeanIMT._root(inputs[e3Id]);\\n }\\n\\n function getDecryptionVerifier(\\n bytes32 encryptionSchemeId\\n ) public view returns (IDecryptionVerifier) {\\n return decryptionVerifiers[encryptionSchemeId];\\n }\\n}\\n\",\"keccak256\":\"0x7e1c43df26c36b2954f7ca06376e3e6c24ad4efc6bd7144ed54c85595b49b035\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IDecryptionVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IDecryptionVerifier {\\n /// @notice This function should be called by the Enclave contract to verify the\\n /// decryption of output of a computation.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutputHash The keccak256 hash of the plaintext output to be verified.\\n /// @param proof ABI encoded proof of the given output hash.\\n /// @return success Whether or not the plaintextOutputHash was successfully verified.\\n function verify(\\n uint256 e3Id,\\n bytes32 plaintextOutputHash,\\n bytes memory proof\\n ) external view returns (bool success);\\n}\\n\",\"keccak256\":\"0xb92991a581d3c18cdc273497687ec1c6e3016674314f21fe56917aece5d10863\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\nimport { IE3Program } from \\\"./IE3Program.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./IDecryptionVerifier.sol\\\";\\n\\n/// @title E3 struct\\n/// @notice This struct represents an E3 computation.\\n/// @param threshold M/N threshold for the committee.\\n/// @param requestBlock Block number when the E3 was requested.\\n/// @param startWindow Start window for the computation: index zero is minimum, index 1 is the maxium.\\n/// @param duration Duration of the E3.\\n/// @param expiration Timestamp when committee duties expire.\\n/// @param e3Program Address of the E3 Program contract.\\n/// @param computeProvider Address of the compute provider contract.\\n/// @param inputValidator Address of the input validator contract.\\n/// @param decryptionVerifier Address of the output verifier contract.\\n/// @param committeeId ID of the selected committee.\\n/// @param ciphertextOutput Encrypted output data.\\n/// @param plaintextOutput Decrypted output data.\\nstruct E3 {\\n uint256 seed;\\n uint32[2] threshold;\\n uint256 requestBlock;\\n uint256[2] startWindow;\\n uint256 duration;\\n uint256 expiration;\\n bytes32 encryptionSchemeId;\\n IE3Program e3Program;\\n bytes e3ProgramParams;\\n IInputValidator inputValidator;\\n IDecryptionVerifier decryptionVerifier;\\n bytes32 committeePublicKey;\\n bytes32 ciphertextOutput;\\n bytes plaintextOutput;\\n}\\n\",\"keccak256\":\"0x16f12d3e46b12fcbff721eb8c358324fd400c95b40d57ed06b05e7afd590811e\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3Program.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\n\\ninterface IE3Program {\\n /// @notice This function should be called by the Enclave contract to validate the computation parameters.\\n /// @param e3Id ID of the E3.\\n /// @param seed Seed for the computation.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return encryptionSchemeId ID of the encryption scheme to be used for the computation.\\n /// @return inputValidator The input validator to be used for the computation.\\n function validate(\\n uint256 e3Id,\\n uint256 seed,\\n bytes calldata e3ProgramParams,\\n bytes calldata computeProviderParams\\n )\\n external\\n returns (bytes32 encryptionSchemeId, IInputValidator inputValidator);\\n\\n /// @notice This function should be called by the Enclave contract to verify the decrypted output of an E3.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutputHash The keccak256 hash of output data to be verified.\\n /// @param proof ABI encoded data to verify the ciphertextOutputHash.\\n /// @return success Whether the output data is valid.\\n function verify(\\n uint256 e3Id,\\n bytes32 ciphertextOutputHash,\\n bytes memory proof\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xd60e92b5b6498daf0b7f1238d354156c67d25c03caaaabbc601368e9e4a295b2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IEnclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { E3, IE3Program } from \\\"./IE3.sol\\\";\\n\\ninterface IEnclave {\\n ////////////////////////////////////////////////////////////\\n // //\\n // Events //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\\n /// @param e3Id ID of the E3.\\n /// @param e3 Details of the E3.\\n /// @param filter Address of the pool of nodes from which the Cipher Node committee was selected.\\n /// @param e3Program Address of the Computation module selected.\\n event E3Requested(\\n uint256 e3Id,\\n E3 e3,\\n address filter,\\n IE3Program indexed e3Program\\n );\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\\n /// @param e3Id ID of the E3.\\n /// @param expiration Timestamp when committee duties expire.\\n /// @param committeePublicKey Public key of the committee.\\n event E3Activated(\\n uint256 e3Id,\\n uint256 expiration,\\n bytes committeePublicKey\\n );\\n\\n /// @notice This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is\\n /// successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data.\\n event InputPublished(\\n uint256 indexed e3Id,\\n bytes data,\\n uint256 inputHash,\\n uint256 index\\n );\\n\\n /// @notice This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput);\\n\\n /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded ciphertext output.\\n event CiphertextOutputPublished(\\n uint256 indexed e3Id,\\n bytes ciphertextOutput\\n );\\n\\n /// @notice This event MUST be emitted any time the `maxDuration` is set.\\n /// @param maxDuration The maximum duration of a computation in seconds.\\n event MaxDurationSet(uint256 maxDuration);\\n\\n /// @notice This event MUST be emitted any time the CiphernodeRegistry is set.\\n /// @param ciphernodeRegistry The address of the CiphernodeRegistry contract.\\n event CiphernodeRegistrySet(address ciphernodeRegistry);\\n\\n /// @notice The event MUST be emitted any time an encryption scheme is enabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was enabled.\\n event EncryptionSchemeEnabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time an encryption scheme is disabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was disabled.\\n event EncryptionSchemeDisabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is enabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramEnabled(IE3Program e3Program);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is disabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramDisabled(IE3Program e3Program);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to request a computation within an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the E3Requested event.\\n /// @param filter IDs of the pool of nodes from which to select the committee.\\n /// @param threshold The M/N threshold for the committee.\\n /// @param duration The duration of the computation in seconds.\\n /// @param e3Program Address of the E3 Program.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return e3Id ID of the E3.\\n /// @return e3 The E3 struct.\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3);\\n\\n /// @notice This function should be called to activate an Encrypted Execution Environment (E3) once it has been\\n /// initialized and is ready for input.\\n /// @dev This function MUST emit the E3Activated event.\\n /// @dev This function MUST revert if the given E3 has not yet been requested.\\n /// @dev This function MUST revert if the selected node committee has not yet published a public key.\\n /// @param e3Id ID of the E3.\\n /// @param publicKey Public key of the committee.\\n /// @return success True if the E3 was successfully activated.\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish input data for Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 is not yet activated.\\n /// @dev This function MUST emit the InputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data to publish.\\n /// @return success True if the input was successfully published.\\n function publishInput(\\n uint256 e3Id,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish output data for an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the CiphertextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded output data to verify.\\n /// @param proof ABI encoded data to verify the ciphertextOutput.\\n /// @return success True if the output was successfully published.\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n /// @notice This function publishes the plaintext output of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the output has not been published.\\n /// @dev This function MUST emit the PlaintextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n /// @param proof ABI encoded data to verify the plaintextOutput.\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to set the maximum duration of requested computations.\\n /// @param _maxDuration The maximum duration of a computation in seconds.\\n /// @return success True if the max duration was successfully set.\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return e3 The struct representing the requested E3.\\n function getE3(uint256 e3Id) external view returns (E3 memory e3);\\n\\n /// @notice This function returns root of the input merkle tree for a given E3.\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return root The root of the input merkle tree.\\n function getInputRoot(uint256 e3Id) external view returns (uint256 root);\\n}\\n\",\"keccak256\":\"0xb1c9cd24aeb1dbf988555945ae532860c8a60a874f19020e48e29c9e3e5ebb64\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IInputValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IInputValidator {\\n /// @notice This function should be called by the Enclave contract to validate the\\n /// input of a computation.\\n /// @param sender The account that is submitting the input.\\n /// @param data The input to be verified.\\n /// @return input The decoded, policy-approved application payload.\\n function validate(\\n address sender,\\n bytes memory data\\n ) external returns (bytes memory input);\\n}\\n\",\"keccak256\":\"0x20d4016bd59c317c5571cfe6c3e8f46cbabddc0b926dc64019eeae8d29788653\",\"license\":\"LGPL-3.0-only\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6080346102a457601f61284638819003918201601f19168301916001600160401b038311848410176102a9578084926060946040528339810103126102a45780516001600160a01b0381168082036102a45760208301516001600160a01b03811693908490036102a457604090810151600080516020612826833981519152549182901c60ff161594916001600160401b0381168015908161029c575b6001149081610292575b159081610289575b50610278576001600160401b03198116600117600080516020612826833981519152557fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916020918761024d575b50610105610335565b61010d610335565b610116336102bf565b61011e610363565b80600155604051908152a1610131610363565b80151580610238575b1561022457600080546001600160a01b031916821790556040519081527f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690602090a1600080516020612806833981519152546001600160a01b03160361020d575b506101b1575b60405161246c908161039a8239f35b68ff0000000000000000196000805160206128268339815191525416600080516020612826833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a16101a2565b61021e90610219610363565b6102bf565b3861019c565b6375ac4eb760e11b60005260045260246000fd5b506000546001600160a01b031681141561013a565b6001600160481b031916680100000000000000011760008051602061282683398151915255386100fc565b63f92ee8a960e01b60005260046000fd5b905015386100ae565b303b1591506100a6565b87915061009c565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0316801561031f5760008051602061280683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff6000805160206128268339815191525460401c161561035257565b631afcd79f60e31b60005260046000fd5b600080516020612806833981519152546001600160a01b0316330361038457565b63118cdaa760e01b6000523360045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611b405780630ef81b2f14611b0b57806310bc628114611b0b5780631794bb3c146118e55780634017daf0146117f8578063406ed35c146117c55780634e92ec63146117375780634fc77264146116975780635314e9fa1461150d5780636db5c8fd146114ef578063715018a6146114565780637edcd7ab146111fd5780638da5cb5b146111b75780638dcdd86b1461119057806393b58f861461099b5780639c8570c814610828578063b3c88d67146107fc578063b74cb2db146107de578063c4ccafa21461079f578063cb64961714610781578063cbd16872146106c8578063cf0f34c4146106aa578063d016b08d14610279578063ddef9ea114610244578063f2fde38b14610219578063fad8e111146101ec5763fd2f3d011461014557600080fd5b346101e75760203660031901126101e7576001600160a01b03610166611ba5565b61016e6123d7565b1680600052600460205260ff604060002054166101d3576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101e75760203660031901126101e757602061020f61020a611ba5565b61234c565b6040519015158152f35b346101e75760203660031901126101e757610242610235611ba5565b61023d6123d7565b6122a6565b005b346101e75760203660031901126101e75760043560005260066020526040806000206001815491015482519182526020820152f35b346101e75761028736611ec0565b61029082611fea565b60a081016102a1848251151561213a565b514281111561069257506102ec6000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611d17565b03925af180156105915760009061060d575b61035a9150733333333C0A88F9BE4fd23ed0536F9B6c427e3B93602060405161032681611c12565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b835260048301612278565b0381845af4928315610591576000936105d9575b508360005260076020526040600020610387815461222d565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103cf576361c0541760e11b60005260046000fd5b836103e5576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105c857805491600182019283549360ff85116104d257600182018083116104d2576001861b106105b8575b84905585916000905b8582106104e8575050906104416003939261222d565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104d2577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104b992604051938493606085526060850190611d17565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c161460001461059d57602061053c916040519061050c82611c12565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b835260048301612278565b0381855af480156105915760009061055c575b60019150935b019061042b565b6020823d8211610589575b8161057460209383611c2e565b8101031261058657506001905161054f565b80fd5b3d9150610567565b6040513d6000823e3d90fd5b92806001916000526002860160205284604060002055610555565b936105c29061222d565b93610422565b6312c50cad60e11b60005260046000fd5b90926020823d602011610605575b816105f460209383611c2e565b81010312610586575051918461036e565b3d91506105e7565b3d8082843e61061c8184611c2e565b82019160208184031261068a5780519067ffffffffffffffff821161068e570182601f8201121561068a5780519161065383611e5d565b936106616040519586611c2e565b83855260208484010111610586575082916106859160208061035a96019101611cf4565b6102fe565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101e75760203660031901126101e757602061020f60043561223c565b346101e75760403660031901126101e7576004356024356001600160a01b0381168091036101e7577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161071d6123d7565b801515828161075f575b6107309161211e565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b0316821415905082610727565b346101e75760003660031901126101e7576020600254604051908152f35b346101e75760203660031901126101e7576001600160a01b036107c0611ba5565b166000526004602052602060ff604060002054166040519015158152f35b346101e75760003660031901126101e7576020600354604051908152f35b346101e75760203660031901126101e75760043560005260076020526020604060002054604051908152f35b346101e75761083636611ef0565b9161084081611fea565b9160a08301610852838251151561213a565b51428111610983575061018083015161096e5760206108a06000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a6004850161216e565b03925af192831561059157602094600094610917575b508161090a916108e77f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade071948761218a565b8460005260058752600d6040600020015560405191829187835287830190611d17565b0390a26040519015158152f35b61090a9194509161095e7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d8911610967575b6109568183611c2e565b810190612156565b949150916108b6565b503d61094c565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101e7576109b0611ba5565b366064116101e7573660a4116101e75760a43560c435916001600160a01b03831683036101e75760e43567ffffffffffffffff81116101e7576109f7903690600401611e79565b906101043567ffffffffffffffff81116101e757610a19903690600401611e79565b90610a22611f5b565b50341561117b5760443563ffffffff8116908181036101e7575063ffffffff610a496121d2565b16111580611165575b1561114757608435606435811015908161113c575b501561112b578315158061111f575b1561110a576001600160a01b038516600052600460205260ff60406000205416156110ec57610b149060025493610aac8561222d565b6002556040805160208101904482528783820152828152610ace606082611c2e565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b026084840187611d17565b83810360031901606485015290611d17565b038160006001600160a01b038c165af190811561059157600093849261109b575b506000848152600860205260409020546001600160a01b0390811692610b5d8685151561211e565b169081156110865760405195610b7287611bf5565b8652604094855198610b84878b611c2e565b6000996024815b6064821061106e575050602089015243878901528651610bab8882611c2e565b6064815b60a4821061105e575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c0c8782611c2e565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110365750505060018201558385015160028201556060850151825b600281106110215750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610f6257610cc56009840154611bbb565b601f8111610ff0575b508890601f8311600114610f8157600e939291859183610f76575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610f62578190610d948454611bbb565b601f8111610f29575b508990601f8311600114610ec6578592610ebb575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e03604484016121f6565b5af1908115610eb1578291610e94575b5015610e8557507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610e81959697845191829189835260608b840152610e646060840189611d3c565b958784015216930390a28080519586958652850152830190611d3c565b0390f35b630d8dbe2560e01b8152600490fd5b610eab9150873d8911610967576109568183611c2e565b88610e13565b84513d84823e3d90fd5b015190508a80610db2565b8486528a86209250601f198416865b8c828210610f13575050908460019594939210610efa575b505050811b019055610dc7565b015160001960f88460031b161c191690558a8080610eed565b6001859682939686015181550195019301610ed5565b610f52908587528b8720601f850160051c8101918d8610610f58575b601f0160051c01906121bb565b8b610d9d565b9091508190610f45565b634e487b7160e01b84526041600452602484fd5b015190508b80610ce9565b9060098401855289852091855b8b601f1986168210610fda575050918391600193600e9695601f19811610610fc1575b505050811b016009820155610d01565b015160001960f88460031b161c191690558b8080610fb1565b6001849582939585015181550194019201610f8e565b61101b906009850186528a8620601f850160051c8101918c8610610f5857601f0160051c01906121bb565b8a610cce565b81518382016003015590880190600101610c4d565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c2c565b8135815260209182019101610baf565b6020809161107b846121e5565b815201910190610b8b565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d6040116110e4575b816110b760409383611c2e565b810103126110e05760208151910151936001600160a01b03851685036105865750929088610b35565b8380fd5b3d91506110aa565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610a76565b6308594fb760e01b60005260046000fd5b905042111586610a67565b604051633744092160e21b8152604490611163600482016121f6565bfd5b5063ffffffff6111736121d2565b161515610a52565b638c4fcd9360e01b6000523460045260246000fd5b346101e75760003660031901126101e75760206001600160a01b0360005416604051908152f35b346101e75760003660031901126101e75760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101e75761120b36611ef0565b611216839293611fea565b6112268360a0830151151561213a565b61018081015115611441576101a08101515161142c5761127592916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b8452886004850161216e565b03915afa9182156105915760009261140b575b50611293838361218a565b806000526005602052600e6040600020019280519367ffffffffffffffff85116113f5576020946112c48254611bbb565b601f81116113c5575b5085601f821160011461133c5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261090a94600091611331575b508160011b916000199060031b1c19161790555b60405191829187835287830190611d17565b90508301518961130b565b601f1982169083600052806000209160005b8181106113ae57509261090a9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169989610611395575b5050811b01905561131f565b85015160001960f88460031b161c191690558980611389565b91928960018192868a01518155019401920161134e565b6113ef908360005287600020601f840160051c810191898510610f5857601f0160051c01906121bb565b866112cd565b634e487b7160e01b600052604160045260246000fd5b61142591925060203d602011610967576109568183611c2e565b9083611288565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101e75760003660031901126101e75761146f6123d7565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101e75760003660031901126101e7576020600154604051908152f35b346101e75761151b36611ec0565b61152482611fea565b9160a083018051611682576060840180515142106116715760204291510151106116605760249360206001600160a01b036000541660405196878092630e82f3b760e41b82528760048301525afa9485156105915760009561162c575b50835194602085019586200361161b57608001514201908142116104d2577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899461160d9284600052600560205260066040600020015584519020836000526005602052600c60406000200155519260405193849384526020840152606060408401526060830190611d17565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9094506020813d602011611658575b8161164860209383611c2e565b810103126101e757519385611581565b3d915061163b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b50633e26347b60e21b60005260045260246000fd5b346101e75760203660031901126101e7576001600160a01b036116b8611ba5565b6116c06123d7565b1680600052600460205260ff6040600020541615611723576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101e75760203660031901126101e7577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc60206004356117766123d7565b8060005260088252611798816001600160a01b0360406000205416151561211e565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101e75760203660031901126101e757610e816117e4600435611fea565b604051918291602083526020830190611d3c565b346101e75760203660031901126101e757600435600052600560205260206040600020610e8181549160028101546005820154916006810154926007820154936118bf6001600160a01b0360088501541661185560098601611c50565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c8801549661188b600e600d8b01549a01611c50565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611d17565b9460e0880152610100870152610120860152610140850152838203610160850152611d17565b346101e75760603660031901126101e7576118fe611ba5565b602435906001600160a01b03821682036101e7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159267ffffffffffffffff821680159081611b03575b6001149081611af9575b159081611af0575b50611adf5767ffffffffffffffff1982166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556119ce9184611aa0575b506119ac61241f565b6119b461241f565b6119bd336122a6565b6119c860443561223c565b5061234c565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b03821603611a8e575b50611a1157005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b611a9a9061023d6123d7565b81611a0a565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055846119a3565b63f92ee8a960e01b60005260046000fd5b90501585611963565b303b15915061195b565b859150611951565b346101e75760203660031901126101e757600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101e75760203660031901126101e757600435806000526005602052611b7a816001600160a01b03600860406000200154161515611f3f565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b600435906001600160a01b03821682036101e757565b90600182811c92168015611beb575b6020831014611bd557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bca565b6101c0810190811067ffffffffffffffff8211176113f557604052565b6040810190811067ffffffffffffffff8211176113f557604052565b90601f8019910116810190811067ffffffffffffffff8211176113f557604052565b9060405191826000825492611c6484611bbb565b8084529360018116908115611cd25750600114611c8b575b50611c8992500383611c2e565b565b90506000929192526020600020906000915b818310611cb6575050906020611c899282010138611c7c565b6020919350806001915483858901015201910190918492611c9d565b905060209250611c8994915060ff191682840152151560051b82010138611c7c565b60005b838110611d075750506000910152565b8181015183820152602001611cf7565b90602091611d3081518092818552858086019101611cf4565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611e415750505060408101516060840152606081015192608081016000905b60028210611e2b575050611e28929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611dd6610100840151610200610140850152610200840190611d17565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611d17565b90565b6020806001928851815201960191019094611d73565b60208060019263ffffffff865116815201930191019091611d50565b67ffffffffffffffff81116113f557601f01601f191660200190565b81601f820112156101e757803590611e9082611e5d565b92611e9e6040519485611c2e565b828452602083830101116101e757816000926020809301838601378301015290565b9060406003198301126101e757600435916024359067ffffffffffffffff82116101e757611e2891600401611e79565b60606003198201126101e7576004359160243567ffffffffffffffff81116101e75782611f1f91600401611e79565b916044359067ffffffffffffffff82116101e757611e2891600401611e79565b15611f475750565b63cd6f4a4f60e01b60005260045260246000fd5b60405190611f6882611bf5565b60606101a0836000815260408051611f808282611c2e565b813682376020830152600081830152805190611f9c8183611c2e565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b90611ff3611f5b565b5081600052600560205260406000209160405161200f81611bf5565b8354815260405163ffffffff6001860154818116835260201c166020820152612039604082611c2e565b6020820152600284015460408201526040518060038601906000905b6002821061210857505050611c8992918161207960406001600160a01b0394611c2e565b606082015260058601546080820152600686015460a0820152600786015460c08201526120f8600e836008890154169760e084019889526120bc60098201611c50565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611c50565b6101a08201529451161515611f3f565b6001602081928554815201930191019091612055565b156121265750565b6381c4951960e01b60005260045260246000fd5b156121425750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101e7575180151581036101e75790565b611e289392606092825260208201528160408201520190611d17565b156121925750565b604051632f9f8ab960e01b8152602060048201529081906121b7906024830190611d17565b0390fd5b8181106121c6575050565b600081556001016121bb565b60243563ffffffff811681036101e75790565b359063ffffffff821682036101e757565b6024906000905b6002821061220a57505050565b60208060019263ffffffff61221e876121e5565b168152019301910190916121fd565b60001981146104d25760010190565b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916122686123d7565b80600155604051908152a1600190565b919060408301926000905b6002821061229057505050565b6020806001928551815201930191019091612283565b6001600160a01b03168015612336576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b039061235d6123d7565b16801515806123c2575b156123ae576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b0360005416811415612367565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361240a57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561244e57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611b405780630ef81b2f14611b0b57806310bc628114611b0b5780631794bb3c146118e55780634017daf0146117f8578063406ed35c146117c55780634e92ec63146117375780634fc77264146116975780635314e9fa1461150d5780636db5c8fd146114ef578063715018a6146114565780637edcd7ab146111fd5780638da5cb5b146111b75780638dcdd86b1461119057806393b58f861461099b5780639c8570c814610828578063b3c88d67146107fc578063b74cb2db146107de578063c4ccafa21461079f578063cb64961714610781578063cbd16872146106c8578063cf0f34c4146106aa578063d016b08d14610279578063ddef9ea114610244578063f2fde38b14610219578063fad8e111146101ec5763fd2f3d011461014557600080fd5b346101e75760203660031901126101e7576001600160a01b03610166611ba5565b61016e6123d7565b1680600052600460205260ff604060002054166101d3576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101e75760203660031901126101e757602061020f61020a611ba5565b61234c565b6040519015158152f35b346101e75760203660031901126101e757610242610235611ba5565b61023d6123d7565b6122a6565b005b346101e75760203660031901126101e75760043560005260066020526040806000206001815491015482519182526020820152f35b346101e75761028736611ec0565b61029082611fea565b60a081016102a1848251151561213a565b514281111561069257506102ec6000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611d17565b03925af180156105915760009061060d575b61035a915073__$75f79a42d9bcbdbb69ad79ebd80f556f39$__602060405161032681611c12565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b835260048301612278565b0381845af4928315610591576000936105d9575b508360005260076020526040600020610387815461222d565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103cf576361c0541760e11b60005260046000fd5b836103e5576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105c857805491600182019283549360ff85116104d257600182018083116104d2576001861b106105b8575b84905585916000905b8582106104e8575050906104416003939261222d565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104d2577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104b992604051938493606085526060850190611d17565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c161460001461059d57602061053c916040519061050c82611c12565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b835260048301612278565b0381855af480156105915760009061055c575b60019150935b019061042b565b6020823d8211610589575b8161057460209383611c2e565b8101031261058657506001905161054f565b80fd5b3d9150610567565b6040513d6000823e3d90fd5b92806001916000526002860160205284604060002055610555565b936105c29061222d565b93610422565b6312c50cad60e11b60005260046000fd5b90926020823d602011610605575b816105f460209383611c2e565b81010312610586575051918461036e565b3d91506105e7565b3d8082843e61061c8184611c2e565b82019160208184031261068a5780519067ffffffffffffffff821161068e570182601f8201121561068a5780519161065383611e5d565b936106616040519586611c2e565b83855260208484010111610586575082916106859160208061035a96019101611cf4565b6102fe565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101e75760203660031901126101e757602061020f60043561223c565b346101e75760403660031901126101e7576004356024356001600160a01b0381168091036101e7577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161071d6123d7565b801515828161075f575b6107309161211e565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b0316821415905082610727565b346101e75760003660031901126101e7576020600254604051908152f35b346101e75760203660031901126101e7576001600160a01b036107c0611ba5565b166000526004602052602060ff604060002054166040519015158152f35b346101e75760003660031901126101e7576020600354604051908152f35b346101e75760203660031901126101e75760043560005260076020526020604060002054604051908152f35b346101e75761083636611ef0565b9161084081611fea565b9160a08301610852838251151561213a565b51428111610983575061018083015161096e5760206108a06000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a6004850161216e565b03925af192831561059157602094600094610917575b508161090a916108e77f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade071948761218a565b8460005260058752600d6040600020015560405191829187835287830190611d17565b0390a26040519015158152f35b61090a9194509161095e7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d8911610967575b6109568183611c2e565b810190612156565b949150916108b6565b503d61094c565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101e7576109b0611ba5565b366064116101e7573660a4116101e75760a43560c435916001600160a01b03831683036101e75760e43567ffffffffffffffff81116101e7576109f7903690600401611e79565b906101043567ffffffffffffffff81116101e757610a19903690600401611e79565b90610a22611f5b565b50341561117b5760443563ffffffff8116908181036101e7575063ffffffff610a496121d2565b16111580611165575b1561114757608435606435811015908161113c575b501561112b578315158061111f575b1561110a576001600160a01b038516600052600460205260ff60406000205416156110ec57610b149060025493610aac8561222d565b6002556040805160208101904482528783820152828152610ace606082611c2e565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b026084840187611d17565b83810360031901606485015290611d17565b038160006001600160a01b038c165af190811561059157600093849261109b575b506000848152600860205260409020546001600160a01b0390811692610b5d8685151561211e565b169081156110865760405195610b7287611bf5565b8652604094855198610b84878b611c2e565b6000996024815b6064821061106e575050602089015243878901528651610bab8882611c2e565b6064815b60a4821061105e575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c0c8782611c2e565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110365750505060018201558385015160028201556060850151825b600281106110215750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610f6257610cc56009840154611bbb565b601f8111610ff0575b508890601f8311600114610f8157600e939291859183610f76575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610f62578190610d948454611bbb565b601f8111610f29575b508990601f8311600114610ec6578592610ebb575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e03604484016121f6565b5af1908115610eb1578291610e94575b5015610e8557507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610e81959697845191829189835260608b840152610e646060840189611d3c565b958784015216930390a28080519586958652850152830190611d3c565b0390f35b630d8dbe2560e01b8152600490fd5b610eab9150873d8911610967576109568183611c2e565b88610e13565b84513d84823e3d90fd5b015190508a80610db2565b8486528a86209250601f198416865b8c828210610f13575050908460019594939210610efa575b505050811b019055610dc7565b015160001960f88460031b161c191690558a8080610eed565b6001859682939686015181550195019301610ed5565b610f52908587528b8720601f850160051c8101918d8610610f58575b601f0160051c01906121bb565b8b610d9d565b9091508190610f45565b634e487b7160e01b84526041600452602484fd5b015190508b80610ce9565b9060098401855289852091855b8b601f1986168210610fda575050918391600193600e9695601f19811610610fc1575b505050811b016009820155610d01565b015160001960f88460031b161c191690558b8080610fb1565b6001849582939585015181550194019201610f8e565b61101b906009850186528a8620601f850160051c8101918c8610610f5857601f0160051c01906121bb565b8a610cce565b81518382016003015590880190600101610c4d565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c2c565b8135815260209182019101610baf565b6020809161107b846121e5565b815201910190610b8b565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d6040116110e4575b816110b760409383611c2e565b810103126110e05760208151910151936001600160a01b03851685036105865750929088610b35565b8380fd5b3d91506110aa565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610a76565b6308594fb760e01b60005260046000fd5b905042111586610a67565b604051633744092160e21b8152604490611163600482016121f6565bfd5b5063ffffffff6111736121d2565b161515610a52565b638c4fcd9360e01b6000523460045260246000fd5b346101e75760003660031901126101e75760206001600160a01b0360005416604051908152f35b346101e75760003660031901126101e75760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101e75761120b36611ef0565b611216839293611fea565b6112268360a0830151151561213a565b61018081015115611441576101a08101515161142c5761127592916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b8452886004850161216e565b03915afa9182156105915760009261140b575b50611293838361218a565b806000526005602052600e6040600020019280519367ffffffffffffffff85116113f5576020946112c48254611bbb565b601f81116113c5575b5085601f821160011461133c5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261090a94600091611331575b508160011b916000199060031b1c19161790555b60405191829187835287830190611d17565b90508301518961130b565b601f1982169083600052806000209160005b8181106113ae57509261090a9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169989610611395575b5050811b01905561131f565b85015160001960f88460031b161c191690558980611389565b91928960018192868a01518155019401920161134e565b6113ef908360005287600020601f840160051c810191898510610f5857601f0160051c01906121bb565b866112cd565b634e487b7160e01b600052604160045260246000fd5b61142591925060203d602011610967576109568183611c2e565b9083611288565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101e75760003660031901126101e75761146f6123d7565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101e75760003660031901126101e7576020600154604051908152f35b346101e75761151b36611ec0565b61152482611fea565b9160a083018051611682576060840180515142106116715760204291510151106116605760249360206001600160a01b036000541660405196878092630e82f3b760e41b82528760048301525afa9485156105915760009561162c575b50835194602085019586200361161b57608001514201908142116104d2577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899461160d9284600052600560205260066040600020015584519020836000526005602052600c60406000200155519260405193849384526020840152606060408401526060830190611d17565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9094506020813d602011611658575b8161164860209383611c2e565b810103126101e757519385611581565b3d915061163b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b50633e26347b60e21b60005260045260246000fd5b346101e75760203660031901126101e7576001600160a01b036116b8611ba5565b6116c06123d7565b1680600052600460205260ff6040600020541615611723576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101e75760203660031901126101e7577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc60206004356117766123d7565b8060005260088252611798816001600160a01b0360406000205416151561211e565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101e75760203660031901126101e757610e816117e4600435611fea565b604051918291602083526020830190611d3c565b346101e75760203660031901126101e757600435600052600560205260206040600020610e8181549160028101546005820154916006810154926007820154936118bf6001600160a01b0360088501541661185560098601611c50565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c8801549661188b600e600d8b01549a01611c50565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611d17565b9460e0880152610100870152610120860152610140850152838203610160850152611d17565b346101e75760603660031901126101e7576118fe611ba5565b602435906001600160a01b03821682036101e7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159267ffffffffffffffff821680159081611b03575b6001149081611af9575b159081611af0575b50611adf5767ffffffffffffffff1982166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556119ce9184611aa0575b506119ac61241f565b6119b461241f565b6119bd336122a6565b6119c860443561223c565b5061234c565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b03821603611a8e575b50611a1157005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b611a9a9061023d6123d7565b81611a0a565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055846119a3565b63f92ee8a960e01b60005260046000fd5b90501585611963565b303b15915061195b565b859150611951565b346101e75760203660031901126101e757600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101e75760203660031901126101e757600435806000526005602052611b7a816001600160a01b03600860406000200154161515611f3f565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b600435906001600160a01b03821682036101e757565b90600182811c92168015611beb575b6020831014611bd557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bca565b6101c0810190811067ffffffffffffffff8211176113f557604052565b6040810190811067ffffffffffffffff8211176113f557604052565b90601f8019910116810190811067ffffffffffffffff8211176113f557604052565b9060405191826000825492611c6484611bbb565b8084529360018116908115611cd25750600114611c8b575b50611c8992500383611c2e565b565b90506000929192526020600020906000915b818310611cb6575050906020611c899282010138611c7c565b6020919350806001915483858901015201910190918492611c9d565b905060209250611c8994915060ff191682840152151560051b82010138611c7c565b60005b838110611d075750506000910152565b8181015183820152602001611cf7565b90602091611d3081518092818552858086019101611cf4565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611e415750505060408101516060840152606081015192608081016000905b60028210611e2b575050611e28929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611dd6610100840151610200610140850152610200840190611d17565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611d17565b90565b6020806001928851815201960191019094611d73565b60208060019263ffffffff865116815201930191019091611d50565b67ffffffffffffffff81116113f557601f01601f191660200190565b81601f820112156101e757803590611e9082611e5d565b92611e9e6040519485611c2e565b828452602083830101116101e757816000926020809301838601378301015290565b9060406003198301126101e757600435916024359067ffffffffffffffff82116101e757611e2891600401611e79565b60606003198201126101e7576004359160243567ffffffffffffffff81116101e75782611f1f91600401611e79565b916044359067ffffffffffffffff82116101e757611e2891600401611e79565b15611f475750565b63cd6f4a4f60e01b60005260045260246000fd5b60405190611f6882611bf5565b60606101a0836000815260408051611f808282611c2e565b813682376020830152600081830152805190611f9c8183611c2e565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b90611ff3611f5b565b5081600052600560205260406000209160405161200f81611bf5565b8354815260405163ffffffff6001860154818116835260201c166020820152612039604082611c2e565b6020820152600284015460408201526040518060038601906000905b6002821061210857505050611c8992918161207960406001600160a01b0394611c2e565b606082015260058601546080820152600686015460a0820152600786015460c08201526120f8600e836008890154169760e084019889526120bc60098201611c50565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611c50565b6101a08201529451161515611f3f565b6001602081928554815201930191019091612055565b156121265750565b6381c4951960e01b60005260045260246000fd5b156121425750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101e7575180151581036101e75790565b611e289392606092825260208201528160408201520190611d17565b156121925750565b604051632f9f8ab960e01b8152602060048201529081906121b7906024830190611d17565b0390fd5b8181106121c6575050565b600081556001016121bb565b60243563ffffffff811681036101e75790565b359063ffffffff821682036101e757565b6024906000905b6002821061220a57505050565b60208060019263ffffffff61221e876121e5565b168152019301910190916121fd565b60001981146104d25760010190565b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916122686123d7565b80600155604051908152a1600190565b919060408301926000905b6002821061229057505050565b6020806001928551815201930191019091612283565b6001600160a01b03168015612336576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b039061235d6123d7565b16801515806123c2575b156123ae576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b0360005416811415612367565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361240a57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561244e57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a", + "numDeployments": 3, + "solcInputHash": "1560ab6aa11f44088d4445eb3d74156d", + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeSelectionFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3AlreadyActivated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3DoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3Expired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3NotActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3NotReady\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlineNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlinePassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"InvalidCiphernodeRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"}],\"name\":\"InvalidComputationRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"InvalidEncryptionScheme\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"output\",\"type\":\"bytes\"}],\"name\":\"InvalidOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStartWindow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafGreaterThanSnarkScalarField\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"PaymentRequired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"PlaintextOutputAlreadyPublished\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"CiphernodeRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"}],\"name\":\"CiphertextOutputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"committeePublicKey\",\"type\":\"bytes\"}],\"name\":\"E3Activated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3Requested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inputHash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"InputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxDuration\",\"type\":\"uint256\"}],\"name\":\"MaxDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"name\":\"PlaintextOutputPublished\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"activate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ciphernodeRegistry\",\"outputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"decryptionVerifiers\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"disableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"disableEncryptionScheme\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"e3Programs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"e3s\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"enableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"getDecryptionVerifier\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getE3\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getInputRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputCounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"inputCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nexte3Id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishCiphertextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"publishInput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishPlaintextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"computeProviderParams\",\"type\":\"bytes\"}],\"name\":\"request\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"setCiphernodeRegistry\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"name\":\"setDecryptionVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"setMaxDuration\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"CiphernodeRegistrySet(address)\":{\"params\":{\"ciphernodeRegistry\":\"The address of the CiphernodeRegistry contract.\"}},\"CiphertextOutputPublished(uint256,bytes)\":{\"params\":{\"ciphertextOutput\":\"ABI encoded ciphertext output.\",\"e3Id\":\"ID of the E3.\"}},\"E3Activated(uint256,uint256,bytes)\":{\"params\":{\"committeePublicKey\":\"Public key of the committee.\",\"e3Id\":\"ID of the E3.\",\"expiration\":\"Timestamp when committee duties expire.\"}},\"E3ProgramDisabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3ProgramEnabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"params\":{\"e3\":\"Details of the E3.\",\"e3Id\":\"ID of the E3.\",\"e3Program\":\"Address of the Computation module selected.\",\"filter\":\"Address of the pool of nodes from which the Cipher Node committee was selected.\"}},\"EncryptionSchemeDisabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was disabled.\"}},\"EncryptionSchemeEnabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was enabled.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"params\":{\"data\":\"ABI encoded input data.\",\"e3Id\":\"ID of the E3.\"}},\"MaxDurationSet(uint256)\":{\"params\":{\"maxDuration\":\"The maximum duration of a computation in seconds.\"}},\"PlaintextOutputPublished(uint256,bytes)\":{\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\"}}},\"kind\":\"dev\",\"methods\":{\"activate(uint256,bytes)\":{\"details\":\"This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"publicKey\":\"Public key of the committee.\"},\"returns\":{\"success\":\"True if the E3 was successfully activated.\"}},\"constructor\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"getE3(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"e3\":\"The struct representing the requested E3.\"}},\"getInputRoot(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"_0\":\"The root of the input merkle tree.\"}},\"initialize(address,address,uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST emit the CiphertextOutputPublished event.\",\"params\":{\"ciphertextOutput\":\"ABI encoded output data to verify.\",\"e3Id\":\"ID of the E3.\",\"proof\":\"ABI encoded data to verify the ciphertextOutput.\"},\"returns\":{\"success\":\"True if the output was successfully published.\"}},\"publishInput(uint256,bytes)\":{\"details\":\"This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.\",\"params\":{\"data\":\"ABI encoded input data to publish.\",\"e3Id\":\"ID of the E3.\"},\"returns\":{\"success\":\"True if the input was successfully published.\"}},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\",\"proof\":\"ABI encoded data to verify the plaintextOutput.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"details\":\"This function MUST emit the E3Requested event.\",\"params\":{\"computeProviderParams\":\"ABI encoded compute provider parameters.\",\"duration\":\"The duration of the computation in seconds.\",\"e3Program\":\"Address of the E3 Program.\",\"e3ProgramParams\":\"ABI encoded computation parameters.\",\"filter\":\"IDs of the pool of nodes from which to select the committee.\",\"threshold\":\"The M/N threshold for the committee.\"},\"returns\":{\"e3\":\"The E3 struct.\",\"e3Id\":\"ID of the E3.\"}},\"setMaxDuration(uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds.\"},\"returns\":{\"success\":\"True if the max duration was successfully set.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"CiphernodeRegistrySet(address)\":{\"notice\":\"This event MUST be emitted any time the CiphernodeRegistry is set.\"},\"CiphertextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published.\"},\"E3Activated(uint256,uint256,bytes)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\"},\"E3ProgramDisabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is disabled.\"},\"E3ProgramEnabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is enabled.\"},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\"},\"EncryptionSchemeDisabled(bytes32)\":{\"notice\":\"This event MUST be emitted any time an encryption scheme is disabled.\"},\"EncryptionSchemeEnabled(bytes32)\":{\"notice\":\"The event MUST be emitted any time an encryption scheme is enabled.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published.\"},\"MaxDurationSet(uint256)\":{\"notice\":\"This event MUST be emitted any time the `maxDuration` is set.\"},\"PlaintextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published.\"}},\"kind\":\"user\",\"methods\":{\"activate(uint256,bytes)\":{\"notice\":\"This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input.\"},\"getE3(uint256)\":{\"notice\":\"This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\"},\"getInputRoot(uint256)\":{\"notice\":\"This function returns root of the input merkle tree for a given E3.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function should be called to publish output data for an Encrypted Execution Environment (E3).\"},\"publishInput(uint256,bytes)\":{\"notice\":\"This function should be called to publish input data for Encrypted Execution Environment (E3).\"},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function publishes the plaintext output of an Encrypted Execution Environment (E3).\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"notice\":\"This function should be called to request a computation within an Encrypted Execution Environment (E3).\"},\"setMaxDuration(uint256)\":{\"notice\":\"This function should be called to set the maximum duration of requested computations.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Enclave.sol\":\"Enclave\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"@zk-kit/lean-imt.sol/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xb1944a1d9f63069b2f22260935adb2d11546f82fbb7d12d853a90134a92f4b5b\",\"license\":\"UNLICENSED\"},\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\nimport {SNARK_SCALAR_FIELD} from \\\"./Constants.sol\\\";\\n\\nstruct LeanIMTData {\\n // Tracks the current number of leaves in the tree.\\n uint256 size;\\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\\n uint256 depth;\\n // A mapping from each level of the tree to the node value of the last even position at that level.\\n // Used for efficient inserts, updates and root calculations.\\n mapping(uint256 => uint256) sideNodes;\\n // A mapping from leaf values to their respective indices in the tree.\\n // This facilitates checks for leaf existence and retrieval of leaf positions.\\n mapping(uint256 => uint256) leaves;\\n}\\n\\nerror WrongSiblingNodes();\\nerror LeafGreaterThanSnarkScalarField();\\nerror LeafCannotBeZero();\\nerror LeafAlreadyExists();\\nerror LeafDoesNotExist();\\n\\n/// @title Lean Incremental binary Merkle tree.\\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\\n/// it is updated based on the number of leaves in the tree. This approach\\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\\nlibrary InternalLeanIMT {\\n /// @dev Inserts a new leaf into the incremental merkle tree.\\n /// The function ensures that the leaf is valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the new leaf to be inserted into the tree.\\n /// @return The new hash of the node after the leaf has been inserted.\\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\\n if (leaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaf == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = self.size;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // A new insertion can increase a tree's depth by at most 1,\\n // and only if the number of leaves supported by the current\\n // depth is less than the number of leaves to be supported after insertion.\\n if (2 ** treeDepth < index + 1) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n uint256 node = leaf;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n node = PoseidonT3.hash([self.sideNodes[level], node]);\\n } else {\\n self.sideNodes[level] = node;\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n self.size = ++index;\\n\\n self.sideNodes[treeDepth] = node;\\n self.leaves[leaf] = index;\\n\\n return node;\\n }\\n\\n /// @dev Inserts many leaves into the incremental merkle tree.\\n /// The function ensures that the leaves are valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaves: The values of the new leaves to be inserted into the tree.\\n /// @return The root after the leaves have been inserted.\\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\\n // Cache tree size to optimize gas\\n uint256 treeSize = self.size;\\n\\n // Check that all the new values are correct to be added.\\n for (uint256 i = 0; i < leaves.length; ) {\\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaves[i] == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaves[i])) {\\n revert LeafAlreadyExists();\\n }\\n\\n self.leaves[leaves[i]] = treeSize + 1 + i;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Array to save the nodes that will be used to create the next level of the tree.\\n uint256[] memory currentLevelNewNodes;\\n\\n currentLevelNewNodes = leaves;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // Calculate the depth of the tree after adding the new values.\\n // Unlike the 'insert' function, we need a while here as\\n // N insertions can increase the tree's depth more than once.\\n while (2 ** treeDepth < treeSize + leaves.length) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n // First index to change in every level.\\n uint256 currentLevelStartIndex = treeSize;\\n\\n // Size of the level used to create the next level.\\n uint256 currentLevelSize = treeSize + leaves.length;\\n\\n // The index where changes begin at the next level.\\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\\n\\n // The size of the next level.\\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n // The number of nodes for the new level that will be created,\\n // only the new values, not the entire level.\\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\\n for (uint256 i = 0; i < numberOfNewNodes; ) {\\n uint256 leftNode;\\n\\n // Assign the left node using the saved path or the position in the array.\\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\\n leftNode = self.sideNodes[level];\\n } else {\\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\\n }\\n\\n uint256 rightNode;\\n\\n // Assign the right node if the value exists.\\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\\n }\\n\\n uint256 parentNode;\\n\\n // Assign the parent node.\\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\\n // it will be the leftNode.\\n if (rightNode != 0) {\\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\\n } else {\\n parentNode = leftNode;\\n }\\n\\n nextLevelNewNodes[i] = parentNode;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Update the `sideNodes` variable.\\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\\n // will be the value before the last one.\\n // If it is even and there is only one element, there is no need to save anything because\\n // the correct value for this level was already saved before.\\n if (currentLevelSize & 1 == 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\\n } else if (currentLevelNewNodes.length > 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\\n }\\n\\n currentLevelStartIndex = nextLevelStartIndex;\\n\\n // Calculate the next level startIndex value.\\n // It is the position of the parent node which is pos/2.\\n nextLevelStartIndex >>= 1;\\n\\n // Update the next array that will be used to calculate the next level.\\n currentLevelNewNodes = nextLevelNewNodes;\\n\\n currentLevelSize = nextLevelSize;\\n\\n // Calculate the size of the next level.\\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n // Update tree size\\n self.size = treeSize + leaves.length;\\n\\n // Update tree root\\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\\n\\n return currentLevelNewNodes[0];\\n }\\n\\n /// @dev Updates the value of an existing leaf and recalculates hashes\\n /// to maintain tree integrity.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf that is to be updated.\\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\\n /// @return The new hash of the updated node after the leaf has been updated.\\n function _update(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256 newLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n if (newLeaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (!_has(self, oldLeaf)) {\\n revert LeafDoesNotExist();\\n } else if (_has(self, newLeaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = _indexOf(self, oldLeaf);\\n uint256 node = newLeaf;\\n uint256 oldRoot = oldLeaf;\\n\\n uint256 lastIndex = self.size - 1;\\n uint256 i = 0;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([siblingNodes[i], node]);\\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n if (index >> level != lastIndex >> level) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([node, siblingNodes[i]]);\\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n self.sideNodes[i] = node;\\n }\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n if (oldRoot != _root(self)) {\\n revert WrongSiblingNodes();\\n }\\n\\n self.sideNodes[treeDepth] = node;\\n\\n if (newLeaf != 0) {\\n self.leaves[newLeaf] = self.leaves[oldLeaf];\\n }\\n\\n self.leaves[oldLeaf] = 0;\\n\\n return node;\\n }\\n\\n /// @dev Removes a leaf from the tree by setting its value to zero.\\n /// This function utilizes the update function to set the leaf's value\\n /// to zero and update the tree's state accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf to be removed.\\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\\n /// @return The new root hash of the tree after the leaf has been removed.\\n function _remove(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n return _update(self, oldLeaf, 0, siblingNodes);\\n }\\n\\n /// @dev Checks if a leaf exists in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf to check for existence.\\n /// @return A boolean value indicating whether the leaf exists in the tree.\\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\\n return self.leaves[leaf] != 0;\\n }\\n\\n /// @dev Retrieves the index of a given leaf in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf whose index is to be found.\\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\\n /// reverts with a custom error.\\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\\n if (self.leaves[leaf] == 0) {\\n revert LeafDoesNotExist();\\n }\\n\\n return self.leaves[leaf] - 1;\\n }\\n\\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\\n /// current tree depth.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @return The root hash of the tree.\\n function _root(LeanIMTData storage self) internal view returns (uint256) {\\n return self.sideNodes[self.depth];\\n }\\n}\\n\",\"keccak256\":\"0x6385ce9153d11d9824163464193d4ba3dd304e662dccd365ba2fc381a359762b\",\"license\":\"MIT\"},\"contracts/Enclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IEnclave, E3, IE3Program } from \\\"./interfaces/IEnclave.sol\\\";\\nimport { IInputValidator } from \\\"./interfaces/IInputValidator.sol\\\";\\nimport { ICiphernodeRegistry } from \\\"./interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./interfaces/IDecryptionVerifier.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n InternalLeanIMT,\\n LeanIMTData,\\n PoseidonT3\\n} from \\\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\\\";\\n\\ncontract Enclave is IEnclave, OwnableUpgradeable {\\n using InternalLeanIMT for LeanIMTData;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n ICiphernodeRegistry public ciphernodeRegistry; // address of the Ciphernode registry.\\n uint256 public maxDuration; // maximum duration of a computation in seconds.\\n uint256 public nexte3Id; // ID of the next E3.\\n uint256 public requests; // total number of requests made to Enclave.\\n\\n // Mapping of allowed E3 Programs.\\n mapping(IE3Program e3Program => bool allowed) public e3Programs;\\n\\n // Mapping of E3s.\\n mapping(uint256 e3Id => E3 e3) public e3s;\\n\\n // Mapping of input merkle trees.\\n mapping(uint256 e3Id => LeanIMTData imt) public inputs;\\n\\n // Mapping counting the number of inputs for each E3.\\n mapping(uint256 e3Id => uint256 inputCount) public inputCounts;\\n\\n // Mapping of enabled encryption schemes.\\n mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier)\\n public decryptionVerifiers;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeSelectionFailed();\\n error E3ProgramNotAllowed(IE3Program e3Program);\\n error E3AlreadyActivated(uint256 e3Id);\\n error E3Expired();\\n error E3NotActivated(uint256 e3Id);\\n error E3NotReady();\\n error E3DoesNotExist(uint256 e3Id);\\n error ModuleAlreadyEnabled(address module);\\n error ModuleNotEnabled(address module);\\n error InvalidEncryptionScheme(bytes32 encryptionSchemeId);\\n error InputDeadlinePassed(uint256 e3Id, uint256 expiration);\\n error InputDeadlineNotPassed(uint256 e3Id, uint256 expiration);\\n error InvalidComputationRequest(IInputValidator inputValidator);\\n error InvalidCiphernodeRegistry(ICiphernodeRegistry ciphernodeRegistry);\\n error InvalidDuration(uint256 duration);\\n error InvalidOutput(bytes output);\\n error InvalidInput();\\n error InvalidStartWindow();\\n error InvalidThreshold(uint32[2] threshold);\\n error CiphertextOutputAlreadyPublished(uint256 e3Id);\\n error CiphertextOutputNotPublished(uint256 e3Id);\\n error PaymentRequired(uint256 value);\\n error PlaintextOutputAlreadyPublished(uint256 e3Id);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n constructor(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration\\n ) {\\n initialize(_owner, _ciphernodeRegistry, _maxDuration);\\n }\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n function initialize(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration\\n ) public initializer {\\n __Ownable_init(msg.sender);\\n setMaxDuration(_maxDuration);\\n setCiphernodeRegistry(_ciphernodeRegistry);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3) {\\n // TODO: allow for other payment methods or only native tokens?\\n // TODO: should payment checks be somewhere else? Perhaps in the E3 Program or ciphernode registry?\\n require(msg.value > 0, PaymentRequired(msg.value));\\n require(\\n threshold[1] >= threshold[0] && threshold[0] > 0,\\n InvalidThreshold(threshold)\\n );\\n require(\\n // TODO: do we need a minimum start window to allow time for committee selection?\\n startWindow[1] >= startWindow[0] &&\\n startWindow[1] >= block.timestamp,\\n InvalidStartWindow()\\n );\\n require(\\n duration > 0 && duration <= maxDuration,\\n InvalidDuration(duration)\\n );\\n require(e3Programs[e3Program], E3ProgramNotAllowed(e3Program));\\n\\n // TODO: should IDs be incremental or produced deterministically?\\n e3Id = nexte3Id;\\n nexte3Id++;\\n uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id)));\\n\\n (bytes32 encryptionSchemeId, IInputValidator inputValidator) = e3Program\\n .validate(e3Id, seed, e3ProgramParams, computeProviderParams);\\n IDecryptionVerifier decryptionVerifier = decryptionVerifiers[\\n encryptionSchemeId\\n ];\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n require(\\n address(inputValidator) != address(0),\\n InvalidComputationRequest(inputValidator)\\n );\\n\\n e3 = E3({\\n seed: seed,\\n threshold: threshold,\\n requestBlock: block.number,\\n startWindow: startWindow,\\n duration: duration,\\n expiration: 0,\\n encryptionSchemeId: encryptionSchemeId,\\n e3Program: e3Program,\\n e3ProgramParams: e3ProgramParams,\\n inputValidator: inputValidator,\\n decryptionVerifier: decryptionVerifier,\\n committeePublicKey: hex\\\"\\\",\\n ciphertextOutput: hex\\\"\\\",\\n plaintextOutput: hex\\\"\\\"\\n });\\n e3s[e3Id] = e3;\\n\\n require(\\n ciphernodeRegistry.requestCommittee(e3Id, filter, threshold),\\n CommitteeSelectionFailed()\\n );\\n\\n emit E3Requested(e3Id, e3, filter, e3Program);\\n }\\n\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n require(e3.expiration == 0, E3AlreadyActivated(e3Id));\\n require(e3.startWindow[0] <= block.timestamp, E3NotReady());\\n // TODO: handle what happens to the payment if the start window has passed.\\n require(e3.startWindow[1] >= block.timestamp, E3Expired());\\n\\n bytes32 publicKeyHash = ciphernodeRegistry.committeePublicKey(e3Id);\\n require(\\n keccak256(publicKey) == publicKeyHash,\\n CommitteeSelectionFailed()\\n );\\n uint256 expiresAt = block.timestamp + e3.duration;\\n e3s[e3Id].expiration = expiresAt;\\n e3s[e3Id].committeePublicKey = keccak256(publicKey);\\n\\n emit E3Activated(e3Id, expiresAt, publicKey);\\n\\n return true;\\n }\\n\\n function publishInput(\\n uint256 e3Id,\\n bytes memory data\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n // TODO: should we have an input window, including both a start and end timestamp?\\n require(\\n e3.expiration > block.timestamp,\\n InputDeadlinePassed(e3Id, e3.expiration)\\n );\\n\\n bytes memory input = e3.inputValidator.validate(msg.sender, data);\\n uint256 inputHash = PoseidonT3.hash(\\n [uint256(keccak256(input)), inputCounts[e3Id]]\\n );\\n\\n inputCounts[e3Id]++;\\n inputs[e3Id]._insert(inputHash);\\n success = true;\\n\\n emit InputPublished(e3Id, input, inputHash, inputCounts[e3Id] - 1);\\n }\\n\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.expiration <= block.timestamp,\\n InputDeadlineNotPassed(e3Id, e3.expiration)\\n );\\n // TODO: should the output verifier be able to change its mind?\\n //i.e. should we be able to call this multiple times?\\n require(\\n e3.ciphertextOutput == bytes32(0),\\n CiphertextOutputAlreadyPublished(e3Id)\\n );\\n bytes32 ciphertextOutputHash = keccak256(ciphertextOutput);\\n (success) = e3.e3Program.verify(e3Id, ciphertextOutputHash, proof);\\n require(success, InvalidOutput(ciphertextOutput));\\n e3s[e3Id].ciphertextOutput = ciphertextOutputHash;\\n\\n emit CiphertextOutputPublished(e3Id, ciphertextOutput);\\n }\\n\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.ciphertextOutput != bytes32(0),\\n CiphertextOutputNotPublished(e3Id)\\n );\\n require(\\n e3.plaintextOutput.length == 0,\\n PlaintextOutputAlreadyPublished(e3Id)\\n );\\n (success) = e3.decryptionVerifier.verify(\\n e3Id,\\n keccak256(plaintextOutput),\\n proof\\n );\\n require(success, InvalidOutput(plaintextOutput));\\n e3s[e3Id].plaintextOutput = plaintextOutput;\\n\\n emit PlaintextOutputPublished(e3Id, plaintextOutput);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) public onlyOwner returns (bool success) {\\n maxDuration = _maxDuration;\\n success = true;\\n emit MaxDurationSet(_maxDuration);\\n }\\n\\n function setCiphernodeRegistry(\\n ICiphernodeRegistry _ciphernodeRegistry\\n ) public onlyOwner returns (bool success) {\\n require(\\n address(_ciphernodeRegistry) != address(0) &&\\n _ciphernodeRegistry != ciphernodeRegistry,\\n InvalidCiphernodeRegistry(_ciphernodeRegistry)\\n );\\n ciphernodeRegistry = _ciphernodeRegistry;\\n success = true;\\n emit CiphernodeRegistrySet(address(_ciphernodeRegistry));\\n }\\n\\n function enableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(\\n !e3Programs[e3Program],\\n ModuleAlreadyEnabled(address(e3Program))\\n );\\n e3Programs[e3Program] = true;\\n success = true;\\n emit E3ProgramEnabled(e3Program);\\n }\\n\\n function disableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(e3Programs[e3Program], ModuleNotEnabled(address(e3Program)));\\n delete e3Programs[e3Program];\\n success = true;\\n emit E3ProgramDisabled(e3Program);\\n }\\n\\n function setDecryptionVerifier(\\n bytes32 encryptionSchemeId,\\n IDecryptionVerifier decryptionVerifier\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifier != IDecryptionVerifier(address(0)) &&\\n decryptionVerifiers[encryptionSchemeId] != decryptionVerifier,\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = decryptionVerifier;\\n success = true;\\n emit EncryptionSchemeEnabled(encryptionSchemeId);\\n }\\n\\n function disableEncryptionScheme(\\n bytes32 encryptionSchemeId\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = IDecryptionVerifier(\\n address(0)\\n );\\n success = true;\\n emit EncryptionSchemeDisabled(encryptionSchemeId);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function getE3(uint256 e3Id) public view returns (E3 memory e3) {\\n e3 = e3s[e3Id];\\n require(e3.e3Program != IE3Program(address(0)), E3DoesNotExist(e3Id));\\n }\\n\\n function getInputRoot(uint256 e3Id) public view returns (uint256) {\\n require(\\n e3s[e3Id].e3Program != IE3Program(address(0)),\\n E3DoesNotExist(e3Id)\\n );\\n return InternalLeanIMT._root(inputs[e3Id]);\\n }\\n\\n function getDecryptionVerifier(\\n bytes32 encryptionSchemeId\\n ) public view returns (IDecryptionVerifier) {\\n return decryptionVerifiers[encryptionSchemeId];\\n }\\n}\\n\",\"keccak256\":\"0x192cc4c3a9744ee4eb0fc6a30019367b6fba8eaba26bf613735fbcac6e63a7ff\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IDecryptionVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IDecryptionVerifier {\\n /// @notice This function should be called by the Enclave contract to verify the\\n /// decryption of output of a computation.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutputHash The keccak256 hash of the plaintext output to be verified.\\n /// @param proof ABI encoded proof of the given output hash.\\n /// @return success Whether or not the plaintextOutputHash was successfully verified.\\n function verify(\\n uint256 e3Id,\\n bytes32 plaintextOutputHash,\\n bytes memory proof\\n ) external view returns (bool success);\\n}\\n\",\"keccak256\":\"0xb92991a581d3c18cdc273497687ec1c6e3016674314f21fe56917aece5d10863\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\nimport { IE3Program } from \\\"./IE3Program.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./IDecryptionVerifier.sol\\\";\\n\\n/// @title E3 struct\\n/// @notice This struct represents an E3 computation.\\n/// @param threshold M/N threshold for the committee.\\n/// @param requestBlock Block number when the E3 was requested.\\n/// @param startWindow Start window for the computation: index zero is minimum, index 1 is the maxium.\\n/// @param duration Duration of the E3.\\n/// @param expiration Timestamp when committee duties expire.\\n/// @param e3Program Address of the E3 Program contract.\\n/// @param computeProvider Address of the compute provider contract.\\n/// @param inputValidator Address of the input validator contract.\\n/// @param decryptionVerifier Address of the output verifier contract.\\n/// @param committeeId ID of the selected committee.\\n/// @param ciphertextOutput Encrypted output data.\\n/// @param plaintextOutput Decrypted output data.\\nstruct E3 {\\n uint256 seed;\\n uint32[2] threshold;\\n uint256 requestBlock;\\n uint256[2] startWindow;\\n uint256 duration;\\n uint256 expiration;\\n bytes32 encryptionSchemeId;\\n IE3Program e3Program;\\n bytes e3ProgramParams;\\n IInputValidator inputValidator;\\n IDecryptionVerifier decryptionVerifier;\\n bytes32 committeePublicKey;\\n bytes32 ciphertextOutput;\\n bytes plaintextOutput;\\n}\\n\",\"keccak256\":\"0x16f12d3e46b12fcbff721eb8c358324fd400c95b40d57ed06b05e7afd590811e\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3Program.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\n\\ninterface IE3Program {\\n /// @notice This function should be called by the Enclave contract to validate the computation parameters.\\n /// @param e3Id ID of the E3.\\n /// @param seed Seed for the computation.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return encryptionSchemeId ID of the encryption scheme to be used for the computation.\\n /// @return inputValidator The input validator to be used for the computation.\\n function validate(\\n uint256 e3Id,\\n uint256 seed,\\n bytes calldata e3ProgramParams,\\n bytes calldata computeProviderParams\\n )\\n external\\n returns (bytes32 encryptionSchemeId, IInputValidator inputValidator);\\n\\n /// @notice This function should be called by the Enclave contract to verify the decrypted output of an E3.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutputHash The keccak256 hash of output data to be verified.\\n /// @param proof ABI encoded data to verify the ciphertextOutputHash.\\n /// @return success Whether the output data is valid.\\n function verify(\\n uint256 e3Id,\\n bytes32 ciphertextOutputHash,\\n bytes memory proof\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xd60e92b5b6498daf0b7f1238d354156c67d25c03caaaabbc601368e9e4a295b2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IEnclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { E3, IE3Program } from \\\"./IE3.sol\\\";\\n\\ninterface IEnclave {\\n ////////////////////////////////////////////////////////////\\n // //\\n // Events //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\\n /// @param e3Id ID of the E3.\\n /// @param e3 Details of the E3.\\n /// @param filter Address of the pool of nodes from which the Cipher Node committee was selected.\\n /// @param e3Program Address of the Computation module selected.\\n event E3Requested(\\n uint256 e3Id,\\n E3 e3,\\n address filter,\\n IE3Program indexed e3Program\\n );\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\\n /// @param e3Id ID of the E3.\\n /// @param expiration Timestamp when committee duties expire.\\n /// @param committeePublicKey Public key of the committee.\\n event E3Activated(\\n uint256 e3Id,\\n uint256 expiration,\\n bytes committeePublicKey\\n );\\n\\n /// @notice This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is\\n /// successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data.\\n event InputPublished(\\n uint256 indexed e3Id,\\n bytes data,\\n uint256 inputHash,\\n uint256 index\\n );\\n\\n /// @notice This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput);\\n\\n /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded ciphertext output.\\n event CiphertextOutputPublished(\\n uint256 indexed e3Id,\\n bytes ciphertextOutput\\n );\\n\\n /// @notice This event MUST be emitted any time the `maxDuration` is set.\\n /// @param maxDuration The maximum duration of a computation in seconds.\\n event MaxDurationSet(uint256 maxDuration);\\n\\n /// @notice This event MUST be emitted any time the CiphernodeRegistry is set.\\n /// @param ciphernodeRegistry The address of the CiphernodeRegistry contract.\\n event CiphernodeRegistrySet(address ciphernodeRegistry);\\n\\n /// @notice The event MUST be emitted any time an encryption scheme is enabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was enabled.\\n event EncryptionSchemeEnabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time an encryption scheme is disabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was disabled.\\n event EncryptionSchemeDisabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is enabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramEnabled(IE3Program e3Program);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is disabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramDisabled(IE3Program e3Program);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to request a computation within an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the E3Requested event.\\n /// @param filter IDs of the pool of nodes from which to select the committee.\\n /// @param threshold The M/N threshold for the committee.\\n /// @param duration The duration of the computation in seconds.\\n /// @param e3Program Address of the E3 Program.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return e3Id ID of the E3.\\n /// @return e3 The E3 struct.\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3);\\n\\n /// @notice This function should be called to activate an Encrypted Execution Environment (E3) once it has been\\n /// initialized and is ready for input.\\n /// @dev This function MUST emit the E3Activated event.\\n /// @dev This function MUST revert if the given E3 has not yet been requested.\\n /// @dev This function MUST revert if the selected node committee has not yet published a public key.\\n /// @param e3Id ID of the E3.\\n /// @param publicKey Public key of the committee.\\n /// @return success True if the E3 was successfully activated.\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish input data for Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 is not yet activated.\\n /// @dev This function MUST emit the InputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data to publish.\\n /// @return success True if the input was successfully published.\\n function publishInput(\\n uint256 e3Id,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish output data for an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the CiphertextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded output data to verify.\\n /// @param proof ABI encoded data to verify the ciphertextOutput.\\n /// @return success True if the output was successfully published.\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n /// @notice This function publishes the plaintext output of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the output has not been published.\\n /// @dev This function MUST emit the PlaintextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n /// @param proof ABI encoded data to verify the plaintextOutput.\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to set the maximum duration of requested computations.\\n /// @param _maxDuration The maximum duration of a computation in seconds.\\n /// @return success True if the max duration was successfully set.\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return e3 The struct representing the requested E3.\\n function getE3(uint256 e3Id) external view returns (E3 memory e3);\\n\\n /// @notice This function returns root of the input merkle tree for a given E3.\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return root The root of the input merkle tree.\\n function getInputRoot(uint256 e3Id) external view returns (uint256 root);\\n}\\n\",\"keccak256\":\"0xb1c9cd24aeb1dbf988555945ae532860c8a60a874f19020e48e29c9e3e5ebb64\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IInputValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IInputValidator {\\n /// @notice This function should be called by the Enclave contract to validate the\\n /// input of a computation.\\n /// @param sender The account that is submitting the input.\\n /// @param data The input to be verified.\\n /// @return input The decoded, policy-approved application payload.\\n function validate(\\n address sender,\\n bytes memory data\\n ) external returns (bytes memory input);\\n}\\n\",\"keccak256\":\"0x20d4016bd59c317c5571cfe6c3e8f46cbabddc0b926dc64019eeae8d29788653\",\"license\":\"LGPL-3.0-only\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080346102a457601f61284438819003918201601f19168301916001600160401b038311848410176102a9578084926060946040528339810103126102a45780516001600160a01b0381168082036102a45760208301516001600160a01b03811693908490036102a457604090810151600080516020612824833981519152549182901c60ff161594916001600160401b0381168015908161029c575b6001149081610292575b159081610289575b50610278576001600160401b03198116600117600080516020612824833981519152557fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916020918761024d575b50610105610335565b61010d610335565b610116336102bf565b61011e610363565b80600155604051908152a1610131610363565b80151580610238575b1561022457600080546001600160a01b031916821790556040519081527f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690602090a1600080516020612804833981519152546001600160a01b03160361020d575b506101b1575b60405161246a908161039a8239f35b68ff0000000000000000196000805160206128248339815191525416600080516020612824833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a16101a2565b61021e90610219610363565b6102bf565b3861019c565b6375ac4eb760e11b60005260045260246000fd5b506000546001600160a01b031681141561013a565b6001600160481b031916680100000000000000011760008051602061282483398151915255386100fc565b63f92ee8a960e01b60005260046000fd5b905015386100ae565b303b1591506100a6565b87915061009c565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0316801561031f5760008051602061280483398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff6000805160206128248339815191525460401c161561035257565b631afcd79f60e31b60005260046000fd5b600080516020612804833981519152546001600160a01b0316330361038457565b63118cdaa760e01b6000523360045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611b3e5780630ef81b2f14611b0957806310bc628114611b095780631794bb3c146118e35780634017daf0146117f6578063406ed35c146117c35780634e92ec63146117355780634fc77264146116955780635314e9fa1461150d5780636db5c8fd146114ef578063715018a6146114565780637edcd7ab146111fd5780638da5cb5b146111b75780638dcdd86b1461119057806393b58f861461099b5780639c8570c814610828578063b3c88d67146107fc578063b74cb2db146107de578063c4ccafa21461079f578063cb64961714610781578063cbd16872146106c8578063cf0f34c4146106aa578063d016b08d14610279578063ddef9ea114610244578063f2fde38b14610219578063fad8e111146101ec5763fd2f3d011461014557600080fd5b346101e75760203660031901126101e7576001600160a01b03610166611ba3565b61016e6123d5565b1680600052600460205260ff604060002054166101d3576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101e75760203660031901126101e757602061020f61020a611ba3565b61234a565b6040519015158152f35b346101e75760203660031901126101e757610242610235611ba3565b61023d6123d5565b6122a4565b005b346101e75760203660031901126101e75760043560005260066020526040806000206001815491015482519182526020820152f35b346101e75761028736611ebe565b61029082611fe8565b60a081016102a18482511515612138565b514281111561069257506102ec6000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611d15565b03925af180156105915760009061060d575b61035a9150733333333C0A88F9BE4fd23ed0536F9B6c427e3B93602060405161032681611c10565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b835260048301612276565b0381845af4928315610591576000936105d9575b508360005260076020526040600020610387815461222b565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103cf576361c0541760e11b60005260046000fd5b836103e5576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105c857805491600182019283549360ff85116104d257600182018083116104d2576001861b106105b8575b84905585916000905b8582106104e8575050906104416003939261222b565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104d2577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104b992604051938493606085526060850190611d15565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c161460001461059d57602061053c916040519061050c82611c10565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b835260048301612276565b0381855af480156105915760009061055c575b60019150935b019061042b565b6020823d8211610589575b8161057460209383611c2c565b8101031261058657506001905161054f565b80fd5b3d9150610567565b6040513d6000823e3d90fd5b92806001916000526002860160205284604060002055610555565b936105c29061222b565b93610422565b6312c50cad60e11b60005260046000fd5b90926020823d602011610605575b816105f460209383611c2c565b81010312610586575051918461036e565b3d91506105e7565b3d8082843e61061c8184611c2c565b82019160208184031261068a5780519067ffffffffffffffff821161068e570182601f8201121561068a5780519161065383611e5b565b936106616040519586611c2c565b83855260208484010111610586575082916106859160208061035a96019101611cf2565b6102fe565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101e75760203660031901126101e757602061020f60043561223a565b346101e75760403660031901126101e7576004356024356001600160a01b0381168091036101e7577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161071d6123d5565b801515828161075f575b6107309161211c565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b0316821415905082610727565b346101e75760003660031901126101e7576020600254604051908152f35b346101e75760203660031901126101e7576001600160a01b036107c0611ba3565b166000526004602052602060ff604060002054166040519015158152f35b346101e75760003660031901126101e7576020600354604051908152f35b346101e75760203660031901126101e75760043560005260076020526020604060002054604051908152f35b346101e75761083636611eee565b9161084081611fe8565b9160a083016108528382511515612138565b51428111610983575061018083015161096e5760206108a06000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a6004850161216c565b03925af192831561059157602094600094610917575b508161090a916108e77f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0719487612188565b8460005260058752600d6040600020015560405191829187835287830190611d15565b0390a26040519015158152f35b61090a9194509161095e7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d8911610967575b6109568183611c2c565b810190612154565b949150916108b6565b503d61094c565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101e7576109b0611ba3565b366064116101e7573660a4116101e75760a43560c435916001600160a01b03831683036101e75760e43567ffffffffffffffff81116101e7576109f7903690600401611e77565b906101043567ffffffffffffffff81116101e757610a19903690600401611e77565b90610a22611f59565b50341561117b5760443563ffffffff8116908181036101e7575063ffffffff610a496121d0565b16111580611165575b1561114757608435606435811015908161113c575b501561112b578315158061111f575b1561110a576001600160a01b038516600052600460205260ff60406000205416156110ec57610b149060025493610aac8561222b565b6002556040805160208101904482528783820152828152610ace606082611c2c565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b026084840187611d15565b83810360031901606485015290611d15565b038160006001600160a01b038c165af190811561059157600093849261109b575b506000848152600860205260409020546001600160a01b0390811692610b5d8685151561211c565b169081156110865760405195610b7287611bf3565b8652604094855198610b84878b611c2c565b6000996024815b6064821061106e575050602089015243878901528651610bab8882611c2c565b6064815b60a4821061105e575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c0c8782611c2c565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110365750505060018201558385015160028201556060850151825b600281106110215750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610f6257610cc56009840154611bb9565b601f8111610ff0575b508890601f8311600114610f8157600e939291859183610f76575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610f62578190610d948454611bb9565b601f8111610f29575b508990601f8311600114610ec6578592610ebb575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e03604484016121f4565b5af1908115610eb1578291610e94575b5015610e8557507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610e81959697845191829189835260608b840152610e646060840189611d3a565b958784015216930390a28080519586958652850152830190611d3a565b0390f35b630d8dbe2560e01b8152600490fd5b610eab9150873d8911610967576109568183611c2c565b88610e13565b84513d84823e3d90fd5b015190508a80610db2565b8486528a86209250601f198416865b8c828210610f13575050908460019594939210610efa575b505050811b019055610dc7565b015160001960f88460031b161c191690558a8080610eed565b6001859682939686015181550195019301610ed5565b610f52908587528b8720601f850160051c8101918d8610610f58575b601f0160051c01906121b9565b8b610d9d565b9091508190610f45565b634e487b7160e01b84526041600452602484fd5b015190508b80610ce9565b9060098401855289852091855b8b601f1986168210610fda575050918391600193600e9695601f19811610610fc1575b505050811b016009820155610d01565b015160001960f88460031b161c191690558b8080610fb1565b6001849582939585015181550194019201610f8e565b61101b906009850186528a8620601f850160051c8101918c8610610f5857601f0160051c01906121b9565b8a610cce565b81518382016003015590880190600101610c4d565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c2c565b8135815260209182019101610baf565b6020809161107b846121e3565b815201910190610b8b565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d6040116110e4575b816110b760409383611c2c565b810103126110e05760208151910151936001600160a01b03851685036105865750929088610b35565b8380fd5b3d91506110aa565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610a76565b6308594fb760e01b60005260046000fd5b905042111586610a67565b604051633744092160e21b8152604490611163600482016121f4565bfd5b5063ffffffff6111736121d0565b161515610a52565b638c4fcd9360e01b6000523460045260246000fd5b346101e75760003660031901126101e75760206001600160a01b0360005416604051908152f35b346101e75760003660031901126101e75760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101e75761120b36611eee565b611216839293611fe8565b6112268360a08301511515612138565b61018081015115611441576101a08101515161142c5761127592916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b8452886004850161216c565b03915afa9182156105915760009261140b575b506112938383612188565b806000526005602052600e6040600020019280519367ffffffffffffffff85116113f5576020946112c48254611bb9565b601f81116113c5575b5085601f821160011461133c5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261090a94600091611331575b508160011b916000199060031b1c19161790555b60405191829187835287830190611d15565b90508301518961130b565b601f1982169083600052806000209160005b8181106113ae57509261090a9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169989610611395575b5050811b01905561131f565b85015160001960f88460031b161c191690558980611389565b91928960018192868a01518155019401920161134e565b6113ef908360005287600020601f840160051c810191898510610f5857601f0160051c01906121b9565b866112cd565b634e487b7160e01b600052604160045260246000fd5b61142591925060203d602011610967576109568183611c2c565b9083611288565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101e75760003660031901126101e75761146f6123d5565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101e75760003660031901126101e7576020600154604051908152f35b346101e75761151b36611ebe565b9061152581611fe8565b9060a08201516116815760608201805151421061167057602042915101511061165f5760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105915760009361162b575b50835192602085019384200361161a57608001514201918242116104d2577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361160c918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611d15565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d602011611657575b8161164760209383611c2c565b810103126101e757519184611581565b3d915061163a565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101e75760203660031901126101e7576001600160a01b036116b6611ba3565b6116be6123d5565b1680600052600460205260ff6040600020541615611721576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101e75760203660031901126101e7577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc60206004356117746123d5565b8060005260088252611796816001600160a01b0360406000205416151561211c565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101e75760203660031901126101e757610e816117e2600435611fe8565b604051918291602083526020830190611d3a565b346101e75760203660031901126101e757600435600052600560205260206040600020610e8181549160028101546005820154916006810154926007820154936118bd6001600160a01b0360088501541661185360098601611c4e565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611889600e600d8b01549a01611c4e565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611d15565b9460e0880152610100870152610120860152610140850152838203610160850152611d15565b346101e75760603660031901126101e7576118fc611ba3565b602435906001600160a01b03821682036101e7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159267ffffffffffffffff821680159081611b01575b6001149081611af7575b159081611aee575b50611add5767ffffffffffffffff1982166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556119cc9184611a9e575b506119aa61241d565b6119b261241d565b6119bb336122a4565b6119c660443561223a565b5061234a565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b03821603611a8c575b50611a0f57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b611a989061023d6123d5565b81611a08565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055846119a1565b63f92ee8a960e01b60005260046000fd5b90501585611961565b303b159150611959565b85915061194f565b346101e75760203660031901126101e757600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101e75760203660031901126101e757600435806000526005602052611b78816001600160a01b03600860406000200154161515611f3d565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b600435906001600160a01b03821682036101e757565b90600182811c92168015611be9575b6020831014611bd357565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bc8565b6101c0810190811067ffffffffffffffff8211176113f557604052565b6040810190811067ffffffffffffffff8211176113f557604052565b90601f8019910116810190811067ffffffffffffffff8211176113f557604052565b9060405191826000825492611c6284611bb9565b8084529360018116908115611cd05750600114611c89575b50611c8792500383611c2c565b565b90506000929192526020600020906000915b818310611cb4575050906020611c879282010138611c7a565b6020919350806001915483858901015201910190918492611c9b565b905060209250611c8794915060ff191682840152151560051b82010138611c7a565b60005b838110611d055750506000910152565b8181015183820152602001611cf5565b90602091611d2e81518092818552858086019101611cf2565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611e3f5750505060408101516060840152606081015192608081016000905b60028210611e29575050611e26929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611dd4610100840151610200610140850152610200840190611d15565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611d15565b90565b6020806001928851815201960191019094611d71565b60208060019263ffffffff865116815201930191019091611d4e565b67ffffffffffffffff81116113f557601f01601f191660200190565b81601f820112156101e757803590611e8e82611e5b565b92611e9c6040519485611c2c565b828452602083830101116101e757816000926020809301838601378301015290565b9060406003198301126101e757600435916024359067ffffffffffffffff82116101e757611e2691600401611e77565b60606003198201126101e7576004359160243567ffffffffffffffff81116101e75782611f1d91600401611e77565b916044359067ffffffffffffffff82116101e757611e2691600401611e77565b15611f455750565b63cd6f4a4f60e01b60005260045260246000fd5b60405190611f6682611bf3565b60606101a0836000815260408051611f7e8282611c2c565b813682376020830152600081830152805190611f9a8183611c2c565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b90611ff1611f59565b5081600052600560205260406000209160405161200d81611bf3565b8354815260405163ffffffff6001860154818116835260201c166020820152612037604082611c2c565b6020820152600284015460408201526040518060038601906000905b6002821061210657505050611c8792918161207760406001600160a01b0394611c2c565b606082015260058601546080820152600686015460a0820152600786015460c08201526120f6600e836008890154169760e084019889526120ba60098201611c4e565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611c4e565b6101a08201529451161515611f3d565b6001602081928554815201930191019091612053565b156121245750565b6381c4951960e01b60005260045260246000fd5b156121405750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101e7575180151581036101e75790565b611e269392606092825260208201528160408201520190611d15565b156121905750565b604051632f9f8ab960e01b8152602060048201529081906121b5906024830190611d15565b0390fd5b8181106121c4575050565b600081556001016121b9565b60243563ffffffff811681036101e75790565b359063ffffffff821682036101e757565b6024906000905b6002821061220857505050565b60208060019263ffffffff61221c876121e3565b168152019301910190916121fb565b60001981146104d25760010190565b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916122666123d5565b80600155604051908152a1600190565b919060408301926000905b6002821061228e57505050565b6020806001928551815201930191019091612281565b6001600160a01b03168015612334576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b039061235b6123d5565b16801515806123c0575b156123ac576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b0360005416811415612365565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361240857565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561244c57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611b3e5780630ef81b2f14611b0957806310bc628114611b095780631794bb3c146118e35780634017daf0146117f6578063406ed35c146117c35780634e92ec63146117355780634fc77264146116955780635314e9fa1461150d5780636db5c8fd146114ef578063715018a6146114565780637edcd7ab146111fd5780638da5cb5b146111b75780638dcdd86b1461119057806393b58f861461099b5780639c8570c814610828578063b3c88d67146107fc578063b74cb2db146107de578063c4ccafa21461079f578063cb64961714610781578063cbd16872146106c8578063cf0f34c4146106aa578063d016b08d14610279578063ddef9ea114610244578063f2fde38b14610219578063fad8e111146101ec5763fd2f3d011461014557600080fd5b346101e75760203660031901126101e7576001600160a01b03610166611ba3565b61016e6123d5565b1680600052600460205260ff604060002054166101d3576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101e75760203660031901126101e757602061020f61020a611ba3565b61234a565b6040519015158152f35b346101e75760203660031901126101e757610242610235611ba3565b61023d6123d5565b6122a4565b005b346101e75760203660031901126101e75760043560005260066020526040806000206001815491015482519182526020820152f35b346101e75761028736611ebe565b61029082611fe8565b60a081016102a18482511515612138565b514281111561069257506102ec6000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611d15565b03925af180156105915760009061060d575b61035a915073__$75f79a42d9bcbdbb69ad79ebd80f556f39$__602060405161032681611c10565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b835260048301612276565b0381845af4928315610591576000936105d9575b508360005260076020526040600020610387815461222b565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103cf576361c0541760e11b60005260046000fd5b836103e5576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105c857805491600182019283549360ff85116104d257600182018083116104d2576001861b106105b8575b84905585916000905b8582106104e8575050906104416003939261222b565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104d2577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104b992604051938493606085526060850190611d15565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c161460001461059d57602061053c916040519061050c82611c10565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b835260048301612276565b0381855af480156105915760009061055c575b60019150935b019061042b565b6020823d8211610589575b8161057460209383611c2c565b8101031261058657506001905161054f565b80fd5b3d9150610567565b6040513d6000823e3d90fd5b92806001916000526002860160205284604060002055610555565b936105c29061222b565b93610422565b6312c50cad60e11b60005260046000fd5b90926020823d602011610605575b816105f460209383611c2c565b81010312610586575051918461036e565b3d91506105e7565b3d8082843e61061c8184611c2c565b82019160208184031261068a5780519067ffffffffffffffff821161068e570182601f8201121561068a5780519161065383611e5b565b936106616040519586611c2c565b83855260208484010111610586575082916106859160208061035a96019101611cf2565b6102fe565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101e75760203660031901126101e757602061020f60043561223a565b346101e75760403660031901126101e7576004356024356001600160a01b0381168091036101e7577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161071d6123d5565b801515828161075f575b6107309161211c565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b0316821415905082610727565b346101e75760003660031901126101e7576020600254604051908152f35b346101e75760203660031901126101e7576001600160a01b036107c0611ba3565b166000526004602052602060ff604060002054166040519015158152f35b346101e75760003660031901126101e7576020600354604051908152f35b346101e75760203660031901126101e75760043560005260076020526020604060002054604051908152f35b346101e75761083636611eee565b9161084081611fe8565b9160a083016108528382511515612138565b51428111610983575061018083015161096e5760206108a06000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a6004850161216c565b03925af192831561059157602094600094610917575b508161090a916108e77f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0719487612188565b8460005260058752600d6040600020015560405191829187835287830190611d15565b0390a26040519015158152f35b61090a9194509161095e7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d8911610967575b6109568183611c2c565b810190612154565b949150916108b6565b503d61094c565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101e7576109b0611ba3565b366064116101e7573660a4116101e75760a43560c435916001600160a01b03831683036101e75760e43567ffffffffffffffff81116101e7576109f7903690600401611e77565b906101043567ffffffffffffffff81116101e757610a19903690600401611e77565b90610a22611f59565b50341561117b5760443563ffffffff8116908181036101e7575063ffffffff610a496121d0565b16111580611165575b1561114757608435606435811015908161113c575b501561112b578315158061111f575b1561110a576001600160a01b038516600052600460205260ff60406000205416156110ec57610b149060025493610aac8561222b565b6002556040805160208101904482528783820152828152610ace606082611c2c565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b026084840187611d15565b83810360031901606485015290611d15565b038160006001600160a01b038c165af190811561059157600093849261109b575b506000848152600860205260409020546001600160a01b0390811692610b5d8685151561211c565b169081156110865760405195610b7287611bf3565b8652604094855198610b84878b611c2c565b6000996024815b6064821061106e575050602089015243878901528651610bab8882611c2c565b6064815b60a4821061105e575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c0c8782611c2c565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110365750505060018201558385015160028201556060850151825b600281106110215750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610f6257610cc56009840154611bb9565b601f8111610ff0575b508890601f8311600114610f8157600e939291859183610f76575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610f62578190610d948454611bb9565b601f8111610f29575b508990601f8311600114610ec6578592610ebb575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e03604484016121f4565b5af1908115610eb1578291610e94575b5015610e8557507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610e81959697845191829189835260608b840152610e646060840189611d3a565b958784015216930390a28080519586958652850152830190611d3a565b0390f35b630d8dbe2560e01b8152600490fd5b610eab9150873d8911610967576109568183611c2c565b88610e13565b84513d84823e3d90fd5b015190508a80610db2565b8486528a86209250601f198416865b8c828210610f13575050908460019594939210610efa575b505050811b019055610dc7565b015160001960f88460031b161c191690558a8080610eed565b6001859682939686015181550195019301610ed5565b610f52908587528b8720601f850160051c8101918d8610610f58575b601f0160051c01906121b9565b8b610d9d565b9091508190610f45565b634e487b7160e01b84526041600452602484fd5b015190508b80610ce9565b9060098401855289852091855b8b601f1986168210610fda575050918391600193600e9695601f19811610610fc1575b505050811b016009820155610d01565b015160001960f88460031b161c191690558b8080610fb1565b6001849582939585015181550194019201610f8e565b61101b906009850186528a8620601f850160051c8101918c8610610f5857601f0160051c01906121b9565b8a610cce565b81518382016003015590880190600101610c4d565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c2c565b8135815260209182019101610baf565b6020809161107b846121e3565b815201910190610b8b565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d6040116110e4575b816110b760409383611c2c565b810103126110e05760208151910151936001600160a01b03851685036105865750929088610b35565b8380fd5b3d91506110aa565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610a76565b6308594fb760e01b60005260046000fd5b905042111586610a67565b604051633744092160e21b8152604490611163600482016121f4565bfd5b5063ffffffff6111736121d0565b161515610a52565b638c4fcd9360e01b6000523460045260246000fd5b346101e75760003660031901126101e75760206001600160a01b0360005416604051908152f35b346101e75760003660031901126101e75760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101e75761120b36611eee565b611216839293611fe8565b6112268360a08301511515612138565b61018081015115611441576101a08101515161142c5761127592916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b8452886004850161216c565b03915afa9182156105915760009261140b575b506112938383612188565b806000526005602052600e6040600020019280519367ffffffffffffffff85116113f5576020946112c48254611bb9565b601f81116113c5575b5085601f821160011461133c5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261090a94600091611331575b508160011b916000199060031b1c19161790555b60405191829187835287830190611d15565b90508301518961130b565b601f1982169083600052806000209160005b8181106113ae57509261090a9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169989610611395575b5050811b01905561131f565b85015160001960f88460031b161c191690558980611389565b91928960018192868a01518155019401920161134e565b6113ef908360005287600020601f840160051c810191898510610f5857601f0160051c01906121b9565b866112cd565b634e487b7160e01b600052604160045260246000fd5b61142591925060203d602011610967576109568183611c2c565b9083611288565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101e75760003660031901126101e75761146f6123d5565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101e75760003660031901126101e7576020600154604051908152f35b346101e75761151b36611ebe565b9061152581611fe8565b9060a08201516116815760608201805151421061167057602042915101511061165f5760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105915760009361162b575b50835192602085019384200361161a57608001514201918242116104d2577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361160c918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611d15565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d602011611657575b8161164760209383611c2c565b810103126101e757519184611581565b3d915061163a565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101e75760203660031901126101e7576001600160a01b036116b6611ba3565b6116be6123d5565b1680600052600460205260ff6040600020541615611721576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101e75760203660031901126101e7577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc60206004356117746123d5565b8060005260088252611796816001600160a01b0360406000205416151561211c565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101e75760203660031901126101e757610e816117e2600435611fe8565b604051918291602083526020830190611d3a565b346101e75760203660031901126101e757600435600052600560205260206040600020610e8181549160028101546005820154916006810154926007820154936118bd6001600160a01b0360088501541661185360098601611c4e565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611889600e600d8b01549a01611c4e565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611d15565b9460e0880152610100870152610120860152610140850152838203610160850152611d15565b346101e75760603660031901126101e7576118fc611ba3565b602435906001600160a01b03821682036101e7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159267ffffffffffffffff821680159081611b01575b6001149081611af7575b159081611aee575b50611add5767ffffffffffffffff1982166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556119cc9184611a9e575b506119aa61241d565b6119b261241d565b6119bb336122a4565b6119c660443561223a565b5061234a565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b03821603611a8c575b50611a0f57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b611a989061023d6123d5565b81611a08565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055846119a1565b63f92ee8a960e01b60005260046000fd5b90501585611961565b303b159150611959565b85915061194f565b346101e75760203660031901126101e757600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101e75760203660031901126101e757600435806000526005602052611b78816001600160a01b03600860406000200154161515611f3d565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b600435906001600160a01b03821682036101e757565b90600182811c92168015611be9575b6020831014611bd357565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bc8565b6101c0810190811067ffffffffffffffff8211176113f557604052565b6040810190811067ffffffffffffffff8211176113f557604052565b90601f8019910116810190811067ffffffffffffffff8211176113f557604052565b9060405191826000825492611c6284611bb9565b8084529360018116908115611cd05750600114611c89575b50611c8792500383611c2c565b565b90506000929192526020600020906000915b818310611cb4575050906020611c879282010138611c7a565b6020919350806001915483858901015201910190918492611c9b565b905060209250611c8794915060ff191682840152151560051b82010138611c7a565b60005b838110611d055750506000910152565b8181015183820152602001611cf5565b90602091611d2e81518092818552858086019101611cf2565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611e3f5750505060408101516060840152606081015192608081016000905b60028210611e29575050611e26929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611dd4610100840151610200610140850152610200840190611d15565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611d15565b90565b6020806001928851815201960191019094611d71565b60208060019263ffffffff865116815201930191019091611d4e565b67ffffffffffffffff81116113f557601f01601f191660200190565b81601f820112156101e757803590611e8e82611e5b565b92611e9c6040519485611c2c565b828452602083830101116101e757816000926020809301838601378301015290565b9060406003198301126101e757600435916024359067ffffffffffffffff82116101e757611e2691600401611e77565b60606003198201126101e7576004359160243567ffffffffffffffff81116101e75782611f1d91600401611e77565b916044359067ffffffffffffffff82116101e757611e2691600401611e77565b15611f455750565b63cd6f4a4f60e01b60005260045260246000fd5b60405190611f6682611bf3565b60606101a0836000815260408051611f7e8282611c2c565b813682376020830152600081830152805190611f9a8183611c2c565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b90611ff1611f59565b5081600052600560205260406000209160405161200d81611bf3565b8354815260405163ffffffff6001860154818116835260201c166020820152612037604082611c2c565b6020820152600284015460408201526040518060038601906000905b6002821061210657505050611c8792918161207760406001600160a01b0394611c2c565b606082015260058601546080820152600686015460a0820152600786015460c08201526120f6600e836008890154169760e084019889526120ba60098201611c4e565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611c4e565b6101a08201529451161515611f3d565b6001602081928554815201930191019091612053565b156121245750565b6381c4951960e01b60005260045260246000fd5b156121405750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101e7575180151581036101e75790565b611e269392606092825260208201528160408201520190611d15565b156121905750565b604051632f9f8ab960e01b8152602060048201529081906121b5906024830190611d15565b0390fd5b8181106121c4575050565b600081556001016121b9565b60243563ffffffff811681036101e75790565b359063ffffffff821682036101e757565b6024906000905b6002821061220857505050565b60208060019263ffffffff61221c876121e3565b168152019301910190916121fb565b60001981146104d25760010190565b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916122666123d5565b80600155604051908152a1600190565b919060408301926000905b6002821061228e57505050565b6020806001928551815201930191019091612281565b6001600160a01b03168015612334576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b039061235b6123d5565b16801515806123c0575b156123ac576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b0360005416811415612365565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361240857565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561244c57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a", "libraries": { "PoseidonT3": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" }, @@ -1703,7 +1703,7 @@ "label": "ciphernodeRegistry", "offset": 0, "slot": "0", - "type": "t_contract(ICiphernodeRegistry)2534" + "type": "t_contract(ICiphernodeRegistry)2537" }, { "astId": 1384, @@ -1735,7 +1735,7 @@ "label": "e3Programs", "offset": 0, "slot": "4", - "type": "t_mapping(t_contract(IE3Program)2628,t_bool)" + "type": "t_mapping(t_contract(IE3Program)2631,t_bool)" }, { "astId": 1398, @@ -1743,7 +1743,7 @@ "label": "e3s", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(E3)2594_storage)" + "type": "t_mapping(t_uint256,t_struct(E3)2597_storage)" }, { "astId": 1403, @@ -1767,7 +1767,7 @@ "label": "decryptionVerifiers", "offset": 0, "slot": "8", - "type": "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2549)" + "type": "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2552)" } ], "types": { @@ -1798,46 +1798,46 @@ "label": "bytes", "numberOfBytes": "32" }, - "t_contract(ICiphernodeRegistry)2534": { + "t_contract(ICiphernodeRegistry)2537": { "encoding": "inplace", "label": "contract ICiphernodeRegistry", "numberOfBytes": "20" }, - "t_contract(IDecryptionVerifier)2549": { + "t_contract(IDecryptionVerifier)2552": { "encoding": "inplace", "label": "contract IDecryptionVerifier", "numberOfBytes": "20" }, - "t_contract(IE3Program)2628": { + "t_contract(IE3Program)2631": { "encoding": "inplace", "label": "contract IE3Program", "numberOfBytes": "20" }, - "t_contract(IInputValidator)2823": { + "t_contract(IInputValidator)2826": { "encoding": "inplace", "label": "contract IInputValidator", "numberOfBytes": "20" }, - "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2549)": { + "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2552)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => contract IDecryptionVerifier)", "numberOfBytes": "32", - "value": "t_contract(IDecryptionVerifier)2549" + "value": "t_contract(IDecryptionVerifier)2552" }, - "t_mapping(t_contract(IE3Program)2628,t_bool)": { + "t_mapping(t_contract(IE3Program)2631,t_bool)": { "encoding": "mapping", - "key": "t_contract(IE3Program)2628", + "key": "t_contract(IE3Program)2631", "label": "mapping(contract IE3Program => bool)", "numberOfBytes": "32", "value": "t_bool" }, - "t_mapping(t_uint256,t_struct(E3)2594_storage)": { + "t_mapping(t_uint256,t_struct(E3)2597_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct E3)", "numberOfBytes": "32", - "value": "t_struct(E3)2594_storage" + "value": "t_struct(E3)2597_storage" }, "t_mapping(t_uint256,t_struct(LeanIMTData)518_storage)": { "encoding": "mapping", @@ -1853,12 +1853,12 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_struct(E3)2594_storage": { + "t_struct(E3)2597_storage": { "encoding": "inplace", "label": "struct E3", "members": [ { - "astId": 2560, + "astId": 2563, "contract": "contracts/Enclave.sol:Enclave", "label": "seed", "offset": 0, @@ -1866,7 +1866,7 @@ "type": "t_uint256" }, { - "astId": 2564, + "astId": 2567, "contract": "contracts/Enclave.sol:Enclave", "label": "threshold", "offset": 0, @@ -1874,7 +1874,7 @@ "type": "t_array(t_uint32)2_storage" }, { - "astId": 2566, + "astId": 2569, "contract": "contracts/Enclave.sol:Enclave", "label": "requestBlock", "offset": 0, @@ -1882,7 +1882,7 @@ "type": "t_uint256" }, { - "astId": 2570, + "astId": 2573, "contract": "contracts/Enclave.sol:Enclave", "label": "startWindow", "offset": 0, @@ -1890,7 +1890,7 @@ "type": "t_array(t_uint256)2_storage" }, { - "astId": 2572, + "astId": 2575, "contract": "contracts/Enclave.sol:Enclave", "label": "duration", "offset": 0, @@ -1898,7 +1898,7 @@ "type": "t_uint256" }, { - "astId": 2574, + "astId": 2577, "contract": "contracts/Enclave.sol:Enclave", "label": "expiration", "offset": 0, @@ -1906,7 +1906,7 @@ "type": "t_uint256" }, { - "astId": 2576, + "astId": 2579, "contract": "contracts/Enclave.sol:Enclave", "label": "encryptionSchemeId", "offset": 0, @@ -1914,15 +1914,15 @@ "type": "t_bytes32" }, { - "astId": 2579, + "astId": 2582, "contract": "contracts/Enclave.sol:Enclave", "label": "e3Program", "offset": 0, "slot": "8", - "type": "t_contract(IE3Program)2628" + "type": "t_contract(IE3Program)2631" }, { - "astId": 2581, + "astId": 2584, "contract": "contracts/Enclave.sol:Enclave", "label": "e3ProgramParams", "offset": 0, @@ -1930,23 +1930,23 @@ "type": "t_bytes_storage" }, { - "astId": 2584, + "astId": 2587, "contract": "contracts/Enclave.sol:Enclave", "label": "inputValidator", "offset": 0, "slot": "10", - "type": "t_contract(IInputValidator)2823" + "type": "t_contract(IInputValidator)2826" }, { - "astId": 2587, + "astId": 2590, "contract": "contracts/Enclave.sol:Enclave", "label": "decryptionVerifier", "offset": 0, "slot": "11", - "type": "t_contract(IDecryptionVerifier)2549" + "type": "t_contract(IDecryptionVerifier)2552" }, { - "astId": 2589, + "astId": 2592, "contract": "contracts/Enclave.sol:Enclave", "label": "committeePublicKey", "offset": 0, @@ -1954,7 +1954,7 @@ "type": "t_bytes32" }, { - "astId": 2591, + "astId": 2594, "contract": "contracts/Enclave.sol:Enclave", "label": "ciphertextOutput", "offset": 0, @@ -1962,7 +1962,7 @@ "type": "t_bytes32" }, { - "astId": 2593, + "astId": 2596, "contract": "contracts/Enclave.sol:Enclave", "label": "plaintextOutput", "offset": 0, diff --git a/packages/evm/deployments/sepolia/NaiveRegistryFilter.json b/packages/evm/deployments/sepolia/NaiveRegistryFilter.json index 386c28533d..e38068c632 100644 --- a/packages/evm/deployments/sepolia/NaiveRegistryFilter.json +++ b/packages/evm/deployments/sepolia/NaiveRegistryFilter.json @@ -1,5 +1,5 @@ { - "address": "0x2c6A6bc9AaD9b34c3ecAfB9924C5F4501bb8b94D", + "address": "0x22f12b41DBb19fe7C7c72566BA403798D946FEF3", "abi": [ { "inputs": [ @@ -297,54 +297,54 @@ "type": "function" } ], - "transactionHash": "0x6dce2bdc9b1f9d1a70f8986d4c8c53f887dcb181dc37d164e1c7cfb8c32fcdd1", + "transactionHash": "0xa5f1477ed13ce30b7501513de14a1fc2d16477f6dff4fe274838426b7fa3cee3", "receipt": { "to": null, "from": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", - "contractAddress": "0x2c6A6bc9AaD9b34c3ecAfB9924C5F4501bb8b94D", - "transactionIndex": 135, + "contractAddress": "0x22f12b41DBb19fe7C7c72566BA403798D946FEF3", + "transactionIndex": 148, "gasUsed": "771935", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000800000000000000000000004080000000000000001000000000000000000000000000000000000000000000001000000000000000000000000020000000000000000000000000000000000004000000000000000020000000000002000000000000000000000000000000000000000000000000000000", - "blockHash": "0xca2165eddd8a37d9a1b49f81844ceb4795d92e14626d10a915fc7893cefc60fd", - "transactionHash": "0x6dce2bdc9b1f9d1a70f8986d4c8c53f887dcb181dc37d164e1c7cfb8c32fcdd1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000001000000001000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000002800000000000000000000004080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000004000000000000000020000000000000000000000000000000000000000000000000000000000000000020", + "blockHash": "0x991d9ea05f561d1256896b16f918f2b3c564603a0b6dee93ff9abf06d3bb3be0", + "transactionHash": "0xa5f1477ed13ce30b7501513de14a1fc2d16477f6dff4fe274838426b7fa3cee3", "logs": [ { - "transactionIndex": 135, - "blockNumber": 8332810, - "transactionHash": "0x6dce2bdc9b1f9d1a70f8986d4c8c53f887dcb181dc37d164e1c7cfb8c32fcdd1", - "address": "0x2c6A6bc9AaD9b34c3ecAfB9924C5F4501bb8b94D", + "transactionIndex": 148, + "blockNumber": 8360700, + "transactionHash": "0xa5f1477ed13ce30b7501513de14a1fc2d16477f6dff4fe274838426b7fa3cee3", + "address": "0x22f12b41DBb19fe7C7c72566BA403798D946FEF3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b" ], "data": "0x", - "logIndex": 251, - "blockHash": "0xca2165eddd8a37d9a1b49f81844ceb4795d92e14626d10a915fc7893cefc60fd" + "logIndex": 231, + "blockHash": "0x991d9ea05f561d1256896b16f918f2b3c564603a0b6dee93ff9abf06d3bb3be0" }, { - "transactionIndex": 135, - "blockNumber": 8332810, - "transactionHash": "0x6dce2bdc9b1f9d1a70f8986d4c8c53f887dcb181dc37d164e1c7cfb8c32fcdd1", - "address": "0x2c6A6bc9AaD9b34c3ecAfB9924C5F4501bb8b94D", + "transactionIndex": 148, + "blockNumber": 8360700, + "transactionHash": "0xa5f1477ed13ce30b7501513de14a1fc2d16477f6dff4fe274838426b7fa3cee3", + "address": "0x22f12b41DBb19fe7C7c72566BA403798D946FEF3", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 252, - "blockHash": "0xca2165eddd8a37d9a1b49f81844ceb4795d92e14626d10a915fc7893cefc60fd" + "logIndex": 232, + "blockHash": "0x991d9ea05f561d1256896b16f918f2b3c564603a0b6dee93ff9abf06d3bb3be0" } ], - "blockNumber": 8332810, - "cumulativeGasUsed": "15267436", + "blockNumber": 8360700, + "cumulativeGasUsed": "15583856", "status": 1, "byzantium": true }, "args": [ "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", - "0x78b57cfC6702F90b581914014e2DA4ba8532753C" + "0x4A6701c770c53584b7d781ccC0267152d128bd4E" ], - "numDeployments": 2, + "numDeployments": 3, "solcInputHash": "7505270e9ddb813a3809c10e5d95f372", "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ciphernode\",\"type\":\"address\"}],\"name\":\"CiphernodeNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3\",\"type\":\"uint256\"}],\"name\":\"committees\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"publicKey\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getCommittee\",\"outputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"bytes32\",\"name\":\"publicKey\",\"type\":\"bytes32\"}],\"internalType\":\"struct NaiveRegistryFilter.Committee\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"publishCommittee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"requestCommittee\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/registry/NaiveRegistryFilter.sol\":\"NaiveRegistryFilter\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IRegistryFilter.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IRegistryFilter {\\n function requestCommittee(\\n uint256 e3Id,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0x6bd13d0b188e54393b1a030a43f95042161091d49428e880c301d882c4583100\",\"license\":\"LGPL-3.0-only\"},\"contracts/registry/NaiveRegistryFilter.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { ICiphernodeRegistry } from \\\"../interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IRegistryFilter } from \\\"../interfaces/IRegistryFilter.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\ncontract NaiveRegistryFilter is IRegistryFilter, OwnableUpgradeable {\\n struct Committee {\\n address[] nodes;\\n uint32[2] threshold;\\n bytes32 publicKey;\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n address public registry;\\n\\n mapping(uint256 e3 => Committee committee) public committees;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeAlreadyExists();\\n error CommitteeAlreadyPublished();\\n error CommitteeDoesNotExist();\\n error CommitteeNotPublished();\\n error CiphernodeNotEnabled(address ciphernode);\\n error OnlyRegistry();\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Modifiers //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n modifier onlyRegistry() {\\n require(msg.sender == registry, OnlyRegistry());\\n _;\\n }\\n\\n modifier onlyOwnerOrCiphernode() {\\n require(\\n msg.sender == owner() ||\\n ICiphernodeRegistry(registry).isCiphernodeEligible(msg.sender),\\n CiphernodeNotEnabled(msg.sender)\\n );\\n _;\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n constructor(address _owner, address _registry) {\\n initialize(_owner, _registry);\\n }\\n\\n function initialize(address _owner, address _registry) public initializer {\\n __Ownable_init(msg.sender);\\n setRegistry(_registry);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function requestCommittee(\\n uint256 e3Id,\\n uint32[2] calldata threshold\\n ) external onlyRegistry returns (bool success) {\\n require(committees[e3Id].threshold[1] == 0, CommitteeAlreadyExists());\\n committees[e3Id].threshold = threshold;\\n success = true;\\n }\\n\\n function publishCommittee(\\n uint256 e3Id,\\n address[] memory nodes,\\n bytes memory publicKey\\n ) external onlyOwner {\\n Committee storage committee = committees[e3Id];\\n require(committee.publicKey == bytes32(0), CommitteeAlreadyPublished());\\n committee.nodes = nodes;\\n committee.publicKey = keccak256(publicKey);\\n ICiphernodeRegistry(registry).publishCommittee(\\n e3Id,\\n abi.encode(nodes),\\n publicKey\\n );\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setRegistry(address _registry) public onlyOwner {\\n registry = _registry;\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function getCommittee(\\n uint256 e3Id\\n ) external view returns (Committee memory) {\\n return committees[e3Id];\\n }\\n}\\n\",\"keccak256\":\"0x764a1b1965828e768fad1a594b858cf25c2edf954137bb49e4de3e474ee150dd\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", "bytecode": "0x6080346101f457601f610eb938819003918201601f19168301916001600160401b038311848410176101f95780849260409485528339810103126101f457610052602061004b8361020f565b920161020f565b600080516020610e9983398151915254604081901c60ff16159291906001600160401b038116801590816101ec575b60011490816101e2575b1590816101d9575b506101c8576001600160401b03198116600117600080516020610e99833981519152558361019d575b506100c5610299565b6100cd610299565b6100d633610223565b6100de6102c7565b600080546001600160a01b0319166001600160a01b03928316179055600080516020610e7983398151915254811690821603610186575b5061012a575b604051610b7b90816102fe8239f35b68ff000000000000000019600080516020610e998339815191525416600080516020610e99833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a161011b565b610197906101926102c7565b610223565b38610115565b6001600160481b0319166801000000000000000117600080516020610e9983398151915255386100bc565b63f92ee8a960e01b60005260046000fd5b90501538610093565b303b15915061008b565b859150610081565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f457565b6001600160a01b0316801561028357600080516020610e7983398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff600080516020610e998339815191525460401c16156102b657565b631afcd79f60e31b60005260046000fd5b600080516020610e79833981519152546001600160a01b031633036102e857565b63118cdaa760e01b6000523360045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816218449a1461082e5750806329f73b9c1461053a5780632b20a4f614610468578063485cc9551461022e578063715018a6146101955780637b1039991461016f5780638da5cb5b14610129578063a91ee0dc146100ea578063f2fde38b146100bd5763f5e820fd1461008e57600080fd5b346100ba5760203660031901126100ba5760026040602092600435815260018452200154604051908152f35b80fd5b50346100ba5760203660031901126100ba576100e76100da6109e4565b6100e2610ae6565b610a40565b80f35b50346100ba5760203660031901126100ba576001600160a01b0361010c6109e4565b610114610ae6565b166001600160a01b0319600054161760005580f35b50346100ba57806003193601126100ba5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b50346100ba57806003193601126100ba576001600160a01b036020915416604051908152f35b50346100ba57806003193601126100ba576101ae610ae6565b806001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346100ba5760403660031901126100ba576102486109e4565b602435906001600160a01b0382168203610464577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161045c575b6001149081610452575b159081610449575b5061043a5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556001600160a01b039190846103fb575b506102fd610b2e565b610305610b2e565b61030e33610a40565b610316610ae6565b166001600160a01b031960005416176000556001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036103e9575b5061036b5780f35b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b6103f5906100e2610ae6565b38610363565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386102f4565b63f92ee8a960e01b8552600485fd5b905015386102ae565b303b1591506102a6565b85915061029c565b8280fd5b50346100ba5760603660031901126100ba5760043536606411610536576001600160a01b03825416330361052757808252600160205263ffffffff600160408420015460201c16610518578152600160205260016040822001602482805b600281106104dd5750505055602060405160018152f35b90919384359063ffffffff8216918281036105145750600583901b91821b63ffffffff90921b1916179360200191906001016104c6565b8480fd5b6334c2a65d60e11b8252600482fd5b6310f5403960e31b8252600482fd5b5080fd5b50346100ba5760603660031901126100ba576024359060043567ffffffffffffffff8311610536573660238401121561053657826004013567ffffffffffffffff811161081a578060051b936040519161059760208701846109c2565b82526020820190602482968201019036821161081657602401915b8183106107f6575050506044359167ffffffffffffffff831161075557366023840112156107555782600401359267ffffffffffffffff84116107e25760405193610607601f8201601f1916602001866109c2565b808552602085019136602483830101116107de57818792602460209301853786010152610632610ae6565b81855260016020526040852090600282019182546107cf5784519067ffffffffffffffff82116107bb576801000000000000000082116107bb578054828255808310610795575b508890885260208820885b83811061077857505050508451902090556001600160a01b0384541660405192604084019060208086015251809152606084019690865b818110610759575050506106dc83869796959603601f1981018552846109c2565b803b1561075557839283610717936107296040519889968795869463d9bbec9560e01b865260048601526060602486015260648501906109ff565b838103600319016044850152906109ff565b03925af180156107485761073a5780f35b610743916109c2565b388180f35b50604051903d90823e3d90fd5b8380fd5b82516001600160a01b03168952602098890198909201916001016106bb565b60019060206001600160a01b038551169401938184015501610684565b8189528260208a2091820191015b8181106107b05750610679565b8981556001016107a3565b634e487b7160e01b88526041600452602488fd5b63632a22bb60e01b8752600487fd5b8680fd5b634e487b7160e01b85526041600452602485fd5b82356001600160a01b03811681036107de578152602092830192016105b2565b8580fd5b634e487b7160e01b83526041600452602483fd5b82346100ba5760203660031901126100ba579061084a81610990565b606081528160408092815161085f83826109c2565b8236823760208201520152600435825260016020528082209080519061088482610990565b80518354808252848652602080872090830191875b81811061097157505050816108af9103826109c2565b8252600281519363ffffffff6001820154818116875260201c1660208601526108d883866109c2565b602084019485520154908083019182528051936020855260a08501935193608060208701528451809152602060c08701950190875b81811061095257505050519084019094905b600282106109365750508293505160808301520390f35b60208060019263ffffffff89511681520196019101909461091f565b82516001600160a01b031687526020968701969092019160010161090d565b82546001600160a01b0316845260209093019260019283019201610899565b6060810190811067ffffffffffffffff8211176109ac57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109ac57604052565b600435906001600160a01b03821682036109fa57565b600080fd5b919082519283825260005b848110610a2b575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610a0a565b6001600160a01b03168015610ad0576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303610b1957565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615610b5d57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", diff --git a/packages/evm/deployments/sepolia/solcInputs/1560ab6aa11f44088d4445eb3d74156d.json b/packages/evm/deployments/sepolia/solcInputs/1560ab6aa11f44088d4445eb3d74156d.json new file mode 100644 index 0000000000..7f1f496ce2 --- /dev/null +++ b/packages/evm/deployments/sepolia/solcInputs/1560ab6aa11f44088d4445eb3d74156d.json @@ -0,0 +1,74 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n assembly {\n $.slot := INITIALIZABLE_STORAGE\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@zk-kit/lean-imt.sol/Constants.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.4;\n\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n" + }, + "@zk-kit/lean-imt.sol/InternalLeanIMT.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {PoseidonT3} from \"poseidon-solidity/PoseidonT3.sol\";\nimport {SNARK_SCALAR_FIELD} from \"./Constants.sol\";\n\nstruct LeanIMTData {\n // Tracks the current number of leaves in the tree.\n uint256 size;\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\n uint256 depth;\n // A mapping from each level of the tree to the node value of the last even position at that level.\n // Used for efficient inserts, updates and root calculations.\n mapping(uint256 => uint256) sideNodes;\n // A mapping from leaf values to their respective indices in the tree.\n // This facilitates checks for leaf existence and retrieval of leaf positions.\n mapping(uint256 => uint256) leaves;\n}\n\nerror WrongSiblingNodes();\nerror LeafGreaterThanSnarkScalarField();\nerror LeafCannotBeZero();\nerror LeafAlreadyExists();\nerror LeafDoesNotExist();\n\n/// @title Lean Incremental binary Merkle tree.\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\n/// it is updated based on the number of leaves in the tree. This approach\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\nlibrary InternalLeanIMT {\n /// @dev Inserts a new leaf into the incremental merkle tree.\n /// The function ensures that the leaf is valid according to the\n /// constraints of the tree and then updates the tree's structure accordingly.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param leaf: The value of the new leaf to be inserted into the tree.\n /// @return The new hash of the node after the leaf has been inserted.\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\n if (leaf >= SNARK_SCALAR_FIELD) {\n revert LeafGreaterThanSnarkScalarField();\n } else if (leaf == 0) {\n revert LeafCannotBeZero();\n } else if (_has(self, leaf)) {\n revert LeafAlreadyExists();\n }\n\n uint256 index = self.size;\n\n // Cache tree depth to optimize gas\n uint256 treeDepth = self.depth;\n\n // A new insertion can increase a tree's depth by at most 1,\n // and only if the number of leaves supported by the current\n // depth is less than the number of leaves to be supported after insertion.\n if (2 ** treeDepth < index + 1) {\n ++treeDepth;\n }\n\n self.depth = treeDepth;\n\n uint256 node = leaf;\n\n for (uint256 level = 0; level < treeDepth; ) {\n if ((index >> level) & 1 == 1) {\n node = PoseidonT3.hash([self.sideNodes[level], node]);\n } else {\n self.sideNodes[level] = node;\n }\n\n unchecked {\n ++level;\n }\n }\n\n self.size = ++index;\n\n self.sideNodes[treeDepth] = node;\n self.leaves[leaf] = index;\n\n return node;\n }\n\n /// @dev Inserts many leaves into the incremental merkle tree.\n /// The function ensures that the leaves are valid according to the\n /// constraints of the tree and then updates the tree's structure accordingly.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param leaves: The values of the new leaves to be inserted into the tree.\n /// @return The root after the leaves have been inserted.\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\n // Cache tree size to optimize gas\n uint256 treeSize = self.size;\n\n // Check that all the new values are correct to be added.\n for (uint256 i = 0; i < leaves.length; ) {\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\n revert LeafGreaterThanSnarkScalarField();\n } else if (leaves[i] == 0) {\n revert LeafCannotBeZero();\n } else if (_has(self, leaves[i])) {\n revert LeafAlreadyExists();\n }\n\n self.leaves[leaves[i]] = treeSize + 1 + i;\n\n unchecked {\n ++i;\n }\n }\n\n // Array to save the nodes that will be used to create the next level of the tree.\n uint256[] memory currentLevelNewNodes;\n\n currentLevelNewNodes = leaves;\n\n // Cache tree depth to optimize gas\n uint256 treeDepth = self.depth;\n\n // Calculate the depth of the tree after adding the new values.\n // Unlike the 'insert' function, we need a while here as\n // N insertions can increase the tree's depth more than once.\n while (2 ** treeDepth < treeSize + leaves.length) {\n ++treeDepth;\n }\n\n self.depth = treeDepth;\n\n // First index to change in every level.\n uint256 currentLevelStartIndex = treeSize;\n\n // Size of the level used to create the next level.\n uint256 currentLevelSize = treeSize + leaves.length;\n\n // The index where changes begin at the next level.\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\n\n // The size of the next level.\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\n\n for (uint256 level = 0; level < treeDepth; ) {\n // The number of nodes for the new level that will be created,\n // only the new values, not the entire level.\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\n for (uint256 i = 0; i < numberOfNewNodes; ) {\n uint256 leftNode;\n\n // Assign the left node using the saved path or the position in the array.\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\n leftNode = self.sideNodes[level];\n } else {\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\n }\n\n uint256 rightNode;\n\n // Assign the right node if the value exists.\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\n }\n\n uint256 parentNode;\n\n // Assign the parent node.\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\n // it will be the leftNode.\n if (rightNode != 0) {\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\n } else {\n parentNode = leftNode;\n }\n\n nextLevelNewNodes[i] = parentNode;\n\n unchecked {\n ++i;\n }\n }\n\n // Update the `sideNodes` variable.\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\n // will be the value before the last one.\n // If it is even and there is only one element, there is no need to save anything because\n // the correct value for this level was already saved before.\n if (currentLevelSize & 1 == 1) {\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\n } else if (currentLevelNewNodes.length > 1) {\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\n }\n\n currentLevelStartIndex = nextLevelStartIndex;\n\n // Calculate the next level startIndex value.\n // It is the position of the parent node which is pos/2.\n nextLevelStartIndex >>= 1;\n\n // Update the next array that will be used to calculate the next level.\n currentLevelNewNodes = nextLevelNewNodes;\n\n currentLevelSize = nextLevelSize;\n\n // Calculate the size of the next level.\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\n\n unchecked {\n ++level;\n }\n }\n\n // Update tree size\n self.size = treeSize + leaves.length;\n\n // Update tree root\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\n\n return currentLevelNewNodes[0];\n }\n\n /// @dev Updates the value of an existing leaf and recalculates hashes\n /// to maintain tree integrity.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param oldLeaf: The value of the leaf that is to be updated.\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\n /// @return The new hash of the updated node after the leaf has been updated.\n function _update(\n LeanIMTData storage self,\n uint256 oldLeaf,\n uint256 newLeaf,\n uint256[] calldata siblingNodes\n ) internal returns (uint256) {\n if (newLeaf >= SNARK_SCALAR_FIELD) {\n revert LeafGreaterThanSnarkScalarField();\n } else if (!_has(self, oldLeaf)) {\n revert LeafDoesNotExist();\n } else if (_has(self, newLeaf)) {\n revert LeafAlreadyExists();\n }\n\n uint256 index = _indexOf(self, oldLeaf);\n uint256 node = newLeaf;\n uint256 oldRoot = oldLeaf;\n\n uint256 lastIndex = self.size - 1;\n uint256 i = 0;\n\n // Cache tree depth to optimize gas\n uint256 treeDepth = self.depth;\n\n for (uint256 level = 0; level < treeDepth; ) {\n if ((index >> level) & 1 == 1) {\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\n revert LeafGreaterThanSnarkScalarField();\n }\n\n node = PoseidonT3.hash([siblingNodes[i], node]);\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\n\n unchecked {\n ++i;\n }\n } else {\n if (index >> level != lastIndex >> level) {\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\n revert LeafGreaterThanSnarkScalarField();\n }\n\n node = PoseidonT3.hash([node, siblingNodes[i]]);\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\n\n unchecked {\n ++i;\n }\n } else {\n self.sideNodes[i] = node;\n }\n }\n\n unchecked {\n ++level;\n }\n }\n\n if (oldRoot != _root(self)) {\n revert WrongSiblingNodes();\n }\n\n self.sideNodes[treeDepth] = node;\n\n if (newLeaf != 0) {\n self.leaves[newLeaf] = self.leaves[oldLeaf];\n }\n\n self.leaves[oldLeaf] = 0;\n\n return node;\n }\n\n /// @dev Removes a leaf from the tree by setting its value to zero.\n /// This function utilizes the update function to set the leaf's value\n /// to zero and update the tree's state accordingly.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param oldLeaf: The value of the leaf to be removed.\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\n /// @return The new root hash of the tree after the leaf has been removed.\n function _remove(\n LeanIMTData storage self,\n uint256 oldLeaf,\n uint256[] calldata siblingNodes\n ) internal returns (uint256) {\n return _update(self, oldLeaf, 0, siblingNodes);\n }\n\n /// @dev Checks if a leaf exists in the tree.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param leaf: The value of the leaf to check for existence.\n /// @return A boolean value indicating whether the leaf exists in the tree.\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\n return self.leaves[leaf] != 0;\n }\n\n /// @dev Retrieves the index of a given leaf in the tree.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @param leaf: The value of the leaf whose index is to be found.\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\n /// reverts with a custom error.\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\n if (self.leaves[leaf] == 0) {\n revert LeafDoesNotExist();\n }\n\n return self.leaves[leaf] - 1;\n }\n\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\n /// current tree depth.\n /// @param self: A storage reference to the 'LeanIMTData' struct.\n /// @return The root hash of the tree.\n function _root(LeanIMTData storage self) internal view returns (uint256) {\n return self.sideNodes[self.depth];\n }\n}\n" + }, + "contracts/Enclave.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\nimport { IEnclave, E3, IE3Program } from \"./interfaces/IEnclave.sol\";\nimport { IInputValidator } from \"./interfaces/IInputValidator.sol\";\nimport { ICiphernodeRegistry } from \"./interfaces/ICiphernodeRegistry.sol\";\nimport { IDecryptionVerifier } from \"./interfaces/IDecryptionVerifier.sol\";\nimport {\n OwnableUpgradeable\n} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport {\n InternalLeanIMT,\n LeanIMTData,\n PoseidonT3\n} from \"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\";\n\ncontract Enclave is IEnclave, OwnableUpgradeable {\n using InternalLeanIMT for LeanIMTData;\n\n ////////////////////////////////////////////////////////////\n // //\n // Storage Variables //\n // //\n ////////////////////////////////////////////////////////////\n\n ICiphernodeRegistry public ciphernodeRegistry; // address of the Ciphernode registry.\n uint256 public maxDuration; // maximum duration of a computation in seconds.\n uint256 public nexte3Id; // ID of the next E3.\n uint256 public requests; // total number of requests made to Enclave.\n\n // Mapping of allowed E3 Programs.\n mapping(IE3Program e3Program => bool allowed) public e3Programs;\n\n // Mapping of E3s.\n mapping(uint256 e3Id => E3 e3) public e3s;\n\n // Mapping of input merkle trees.\n mapping(uint256 e3Id => LeanIMTData imt) public inputs;\n\n // Mapping counting the number of inputs for each E3.\n mapping(uint256 e3Id => uint256 inputCount) public inputCounts;\n\n // Mapping of enabled encryption schemes.\n mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier)\n public decryptionVerifiers;\n\n ////////////////////////////////////////////////////////////\n // //\n // Errors //\n // //\n ////////////////////////////////////////////////////////////\n\n error CommitteeSelectionFailed();\n error E3ProgramNotAllowed(IE3Program e3Program);\n error E3AlreadyActivated(uint256 e3Id);\n error E3Expired();\n error E3NotActivated(uint256 e3Id);\n error E3NotReady();\n error E3DoesNotExist(uint256 e3Id);\n error ModuleAlreadyEnabled(address module);\n error ModuleNotEnabled(address module);\n error InvalidEncryptionScheme(bytes32 encryptionSchemeId);\n error InputDeadlinePassed(uint256 e3Id, uint256 expiration);\n error InputDeadlineNotPassed(uint256 e3Id, uint256 expiration);\n error InvalidComputationRequest(IInputValidator inputValidator);\n error InvalidCiphernodeRegistry(ICiphernodeRegistry ciphernodeRegistry);\n error InvalidDuration(uint256 duration);\n error InvalidOutput(bytes output);\n error InvalidInput();\n error InvalidStartWindow();\n error InvalidThreshold(uint32[2] threshold);\n error CiphertextOutputAlreadyPublished(uint256 e3Id);\n error CiphertextOutputNotPublished(uint256 e3Id);\n error PaymentRequired(uint256 value);\n error PlaintextOutputAlreadyPublished(uint256 e3Id);\n\n ////////////////////////////////////////////////////////////\n // //\n // Initialization //\n // //\n ////////////////////////////////////////////////////////////\n\n /// @param _owner The owner of this contract\n /// @param _maxDuration The maximum duration of a computation in seconds\n constructor(\n address _owner,\n ICiphernodeRegistry _ciphernodeRegistry,\n uint256 _maxDuration\n ) {\n initialize(_owner, _ciphernodeRegistry, _maxDuration);\n }\n\n /// @param _owner The owner of this contract\n /// @param _maxDuration The maximum duration of a computation in seconds\n function initialize(\n address _owner,\n ICiphernodeRegistry _ciphernodeRegistry,\n uint256 _maxDuration\n ) public initializer {\n __Ownable_init(msg.sender);\n setMaxDuration(_maxDuration);\n setCiphernodeRegistry(_ciphernodeRegistry);\n if (_owner != owner()) transferOwnership(_owner);\n }\n\n ////////////////////////////////////////////////////////////\n // //\n // Core Entrypoints //\n // //\n ////////////////////////////////////////////////////////////\n\n function request(\n address filter,\n uint32[2] calldata threshold,\n uint256[2] calldata startWindow,\n uint256 duration,\n IE3Program e3Program,\n bytes memory e3ProgramParams,\n bytes memory computeProviderParams\n ) external payable returns (uint256 e3Id, E3 memory e3) {\n // TODO: allow for other payment methods or only native tokens?\n // TODO: should payment checks be somewhere else? Perhaps in the E3 Program or ciphernode registry?\n require(msg.value > 0, PaymentRequired(msg.value));\n require(\n threshold[1] >= threshold[0] && threshold[0] > 0,\n InvalidThreshold(threshold)\n );\n require(\n // TODO: do we need a minimum start window to allow time for committee selection?\n startWindow[1] >= startWindow[0] &&\n startWindow[1] >= block.timestamp,\n InvalidStartWindow()\n );\n require(\n duration > 0 && duration <= maxDuration,\n InvalidDuration(duration)\n );\n require(e3Programs[e3Program], E3ProgramNotAllowed(e3Program));\n\n // TODO: should IDs be incremental or produced deterministically?\n e3Id = nexte3Id;\n nexte3Id++;\n uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id)));\n\n (bytes32 encryptionSchemeId, IInputValidator inputValidator) = e3Program\n .validate(e3Id, seed, e3ProgramParams, computeProviderParams);\n IDecryptionVerifier decryptionVerifier = decryptionVerifiers[\n encryptionSchemeId\n ];\n require(\n decryptionVerifiers[encryptionSchemeId] !=\n IDecryptionVerifier(address(0)),\n InvalidEncryptionScheme(encryptionSchemeId)\n );\n require(\n address(inputValidator) != address(0),\n InvalidComputationRequest(inputValidator)\n );\n\n e3 = E3({\n seed: seed,\n threshold: threshold,\n requestBlock: block.number,\n startWindow: startWindow,\n duration: duration,\n expiration: 0,\n encryptionSchemeId: encryptionSchemeId,\n e3Program: e3Program,\n e3ProgramParams: e3ProgramParams,\n inputValidator: inputValidator,\n decryptionVerifier: decryptionVerifier,\n committeePublicKey: hex\"\",\n ciphertextOutput: hex\"\",\n plaintextOutput: hex\"\"\n });\n e3s[e3Id] = e3;\n\n require(\n ciphernodeRegistry.requestCommittee(e3Id, filter, threshold),\n CommitteeSelectionFailed()\n );\n\n emit E3Requested(e3Id, e3, filter, e3Program);\n }\n\n function activate(\n uint256 e3Id,\n bytes memory publicKey\n ) external returns (bool success) {\n E3 memory e3 = getE3(e3Id);\n\n require(e3.expiration == 0, E3AlreadyActivated(e3Id));\n require(e3.startWindow[0] <= block.timestamp, E3NotReady());\n // TODO: handle what happens to the payment if the start window has passed.\n require(e3.startWindow[1] >= block.timestamp, E3Expired());\n\n bytes32 publicKeyHash = ciphernodeRegistry.committeePublicKey(e3Id);\n require(\n keccak256(publicKey) == publicKeyHash,\n CommitteeSelectionFailed()\n );\n uint256 expiresAt = block.timestamp + e3.duration;\n e3s[e3Id].expiration = expiresAt;\n e3s[e3Id].committeePublicKey = keccak256(publicKey);\n\n emit E3Activated(e3Id, expiresAt, publicKey);\n\n return true;\n }\n\n function publishInput(\n uint256 e3Id,\n bytes memory data\n ) external returns (bool success) {\n E3 memory e3 = getE3(e3Id);\n\n // Note: if we make 0 a no expiration, this has to be refactored\n require(e3.expiration > 0, E3NotActivated(e3Id));\n // TODO: should we have an input window, including both a start and end timestamp?\n require(\n e3.expiration > block.timestamp,\n InputDeadlinePassed(e3Id, e3.expiration)\n );\n\n bytes memory input = e3.inputValidator.validate(msg.sender, data);\n uint256 inputHash = PoseidonT3.hash(\n [uint256(keccak256(input)), inputCounts[e3Id]]\n );\n\n inputCounts[e3Id]++;\n inputs[e3Id]._insert(inputHash);\n success = true;\n\n emit InputPublished(e3Id, input, inputHash, inputCounts[e3Id] - 1);\n }\n\n function publishCiphertextOutput(\n uint256 e3Id,\n bytes memory ciphertextOutput,\n bytes memory proof\n ) external returns (bool success) {\n E3 memory e3 = getE3(e3Id);\n // Note: if we make 0 a no expiration, this has to be refactored\n require(e3.expiration > 0, E3NotActivated(e3Id));\n require(\n e3.expiration <= block.timestamp,\n InputDeadlineNotPassed(e3Id, e3.expiration)\n );\n // TODO: should the output verifier be able to change its mind?\n //i.e. should we be able to call this multiple times?\n require(\n e3.ciphertextOutput == bytes32(0),\n CiphertextOutputAlreadyPublished(e3Id)\n );\n bytes32 ciphertextOutputHash = keccak256(ciphertextOutput);\n (success) = e3.e3Program.verify(e3Id, ciphertextOutputHash, proof);\n require(success, InvalidOutput(ciphertextOutput));\n e3s[e3Id].ciphertextOutput = ciphertextOutputHash;\n\n emit CiphertextOutputPublished(e3Id, ciphertextOutput);\n }\n\n function publishPlaintextOutput(\n uint256 e3Id,\n bytes memory plaintextOutput,\n bytes memory proof\n ) external returns (bool success) {\n E3 memory e3 = getE3(e3Id);\n // Note: if we make 0 a no expiration, this has to be refactored\n require(e3.expiration > 0, E3NotActivated(e3Id));\n require(\n e3.ciphertextOutput != bytes32(0),\n CiphertextOutputNotPublished(e3Id)\n );\n require(\n e3.plaintextOutput.length == 0,\n PlaintextOutputAlreadyPublished(e3Id)\n );\n (success) = e3.decryptionVerifier.verify(\n e3Id,\n keccak256(plaintextOutput),\n proof\n );\n require(success, InvalidOutput(plaintextOutput));\n e3s[e3Id].plaintextOutput = plaintextOutput;\n\n emit PlaintextOutputPublished(e3Id, plaintextOutput);\n }\n\n ////////////////////////////////////////////////////////////\n // //\n // Set Functions //\n // //\n ////////////////////////////////////////////////////////////\n\n function setMaxDuration(\n uint256 _maxDuration\n ) public onlyOwner returns (bool success) {\n maxDuration = _maxDuration;\n success = true;\n emit MaxDurationSet(_maxDuration);\n }\n\n function setCiphernodeRegistry(\n ICiphernodeRegistry _ciphernodeRegistry\n ) public onlyOwner returns (bool success) {\n require(\n address(_ciphernodeRegistry) != address(0) &&\n _ciphernodeRegistry != ciphernodeRegistry,\n InvalidCiphernodeRegistry(_ciphernodeRegistry)\n );\n ciphernodeRegistry = _ciphernodeRegistry;\n success = true;\n emit CiphernodeRegistrySet(address(_ciphernodeRegistry));\n }\n\n function enableE3Program(\n IE3Program e3Program\n ) public onlyOwner returns (bool success) {\n require(\n !e3Programs[e3Program],\n ModuleAlreadyEnabled(address(e3Program))\n );\n e3Programs[e3Program] = true;\n success = true;\n emit E3ProgramEnabled(e3Program);\n }\n\n function disableE3Program(\n IE3Program e3Program\n ) public onlyOwner returns (bool success) {\n require(e3Programs[e3Program], ModuleNotEnabled(address(e3Program)));\n delete e3Programs[e3Program];\n success = true;\n emit E3ProgramDisabled(e3Program);\n }\n\n function setDecryptionVerifier(\n bytes32 encryptionSchemeId,\n IDecryptionVerifier decryptionVerifier\n ) public onlyOwner returns (bool success) {\n require(\n decryptionVerifier != IDecryptionVerifier(address(0)) &&\n decryptionVerifiers[encryptionSchemeId] != decryptionVerifier,\n InvalidEncryptionScheme(encryptionSchemeId)\n );\n decryptionVerifiers[encryptionSchemeId] = decryptionVerifier;\n success = true;\n emit EncryptionSchemeEnabled(encryptionSchemeId);\n }\n\n function disableEncryptionScheme(\n bytes32 encryptionSchemeId\n ) public onlyOwner returns (bool success) {\n require(\n decryptionVerifiers[encryptionSchemeId] !=\n IDecryptionVerifier(address(0)),\n InvalidEncryptionScheme(encryptionSchemeId)\n );\n decryptionVerifiers[encryptionSchemeId] = IDecryptionVerifier(\n address(0)\n );\n success = true;\n emit EncryptionSchemeDisabled(encryptionSchemeId);\n }\n\n ////////////////////////////////////////////////////////////\n // //\n // Get Functions //\n // //\n ////////////////////////////////////////////////////////////\n\n function getE3(uint256 e3Id) public view returns (E3 memory e3) {\n e3 = e3s[e3Id];\n require(e3.e3Program != IE3Program(address(0)), E3DoesNotExist(e3Id));\n }\n\n function getInputRoot(uint256 e3Id) public view returns (uint256) {\n require(\n e3s[e3Id].e3Program != IE3Program(address(0)),\n E3DoesNotExist(e3Id)\n );\n return InternalLeanIMT._root(inputs[e3Id]);\n }\n\n function getDecryptionVerifier(\n bytes32 encryptionSchemeId\n ) public view returns (IDecryptionVerifier) {\n return decryptionVerifiers[encryptionSchemeId];\n }\n}\n" + }, + "contracts/interfaces/ICiphernodeRegistry.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\ninterface ICiphernodeRegistry {\n /// @notice This event MUST be emitted when a committee is selected for an E3.\n /// @param e3Id ID of the E3 for which the committee was selected.\n /// @param filter Address of the contract that will coordinate committee selection.\n /// @param threshold The M/N threshold for the committee.\n event CommitteeRequested(\n uint256 indexed e3Id,\n address filter,\n uint32[2] threshold\n );\n\n /// @notice This event MUST be emitted when a committee is selected for an E3.\n /// @param e3Id ID of the E3 for which the committee was selected.\n /// @param publicKey Public key of the committee.\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\n\n /// @notice This event MUST be emitted when `enclave` is set.\n /// @param enclave Address of the enclave contract.\n event EnclaveSet(address indexed enclave);\n\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\n /// @param node Address of the ciphernode.\n /// @param index Index of the ciphernode in the registry.\n /// @param numNodes Number of ciphernodes in the registry.\n /// @param size Size of the registry.\n event CiphernodeAdded(\n address indexed node,\n uint256 index,\n uint256 numNodes,\n uint256 size\n );\n\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\n /// @param node Address of the ciphernode.\n /// @param index Index of the ciphernode in the registry.\n /// @param numNodes Number of ciphernodes in the registry.\n /// @param size Size of the registry.\n event CiphernodeRemoved(\n address indexed node,\n uint256 index,\n uint256 numNodes,\n uint256 size\n );\n\n function isCiphernodeEligible(address ciphernode) external returns (bool);\n\n /// @notice Initiates the committee selection process for a specified E3.\n /// @dev This function MUST revert when not called by the Enclave contract.\n /// @param e3Id ID of the E3 for which to select the committee.\n /// @param filter The address of the filter responsible for the committee selection process.\n /// @param threshold The M/N threshold for the committee.\n /// @return success True if committee selection was successfully initiated.\n function requestCommittee(\n uint256 e3Id,\n address filter,\n uint32[2] calldata threshold\n ) external returns (bool success);\n\n /// @notice Publishes the public key resulting from the committee selection process.\n /// @dev This function MUST revert if not called by the previously selected filter.\n /// @param e3Id ID of the E3 for which to select the committee.\n /// @param publicKey The hash of the public key generated by the given committee.\n function publishCommittee(\n uint256 e3Id,\n bytes calldata proof,\n bytes calldata publicKey\n ) external;\n\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\n /// @dev This function MUST revert if no committee has been requested for the given E3.\n /// @dev This function MUST revert if the committee has not yet published a public key.\n /// @param e3Id ID of the E3 for which to get the committee public key.\n /// @return publicKeyHash The hash of the public key of the given committee.\n function committeePublicKey(\n uint256 e3Id\n ) external view returns (bytes32 publicKeyHash);\n}\n" + }, + "contracts/interfaces/IDecryptionVerifier.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\ninterface IDecryptionVerifier {\n /// @notice This function should be called by the Enclave contract to verify the\n /// decryption of output of a computation.\n /// @param e3Id ID of the E3.\n /// @param plaintextOutputHash The keccak256 hash of the plaintext output to be verified.\n /// @param proof ABI encoded proof of the given output hash.\n /// @return success Whether or not the plaintextOutputHash was successfully verified.\n function verify(\n uint256 e3Id,\n bytes32 plaintextOutputHash,\n bytes memory proof\n ) external view returns (bool success);\n}\n" + }, + "contracts/interfaces/IE3.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\nimport { IInputValidator } from \"./IInputValidator.sol\";\nimport { IE3Program } from \"./IE3Program.sol\";\nimport { IDecryptionVerifier } from \"./IDecryptionVerifier.sol\";\n\n/// @title E3 struct\n/// @notice This struct represents an E3 computation.\n/// @param threshold M/N threshold for the committee.\n/// @param requestBlock Block number when the E3 was requested.\n/// @param startWindow Start window for the computation: index zero is minimum, index 1 is the maxium.\n/// @param duration Duration of the E3.\n/// @param expiration Timestamp when committee duties expire.\n/// @param e3Program Address of the E3 Program contract.\n/// @param computeProvider Address of the compute provider contract.\n/// @param inputValidator Address of the input validator contract.\n/// @param decryptionVerifier Address of the output verifier contract.\n/// @param committeeId ID of the selected committee.\n/// @param ciphertextOutput Encrypted output data.\n/// @param plaintextOutput Decrypted output data.\nstruct E3 {\n uint256 seed;\n uint32[2] threshold;\n uint256 requestBlock;\n uint256[2] startWindow;\n uint256 duration;\n uint256 expiration;\n bytes32 encryptionSchemeId;\n IE3Program e3Program;\n bytes e3ProgramParams;\n IInputValidator inputValidator;\n IDecryptionVerifier decryptionVerifier;\n bytes32 committeePublicKey;\n bytes32 ciphertextOutput;\n bytes plaintextOutput;\n}\n" + }, + "contracts/interfaces/IE3Program.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\nimport { IInputValidator } from \"./IInputValidator.sol\";\n\ninterface IE3Program {\n /// @notice This function should be called by the Enclave contract to validate the computation parameters.\n /// @param e3Id ID of the E3.\n /// @param seed Seed for the computation.\n /// @param e3ProgramParams ABI encoded computation parameters.\n /// @param computeProviderParams ABI encoded compute provider parameters.\n /// @return encryptionSchemeId ID of the encryption scheme to be used for the computation.\n /// @return inputValidator The input validator to be used for the computation.\n function validate(\n uint256 e3Id,\n uint256 seed,\n bytes calldata e3ProgramParams,\n bytes calldata computeProviderParams\n )\n external\n returns (bytes32 encryptionSchemeId, IInputValidator inputValidator);\n\n /// @notice This function should be called by the Enclave contract to verify the decrypted output of an E3.\n /// @param e3Id ID of the E3.\n /// @param ciphertextOutputHash The keccak256 hash of output data to be verified.\n /// @param proof ABI encoded data to verify the ciphertextOutputHash.\n /// @return success Whether the output data is valid.\n function verify(\n uint256 e3Id,\n bytes32 ciphertextOutputHash,\n bytes memory proof\n ) external returns (bool success);\n}\n" + }, + "contracts/interfaces/IEnclave.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\nimport { E3, IE3Program } from \"./IE3.sol\";\n\ninterface IEnclave {\n ////////////////////////////////////////////////////////////\n // //\n // Events //\n // //\n ////////////////////////////////////////////////////////////\n\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\n /// @param e3Id ID of the E3.\n /// @param e3 Details of the E3.\n /// @param filter Address of the pool of nodes from which the Cipher Node committee was selected.\n /// @param e3Program Address of the Computation module selected.\n event E3Requested(\n uint256 e3Id,\n E3 e3,\n address filter,\n IE3Program indexed e3Program\n );\n\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\n /// @param e3Id ID of the E3.\n /// @param expiration Timestamp when committee duties expire.\n /// @param committeePublicKey Public key of the committee.\n event E3Activated(\n uint256 e3Id,\n uint256 expiration,\n bytes committeePublicKey\n );\n\n /// @notice This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is\n /// successfully published.\n /// @param e3Id ID of the E3.\n /// @param data ABI encoded input data.\n event InputPublished(\n uint256 indexed e3Id,\n bytes data,\n uint256 inputHash,\n uint256 index\n );\n\n /// @notice This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3)\n /// is successfully published.\n /// @param e3Id ID of the E3.\n /// @param plaintextOutput ABI encoded plaintext output.\n event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput);\n\n /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3)\n /// is successfully published.\n /// @param e3Id ID of the E3.\n /// @param ciphertextOutput ABI encoded ciphertext output.\n event CiphertextOutputPublished(\n uint256 indexed e3Id,\n bytes ciphertextOutput\n );\n\n /// @notice This event MUST be emitted any time the `maxDuration` is set.\n /// @param maxDuration The maximum duration of a computation in seconds.\n event MaxDurationSet(uint256 maxDuration);\n\n /// @notice This event MUST be emitted any time the CiphernodeRegistry is set.\n /// @param ciphernodeRegistry The address of the CiphernodeRegistry contract.\n event CiphernodeRegistrySet(address ciphernodeRegistry);\n\n /// @notice The event MUST be emitted any time an encryption scheme is enabled.\n /// @param encryptionSchemeId The ID of the encryption scheme that was enabled.\n event EncryptionSchemeEnabled(bytes32 encryptionSchemeId);\n\n /// @notice This event MUST be emitted any time an encryption scheme is disabled.\n /// @param encryptionSchemeId The ID of the encryption scheme that was disabled.\n event EncryptionSchemeDisabled(bytes32 encryptionSchemeId);\n\n /// @notice This event MUST be emitted any time a E3 Program is enabled.\n /// @param e3Program The address of the E3 Program.\n event E3ProgramEnabled(IE3Program e3Program);\n\n /// @notice This event MUST be emitted any time a E3 Program is disabled.\n /// @param e3Program The address of the E3 Program.\n event E3ProgramDisabled(IE3Program e3Program);\n\n ////////////////////////////////////////////////////////////\n // //\n // Core Entrypoints //\n // //\n ////////////////////////////////////////////////////////////\n\n /// @notice This function should be called to request a computation within an Encrypted Execution Environment (E3).\n /// @dev This function MUST emit the E3Requested event.\n /// @param filter IDs of the pool of nodes from which to select the committee.\n /// @param threshold The M/N threshold for the committee.\n /// @param duration The duration of the computation in seconds.\n /// @param e3Program Address of the E3 Program.\n /// @param e3ProgramParams ABI encoded computation parameters.\n /// @param computeProviderParams ABI encoded compute provider parameters.\n /// @return e3Id ID of the E3.\n /// @return e3 The E3 struct.\n function request(\n address filter,\n uint32[2] calldata threshold,\n uint256[2] calldata startWindow,\n uint256 duration,\n IE3Program e3Program,\n bytes memory e3ProgramParams,\n bytes memory computeProviderParams\n ) external payable returns (uint256 e3Id, E3 memory e3);\n\n /// @notice This function should be called to activate an Encrypted Execution Environment (E3) once it has been\n /// initialized and is ready for input.\n /// @dev This function MUST emit the E3Activated event.\n /// @dev This function MUST revert if the given E3 has not yet been requested.\n /// @dev This function MUST revert if the selected node committee has not yet published a public key.\n /// @param e3Id ID of the E3.\n /// @param publicKey Public key of the committee.\n /// @return success True if the E3 was successfully activated.\n function activate(\n uint256 e3Id,\n bytes memory publicKey\n ) external returns (bool success);\n\n /// @notice This function should be called to publish input data for Encrypted Execution Environment (E3).\n /// @dev This function MUST revert if the E3 is not yet activated.\n /// @dev This function MUST emit the InputPublished event.\n /// @param e3Id ID of the E3.\n /// @param data ABI encoded input data to publish.\n /// @return success True if the input was successfully published.\n function publishInput(\n uint256 e3Id,\n bytes calldata data\n ) external returns (bool success);\n\n /// @notice This function should be called to publish output data for an Encrypted Execution Environment (E3).\n /// @dev This function MUST emit the CiphertextOutputPublished event.\n /// @param e3Id ID of the E3.\n /// @param ciphertextOutput ABI encoded output data to verify.\n /// @param proof ABI encoded data to verify the ciphertextOutput.\n /// @return success True if the output was successfully published.\n function publishCiphertextOutput(\n uint256 e3Id,\n bytes memory ciphertextOutput,\n bytes memory proof\n ) external returns (bool success);\n\n /// @notice This function publishes the plaintext output of an Encrypted Execution Environment (E3).\n /// @dev This function MUST revert if the output has not been published.\n /// @dev This function MUST emit the PlaintextOutputPublished event.\n /// @param e3Id ID of the E3.\n /// @param plaintextOutput ABI encoded plaintext output.\n /// @param proof ABI encoded data to verify the plaintextOutput.\n function publishPlaintextOutput(\n uint256 e3Id,\n bytes memory plaintextOutput,\n bytes memory proof\n ) external returns (bool success);\n\n ////////////////////////////////////////////////////////////\n // //\n // Set Functions //\n // //\n ////////////////////////////////////////////////////////////\n\n /// @notice This function should be called to set the maximum duration of requested computations.\n /// @param _maxDuration The maximum duration of a computation in seconds.\n /// @return success True if the max duration was successfully set.\n function setMaxDuration(\n uint256 _maxDuration\n ) external returns (bool success);\n\n ////////////////////////////////////////////////////////////\n // //\n // Get Functions //\n // //\n ////////////////////////////////////////////////////////////\n\n /// @notice This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\n /// @dev This function MUST revert if the E3 does not exist.\n /// @param e3Id ID of the E3.\n /// @return e3 The struct representing the requested E3.\n function getE3(uint256 e3Id) external view returns (E3 memory e3);\n\n /// @notice This function returns root of the input merkle tree for a given E3.\n /// @dev This function MUST revert if the E3 does not exist.\n /// @param e3Id ID of the E3.\n /// @return root The root of the input merkle tree.\n function getInputRoot(uint256 e3Id) external view returns (uint256 root);\n}\n" + }, + "contracts/interfaces/IInputValidator.sol": { + "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.27;\n\ninterface IInputValidator {\n /// @notice This function should be called by the Enclave contract to validate the\n /// input of a computation.\n /// @param sender The account that is submitting the input.\n /// @param data The input to be verified.\n /// @return input The decoded, policy-approved application payload.\n function validate(\n address sender,\n bytes memory data\n ) external returns (bytes memory input);\n}\n" + }, + "poseidon-solidity/PoseidonT3.sol": { + "content": "/// SPDX-License-Identifier: MIT\npragma solidity >=0.7.0;\n\nlibrary PoseidonT3 {\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\n\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\n function hash(uint[2] memory) public pure returns (uint) {\n assembly {\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\n\n // load the inputs from memory\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\n let scratch0 := mulmod(state1, state1, F)\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n scratch0 := mulmod(state2, state2, F)\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\n scratch0 := add(\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\n )\n let scratch1 := add(\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\n )\n let scratch2 := add(\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\n )\n let state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := mulmod(scratch1, scratch1, F)\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n state0 := mulmod(scratch2, scratch2, F)\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := mulmod(state1, state1, F)\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n scratch0 := mulmod(state2, state2, F)\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := mulmod(scratch1, scratch1, F)\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n state0 := mulmod(scratch2, scratch2, F)\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := mulmod(scratch1, scratch1, F)\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n state0 := mulmod(scratch2, scratch2, F)\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := mulmod(state1, state1, F)\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n scratch0 := mulmod(state2, state2, F)\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\n state0 := mulmod(scratch0, scratch0, F)\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n state0 := mulmod(scratch1, scratch1, F)\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n state0 := mulmod(scratch2, scratch2, F)\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\n scratch0 := mulmod(state0, state0, F)\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n scratch0 := mulmod(state1, state1, F)\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n scratch0 := mulmod(state2, state2, F)\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\n\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\n\n return(0, 0x20)\n }\n }\n}\n" + } + }, + "settings": { + "metadata": { + "bytecodeHash": "none", + "useLiteralContent": true + }, + "optimizer": { + "enabled": true, + "runs": 800 + }, + "viaIR": true, + "evmVersion": "paris", + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + } + } +} \ No newline at end of file From 64f59441d1c58c5683a47827f558f161761f3cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 19 May 2025 14:22:31 +0000 Subject: [PATCH 010/106] E3id collision bug (#376) * Refactor E3ID to include chain_id and update dependent code * Update packages/ciphernode/events/src/eventbus_factory.rs * Lint code suggestion --- packages/ciphernode/aggregator/src/ext.rs | 21 --- .../aggregator/src/plaintext_aggregator.rs | 6 +- .../aggregator/src/publickey_aggregator.rs | 10 +- packages/ciphernode/data/src/sled_store.rs | 3 +- packages/ciphernode/e3_request/src/meta.rs | 8 +- .../enclave_core/src/start/start.rs | 2 +- packages/ciphernode/events/src/e3id.rs | 35 +++-- .../src/enclave_event/ciphernode_added.rs | 1 + .../src/enclave_event/ciphernode_removed.rs | 1 + .../events/src/enclave_event/e3_requested.rs | 5 +- .../src/enclave_event/plaintext_aggregated.rs | 7 +- .../src/enclave_event/publickey_aggregated.rs | 5 +- .../events/src/enclave_event/test_event.rs | 4 +- packages/ciphernode/events/src/eventbus.rs | 28 +++- .../ciphernode/events/src/eventbus_factory.rs | 54 ++++---- .../evm/src/ciphernode_registry_sol.rs | 39 ++++-- .../ciphernode/evm/src/enclave_sol_reader.rs | 23 ++-- .../ciphernode/evm/src/enclave_sol_writer.rs | 2 +- .../ciphernode/evm/src/registry_filter_sol.rs | 2 +- packages/ciphernode/evm/tests/evm_reader.rs | 2 +- .../sortition/src/ciphernode_selector.rs | 2 + packages/ciphernode/sortition/src/repo.rs | 6 +- .../ciphernode/sortition/src/sortition.rs | 58 +++++--- .../tests/test_aggregation_and_decryption.rs | 128 ++++++++++++++---- 24 files changed, 278 insertions(+), 174 deletions(-) diff --git a/packages/ciphernode/aggregator/src/ext.rs b/packages/ciphernode/aggregator/src/ext.rs index 0114ff8cba..b4a38b194c 100644 --- a/packages/ciphernode/aggregator/src/ext.rs +++ b/packages/ciphernode/aggregator/src/ext.rs @@ -69,7 +69,6 @@ impl E3Extension for PlaintextAggregatorExtension { bus: self.bus.clone(), sortition: self.sortition.clone(), e3_id: e3_id.clone(), - src_chain_id: meta.src_chain_id, }, sync_state, ) @@ -102,21 +101,12 @@ impl E3Extension for PlaintextAggregatorExtension { return Ok(()); }; - let Some(ref meta) = ctx.get_dependency(META_KEY) else { - self.bus.err( - EnclaveErrorType::PlaintextAggregation, - anyhow!(ERROR_PLAINTEXT_META_MISSING), - ); - return Ok(()); - }; - let value = PlaintextAggregator::new( PlaintextAggregatorParams { fhe: fhe.clone(), bus: self.bus.clone(), sortition: self.sortition.clone(), e3_id: ctx.e3_id.clone(), - src_chain_id: meta.src_chain_id, }, sync_state, ) @@ -185,7 +175,6 @@ impl E3Extension for PublicKeyAggregatorExtension { bus: self.bus.clone(), sortition: self.sortition.clone(), e3_id, - src_chain_id: meta.src_chain_id, }, sync_state, ) @@ -219,22 +208,12 @@ impl E3Extension for PublicKeyAggregatorExtension { return Ok(()); }; - let Some(meta) = ctx.get_dependency(META_KEY) else { - self.bus.err( - EnclaveErrorType::PublickeyAggregation, - anyhow!(ERROR_PUBKEY_META_MISSING), - ); - - return Ok(()); - }; - let value = PublicKeyAggregator::new( PublicKeyAggregatorParams { fhe: fhe.clone(), bus: self.bus.clone(), sortition: self.sortition.clone(), e3_id: ctx.e3_id.clone(), - src_chain_id: meta.src_chain_id, }, sync_state, ) diff --git a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs index 98721379e7..167116a9da 100644 --- a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs +++ b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs @@ -52,7 +52,6 @@ pub struct PlaintextAggregator { sortition: Addr, e3_id: E3id, state: Persistable, - src_chain_id: u64, } pub struct PlaintextAggregatorParams { @@ -60,7 +59,6 @@ pub struct PlaintextAggregatorParams { pub bus: Addr>, pub sortition: Addr, pub e3_id: E3id, - pub src_chain_id: u64, } impl PlaintextAggregator { @@ -73,7 +71,6 @@ impl PlaintextAggregator { bus: params.bus, sortition: params.sortition, e3_id: params.e3_id, - src_chain_id: params.src_chain_id, state, } } @@ -144,12 +141,14 @@ impl Handler for PlaintextAggregator { let size = threshold_m; let address = event.node; + let chain_id = event.e3_id.chain_id(); let e3_id = event.e3_id.clone(); let decryption_share = event.decryption_share.clone(); Box::pin( self.sortition .send(GetHasNode { + chain_id, address, size, seed, @@ -203,7 +202,6 @@ impl Handler for PlaintextAggregator { let event = EnclaveEvent::from(PlaintextAggregated { decrypted_output, e3_id: self.e3_id.clone(), - src_chain_id: self.src_chain_id, }); self.bus.do_send(event); diff --git a/packages/ciphernode/aggregator/src/publickey_aggregator.rs b/packages/ciphernode/aggregator/src/publickey_aggregator.rs index a0126f5c9c..03869987a9 100644 --- a/packages/ciphernode/aggregator/src/publickey_aggregator.rs +++ b/packages/ciphernode/aggregator/src/publickey_aggregator.rs @@ -55,7 +55,6 @@ pub struct PublicKeyAggregator { sortition: Addr, e3_id: E3id, state: Persistable, - src_chain_id: u64, } pub struct PublicKeyAggregatorParams { @@ -63,7 +62,6 @@ pub struct PublicKeyAggregatorParams { pub bus: Addr>, pub sortition: Addr, pub e3_id: E3id, - pub src_chain_id: u64, } /// Aggregate PublicKey for a committee of nodes. This actor listens for KeyshareCreated events @@ -82,7 +80,6 @@ impl PublicKeyAggregator { bus: params.bus, sortition: params.sortition, e3_id: params.e3_id, - src_chain_id: params.src_chain_id, state, } } @@ -153,12 +150,14 @@ impl Handler for PublicKeyAggregator { let size = threshold_m; let address = event.node; + let chain_id = event.e3_id.chain_id(); let e3_id = event.e3_id.clone(); let pubkey = event.pubkey.clone(); Box::pin( self.sortition .send(GetHasNode { + chain_id, address, size, seed, @@ -221,7 +220,9 @@ impl Handler for PublicKeyAggregator { fn handle(&mut self, msg: NotifyNetwork, _: &mut Self::Context) -> Self::Result { Box::pin( self.sortition - .send(GetNodes) + .send(GetNodes { + chain_id: msg.e3_id.chain_id(), + }) .into_actor(self) .map(move |res, act, _| { let nodes = res?; @@ -230,7 +231,6 @@ impl Handler for PublicKeyAggregator { pubkey: msg.pubkey.clone(), e3_id: msg.e3_id.clone(), nodes: OrderedSet::from(nodes), - src_chain_id: act.src_chain_id, }); act.bus.do_send(event); Ok(()) diff --git a/packages/ciphernode/data/src/sled_store.rs b/packages/ciphernode/data/src/sled_store.rs index 4bf854efc5..8905ed5eb3 100644 --- a/packages/ciphernode/data/src/sled_store.rs +++ b/packages/ciphernode/data/src/sled_store.rs @@ -2,7 +2,8 @@ use crate::{Get, Insert, InsertSync, Remove}; use actix::{Actor, ActorContext, Addr, Handler}; use anyhow::{Context, Result}; use events::{ - get_enclave_event_bus, BusError, EnclaveErrorType, EnclaveEvent, EventBus, Subscribe, + get_enclave_event_bus, BusError, EnclaveErrorType, EnclaveEvent, EventBus, EventBusConfig, + Subscribe, }; use once_cell::sync::Lazy; use sled::Db; diff --git a/packages/ciphernode/e3_request/src/meta.rs b/packages/ciphernode/e3_request/src/meta.rs index 48d53c5ced..f8ec76db96 100644 --- a/packages/ciphernode/e3_request/src/meta.rs +++ b/packages/ciphernode/e3_request/src/meta.rs @@ -10,7 +10,6 @@ pub const META_KEY: TypedKey = TypedKey::new("meta"); pub struct E3Meta { pub threshold_m: usize, pub seed: Seed, - pub src_chain_id: u64, } pub struct E3MetaExtension; @@ -30,17 +29,12 @@ impl E3Extension for E3MetaExtension { let E3Requested { threshold_m, seed, - src_chain_id, e3_id, .. } = data.clone(); // Meta doesn't implement Checkpoint so we are going to store it manually - let meta = E3Meta { - threshold_m, - seed, - src_chain_id, - }; + let meta = E3Meta { threshold_m, seed }; ctx.repositories().meta(&e3_id).write(&meta); let _ = ctx.set_dependency(META_KEY, meta); } diff --git a/packages/ciphernode/enclave_core/src/start/start.rs b/packages/ciphernode/enclave_core/src/start/start.rs index 796c162221..6a552ef7fb 100644 --- a/packages/ciphernode/enclave_core/src/start/start.rs +++ b/packages/ciphernode/enclave_core/src/start/start.rs @@ -1,4 +1,4 @@ -use actix::{Actor, Addr}; +use actix::Addr; use alloy::primitives::Address; use anyhow::Result; use config::AppConfig; diff --git a/packages/ciphernode/events/src/e3id.rs b/packages/ciphernode/events/src/e3id.rs index 20c6362be5..6f5907912a 100644 --- a/packages/ciphernode/events/src/e3id.rs +++ b/packages/ciphernode/events/src/e3id.rs @@ -4,40 +4,37 @@ use core::fmt; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub struct E3id(pub String); +pub struct E3id { + id: String, + chain_id: u64, +} + impl fmt::Display for E3id { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(&self.0) + write!(f, "{}:{}", self.chain_id, self.id) } } impl E3id { - pub fn new(id: impl Into) -> Self { - Self(id.into()) + pub fn new(id: impl Into, chain_id: u64) -> Self { + Self { + id: id.into(), + chain_id, + } } -} -impl From for E3id { - fn from(value: u32) -> Self { - E3id::new(value.to_string()) + pub fn e3_id(&self) -> &str { + &self.id } -} - -impl From for E3id { - fn from(value: String) -> Self { - E3id::new(value) - } -} -impl From<&str> for E3id { - fn from(value: &str) -> Self { - E3id::new(value) + pub fn chain_id(&self) -> u64 { + self.chain_id } } impl TryFrom for U256 { type Error = ParseError; fn try_from(value: E3id) -> Result { - U256::from_str_radix(&value.0, 10) + U256::from_str_radix(&value.id, 10) } } diff --git a/packages/ciphernode/events/src/enclave_event/ciphernode_added.rs b/packages/ciphernode/events/src/enclave_event/ciphernode_added.rs index 33c8af41af..b59ce40b1f 100644 --- a/packages/ciphernode/events/src/enclave_event/ciphernode_added.rs +++ b/packages/ciphernode/events/src/enclave_event/ciphernode_added.rs @@ -8,6 +8,7 @@ pub struct CiphernodeAdded { pub address: String, pub index: usize, pub num_nodes: usize, + pub chain_id: u64, } impl Display for CiphernodeAdded { diff --git a/packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs b/packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs index e43e38289d..9b1da86799 100644 --- a/packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs +++ b/packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs @@ -8,6 +8,7 @@ pub struct CiphernodeRemoved { pub address: String, pub index: usize, pub num_nodes: usize, + pub chain_id: u64, } impl Display for CiphernodeRemoved { diff --git a/packages/ciphernode/events/src/enclave_event/e3_requested.rs b/packages/ciphernode/events/src/enclave_event/e3_requested.rs index 4526a2a02c..eaba0dd7a2 100644 --- a/packages/ciphernode/events/src/enclave_event/e3_requested.rs +++ b/packages/ciphernode/events/src/enclave_event/e3_requested.rs @@ -10,15 +10,14 @@ pub struct E3Requested { pub threshold_m: usize, pub seed: Seed, pub params: Vec, - pub src_chain_id: u64, } impl Display for E3Requested { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "e3_id: {}, threshold_m: {}, src_chain_id: {}, seed: {}, params: ", - self.e3_id, self.threshold_m, self.src_chain_id, self.seed + "e3_id: {}, threshold_m: {}, seed: {}, params: ", + self.e3_id, self.threshold_m, self.seed ) } } diff --git a/packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs b/packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs index 7e24d5a769..dc3c3019aa 100644 --- a/packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs +++ b/packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs @@ -8,15 +8,10 @@ use std::fmt::{self, Display}; pub struct PlaintextAggregated { pub e3_id: E3id, pub decrypted_output: Vec, - pub src_chain_id: u64, } impl Display for PlaintextAggregated { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "e3_id: {}, src_chain_id: {}", - self.e3_id, self.src_chain_id - ) + write!(f, "e3_id: {}", self.e3_id) } } diff --git a/packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs b/packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs index 0a71cbc34e..a7c9e6f8ba 100644 --- a/packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs +++ b/packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs @@ -9,15 +9,14 @@ pub struct PublicKeyAggregated { pub pubkey: Vec, pub e3_id: E3id, pub nodes: OrderedSet, - pub src_chain_id: u64, } impl Display for PublicKeyAggregated { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "e3_id: {}, src_chain_id: {}, nodes: , pubkey: ", - self.e3_id, self.src_chain_id, + "e3_id: {}, nodes: , pubkey: ", + self.e3_id, ) } } diff --git a/packages/ciphernode/events/src/enclave_event/test_event.rs b/packages/ciphernode/events/src/enclave_event/test_event.rs index 2f5f3b2519..233a7bd110 100644 --- a/packages/ciphernode/events/src/enclave_event/test_event.rs +++ b/packages/ciphernode/events/src/enclave_event/test_event.rs @@ -1,6 +1,5 @@ use actix::Message; use serde::{Deserialize, Serialize}; -use std::fmt::{self, Display}; #[derive(Message, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[rtype(result = "()")] @@ -9,6 +8,9 @@ pub struct TestEvent { pub entropy: u64, } +#[cfg(test)] +use std::fmt::{self, Display}; + #[cfg(test)] impl Display for TestEvent { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { diff --git a/packages/ciphernode/events/src/eventbus.rs b/packages/ciphernode/events/src/eventbus.rs index f9ac315ffb..2c09a825be 100644 --- a/packages/ciphernode/events/src/eventbus.rs +++ b/packages/ciphernode/events/src/eventbus.rs @@ -1,6 +1,4 @@ use actix::prelude::*; -use anyhow::anyhow; -use anyhow::Result; use bloom::{BloomFilter, ASMS}; use std::collections::{HashMap, HashSet}; use std::fmt::{Debug, Display}; @@ -27,6 +25,21 @@ pub trait ErrorEvent: Event { fn from_error(err_type: Self::ErrorType, error: anyhow::Error) -> Self; } +////////////////////////////////////////////////////////////////////////////// +// Configuration +////////////////////////////////////////////////////////////////////////////// + +/// Configuration for EventBus behavior +pub struct EventBusConfig { + pub deduplicate: bool, +} + +impl Default for EventBusConfig { + fn default() -> Self { + Self { deduplicate: true } + } +} + fn default_bloomfilter() -> BloomFilter { let num_items = 10000000; let fp_rate = 0.001; @@ -42,6 +55,7 @@ fn default_bloomfilter() -> BloomFilter { /// actually get published as well as ensure that local events are not rebroadcast locally after /// being published. pub struct EventBus { + config: EventBusConfig, ids: BloomFilter, listeners: HashMap>>, } @@ -51,13 +65,18 @@ impl Actor for EventBus { } impl EventBus { - pub fn new() -> Self { + pub fn new(config: EventBusConfig) -> Self { EventBus { + config, listeners: HashMap::new(), ids: default_bloomfilter(), } } + pub fn set_config(&mut self, config: EventBusConfig) { + self.config = config; + } + fn track(&mut self, event: E) { self.ids.insert(&event.event_id()); } @@ -70,6 +89,7 @@ impl EventBus { impl Default for EventBus { fn default() -> Self { Self { + config: EventBusConfig::default(), listeners: HashMap::new(), ids: default_bloomfilter(), } @@ -208,7 +228,7 @@ pub struct HistoryCollector { history: Vec, } -impl HistoryCollector { +impl HistoryCollector { pub fn new() -> Self { Self { history: Vec::new(), diff --git a/packages/ciphernode/events/src/eventbus_factory.rs b/packages/ciphernode/events/src/eventbus_factory.rs index d96edfa19a..001a6a6623 100644 --- a/packages/ciphernode/events/src/eventbus_factory.rs +++ b/packages/ciphernode/events/src/eventbus_factory.rs @@ -33,49 +33,47 @@ impl EventBusFactory { // Get or create a singleton EventBus for the specific event type pub fn get_event_bus(&self) -> Addr> { let type_id = TypeId::of::(); + let mut event_bus_cache = self + .event_bus_cache + .lock() + .expect("event_bus_cache mutex failed to lock"); - // Cache hit in new scope for mutex - { - let event_bus_cache = self.event_bus_cache.lock().unwrap(); - if let Some(instance) = event_bus_cache.get(&type_id) { - return instance - .downcast_ref::>>() - .expect("Type mismatch in EventBusFactory") - .clone(); - } + // If we already have this type of EventBus, return it + if let Some(instance) = event_bus_cache.get(&type_id) { + return instance + .downcast_ref::>>() + .expect("Type mismatch in EventBusFactory") + .clone(); } - // Cache miss + // Create a new EventBus for this event type let event_bus = EventBus::::default().start(); - let mut event_bus_cache = self.event_bus_cache.lock().unwrap(); + + // Store it in our HashMap event_bus_cache.insert(type_id, Box::new(event_bus.clone())); + event_bus } - - // Get or create a singleton ErrorCollector for the specific event type pub fn get_error_collector(&self) -> Addr> { let type_id = TypeId::of::(); + let mut error_collector_cache = self.error_collector_cache.lock().unwrap(); - // Cache hit in new scope for mutex - { - let error_collector_cache = self.error_collector_cache.lock().unwrap(); - if let Some(instance) = error_collector_cache.get(&type_id) { - return instance - .downcast_ref::>>() - .expect("Type mismatch in EventBusFactory") - .clone(); - } + // If we already have this type of ErrorCollector, return it + if let Some(instance) = error_collector_cache.get(&type_id) { + return instance + .downcast_ref::>>() + .expect("Type mismatch in EventBusFactory") + .clone(); } - // Cache miss + // Create a new EventBus for this event type let error_collector = ErrorCollector::::new().start(); + // Importantly subscribe to events let bus = self.get_event_bus::(); - bus.do_send(Subscribe::new( - "EnclaveError", - error_collector.clone().recipient(), - )); - let mut error_collector_cache = self.error_collector_cache.lock().unwrap(); + bus.do_send(Subscribe::new("*", error_collector.clone().recipient())); + // Store it in our HashMap error_collector_cache.insert(type_id, Box::new(error_collector.clone())); + error_collector } } diff --git a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs index ea7d8dfe1b..16b494604c 100644 --- a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs +++ b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs @@ -22,54 +22,63 @@ sol!( "../../evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json" ); -impl From for events::CiphernodeAdded { - fn from(value: ICiphernodeRegistry::CiphernodeAdded) -> Self { +struct CiphernodeAddedWithChainId(pub ICiphernodeRegistry::CiphernodeAdded, pub u64); + +impl From for events::CiphernodeAdded { + fn from(value: CiphernodeAddedWithChainId) -> Self { events::CiphernodeAdded { - address: value.node.to_string(), + address: value.0.node.to_string(), // TODO: limit index and numNodes to uint32 at the solidity level index: value + .0 .index .try_into() .expect("Index exceeds usize capacity"), num_nodes: value + .0 .numNodes .try_into() .expect("NumNodes exceeds usize capacity"), + chain_id: value.1, } } } -impl From for EnclaveEvent { - fn from(value: ICiphernodeRegistry::CiphernodeAdded) -> Self { +impl From for EnclaveEvent { + fn from(value: CiphernodeAddedWithChainId) -> Self { let payload: events::CiphernodeAdded = value.into(); EnclaveEvent::from(payload) } } -impl From for events::CiphernodeRemoved { - fn from(value: ICiphernodeRegistry::CiphernodeRemoved) -> Self { +struct CiphernodeRemovedWithChainId(pub ICiphernodeRegistry::CiphernodeRemoved, pub u64); +impl From for events::CiphernodeRemoved { + fn from(value: CiphernodeRemovedWithChainId) -> Self { events::CiphernodeRemoved { - address: value.node.to_string(), + address: value.0.node.to_string(), index: value + .0 .index .try_into() .expect("Index exceeds usize capacity"), num_nodes: value + .0 .numNodes .try_into() .expect("NumNodes exceeds usize capacity"), + chain_id: value.1, } } } -impl From for EnclaveEvent { - fn from(value: ICiphernodeRegistry::CiphernodeRemoved) -> Self { +impl From for EnclaveEvent { + fn from(value: CiphernodeRemovedWithChainId) -> Self { let payload: events::CiphernodeRemoved = value.into(); EnclaveEvent::from(payload) } } -pub fn extractor(data: &LogData, topic: Option<&B256>, _: u64) -> Option { +pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option { match topic { Some(&ICiphernodeRegistry::CiphernodeAdded::SIGNATURE_HASH) => { let Ok(event) = ICiphernodeRegistry::CiphernodeAdded::decode_log_data(data, true) @@ -77,7 +86,9 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, _: u64) -> Option { let Ok(event) = ICiphernodeRegistry::CiphernodeRemoved::decode_log_data(data, true) @@ -85,7 +96,9 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, _: u64) -> Option { diff --git a/packages/ciphernode/evm/src/enclave_sol_reader.rs b/packages/ciphernode/evm/src/enclave_sol_reader.rs index 2754a77750..6e64651639 100644 --- a/packages/ciphernode/evm/src/enclave_sol_reader.rs +++ b/packages/ciphernode/evm/src/enclave_sol_reader.rs @@ -7,7 +7,7 @@ use alloy::transports::BoxTransport; use alloy::{sol, sol_types::SolEvent}; use anyhow::Result; use data::Repository; -use events::{EnclaveEvent, EventBus}; +use events::{E3id, EnclaveEvent, EventBus}; use tracing::{error, info, trace}; sol!( @@ -24,8 +24,7 @@ impl From for events::E3Requested { params: value.0.e3.e3ProgramParams.to_vec(), threshold_m: value.0.e3.threshold[0] as usize, seed: value.0.e3.seed.into(), - e3_id: value.0.e3Id.to_string().into(), - src_chain_id: value.1, + e3_id: E3id::new(value.0.e3Id.to_string(), value.1), } } } @@ -37,17 +36,19 @@ impl From for EnclaveEvent { } } -impl From for events::CiphertextOutputPublished { - fn from(value: IEnclave::CiphertextOutputPublished) -> Self { +struct CiphertextOutputPublishedWithChainId(pub IEnclave::CiphertextOutputPublished, pub u64); + +impl From for events::CiphertextOutputPublished { + fn from(value: CiphertextOutputPublishedWithChainId) -> Self { events::CiphertextOutputPublished { - e3_id: value.e3Id.to_string().into(), - ciphertext_output: value.ciphertextOutput.to_vec(), + e3_id: E3id::new(value.0.e3Id.to_string(), value.1), + ciphertext_output: value.0.ciphertextOutput.to_vec(), } } } -impl From for EnclaveEvent { - fn from(value: IEnclave::CiphertextOutputPublished) -> Self { +impl From for EnclaveEvent { + fn from(value: CiphertextOutputPublishedWithChainId) -> Self { let payload: events::CiphertextOutputPublished = value.into(); EnclaveEvent::from(payload) } @@ -67,7 +68,9 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option< error!("Error parsing event CiphertextOutputPublished after topic matched!"); // TODO: provide more info return None; }; - Some(EnclaveEvent::from(event)) + Some(EnclaveEvent::from(CiphertextOutputPublishedWithChainId( + event, chain_id, + ))) } _topic => { diff --git a/packages/ciphernode/evm/src/enclave_sol_writer.rs b/packages/ciphernode/evm/src/enclave_sol_writer.rs index 202f0d9477..2e3d82b72b 100644 --- a/packages/ciphernode/evm/src/enclave_sol_writer.rs +++ b/packages/ciphernode/evm/src/enclave_sol_writer.rs @@ -64,7 +64,7 @@ impl Handler for EnclaveSolWriter { match msg { EnclaveEvent::PlaintextAggregated { data, .. } => { // Only publish if the src and destination chains match - if self.provider.get_chain_id() == data.src_chain_id { + if self.provider.get_chain_id() == data.e3_id.chain_id() { ctx.notify(data); } } diff --git a/packages/ciphernode/evm/src/registry_filter_sol.rs b/packages/ciphernode/evm/src/registry_filter_sol.rs index f9066d2fba..f7092a65d7 100644 --- a/packages/ciphernode/evm/src/registry_filter_sol.rs +++ b/packages/ciphernode/evm/src/registry_filter_sol.rs @@ -63,7 +63,7 @@ impl Handler for RegistryFilterSolWriter { match msg { EnclaveEvent::PublicKeyAggregated { data, .. } => { // Only publish if the src and destination chains match - if self.provider.get_chain_id() == data.src_chain_id { + if self.provider.get_chain_id() == data.e3_id.chain_id() { ctx.notify(data); } } diff --git a/packages/ciphernode/evm/tests/evm_reader.rs b/packages/ciphernode/evm/tests/evm_reader.rs index f976e79d13..2e1e7a3863 100644 --- a/packages/ciphernode/evm/tests/evm_reader.rs +++ b/packages/ciphernode/evm/tests/evm_reader.rs @@ -1,4 +1,4 @@ -use actix::{Actor, Addr}; +use actix::Addr; use alloy::{ node_bindings::Anvil, primitives::{FixedBytes, LogData}, diff --git a/packages/ciphernode/sortition/src/ciphernode_selector.rs b/packages/ciphernode/sortition/src/ciphernode_selector.rs index b0f2a53700..cc032bda2b 100644 --- a/packages/ciphernode/sortition/src/ciphernode_selector.rs +++ b/packages/ciphernode/sortition/src/ciphernode_selector.rs @@ -60,6 +60,7 @@ impl Handler for CiphernodeSelector { let address = self.address.clone(); let sortition = self.sortition.clone(); let bus = self.bus.clone(); + let chain_id = data.e3_id.chain_id(); Box::pin(async move { let seed = data.seed; @@ -67,6 +68,7 @@ impl Handler for CiphernodeSelector { if let Ok(is_selected) = sortition .send(GetHasNode { + chain_id, seed, address: address.clone(), size, diff --git a/packages/ciphernode/sortition/src/repo.rs b/packages/ciphernode/sortition/src/repo.rs index 2b84c1841a..e264f6c7ca 100644 --- a/packages/ciphernode/sortition/src/repo.rs +++ b/packages/ciphernode/sortition/src/repo.rs @@ -1,14 +1,16 @@ +use std::collections::HashMap; + use config::StoreKeys; use data::{Repositories, Repository}; use crate::SortitionModule; pub trait SortitionRepositoryFactory { - fn sortition(&self) -> Repository; + fn sortition(&self) -> Repository>; } impl SortitionRepositoryFactory for Repositories { - fn sortition(&self) -> Repository { + fn sortition(&self) -> Repository> { Repository::new(self.store.scope(StoreKeys::sortition())) } } diff --git a/packages/ciphernode/sortition/src/sortition.rs b/packages/ciphernode/sortition/src/sortition.rs index afe1ff908f..e5b1b3fdf6 100644 --- a/packages/ciphernode/sortition/src/sortition.rs +++ b/packages/ciphernode/sortition/src/sortition.rs @@ -7,7 +7,7 @@ use events::{ BusError, CiphernodeAdded, CiphernodeRemoved, EnclaveErrorType, EnclaveEvent, EventBus, Seed, Subscribe, }; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use tracing::{info, instrument, trace}; #[derive(Message, Clone, Debug, PartialEq, Eq)] @@ -16,6 +16,7 @@ pub struct GetHasNode { pub seed: Seed, pub address: String, pub size: usize, + pub chain_id: u64, } pub trait SortitionList { @@ -83,17 +84,19 @@ impl SortitionList for SortitionModule { #[derive(Message)] #[rtype(result = "Vec")] -pub struct GetNodes; +pub struct GetNodes { + pub chain_id: u64, +} pub struct Sortition { - list: Persistable, + list: Persistable>, bus: Addr>, } #[derive(Debug)] pub struct SortitionParams { bus: Addr>, - list: Persistable, + list: Persistable>, } impl Sortition { @@ -107,9 +110,9 @@ impl Sortition { #[instrument(name = "sortition", skip_all)] pub async fn attach( bus: &Addr>, - store: Repository, + store: Repository>, ) -> Result> { - let list = store.load_or_default(SortitionModule::default()).await?; + let list = store.load_or_default(HashMap::new()).await?; let addr = Sortition::new(SortitionParams { bus: bus.clone(), list, @@ -119,8 +122,14 @@ impl Sortition { Ok(addr) } - pub fn get_nodes(&self) -> Vec { - self.list.get().unwrap().nodes.clone().into_iter().collect() + pub fn get_nodes(&self, chain_id: u64) -> Result> { + let list_by_chain_id = self.list.get().ok_or(anyhow!( + "Could not get sortition's list cache. This should not happen." + ))?; + let list = list_by_chain_id + .get(&chain_id) + .ok_or(anyhow!("No list found for chain_id {}", chain_id))?; + Ok(list.nodes.clone().into_iter().collect()) } } @@ -145,9 +154,13 @@ impl Handler for Sortition { #[instrument(name = "sortition", skip_all)] fn handle(&mut self, msg: CiphernodeAdded, _ctx: &mut Self::Context) -> Self::Result { trace!("Adding node: {}", msg.address); - match self.list.try_mutate(|mut list| { - list.add(msg.address); - Ok(list) + match self.list.try_mutate(|mut list_map| { + list_map + .entry(msg.chain_id) + .or_insert_with(|| SortitionModule::default()) + .add(msg.address); + + Ok(list_map) }) { Err(err) => self.bus.err(EnclaveErrorType::Sortition, err), _ => (), @@ -161,9 +174,14 @@ impl Handler for Sortition { #[instrument(name = "sortition", skip_all)] fn handle(&mut self, msg: CiphernodeRemoved, _ctx: &mut Self::Context) -> Self::Result { info!("Removing node: {}", msg.address); - match self.list.try_mutate(|mut list| { - list.remove(msg.address); - Ok(list) + match self.list.try_mutate(|mut list_map| { + list_map + .get_mut(&msg.chain_id) + .ok_or(anyhow!( + "Cannot remove a node from list that does not exist. It appears that the list for chain_id '{}' has not yet been created.", &msg.chain_id + ))? + .remove(msg.address); + Ok(list_map) }) { Err(err) => self.bus.err(EnclaveErrorType::Sortition, err), _ => (), @@ -177,7 +195,13 @@ impl Handler for Sortition { #[instrument(name = "sortition", skip_all)] fn handle(&mut self, msg: GetHasNode, _ctx: &mut Self::Context) -> Self::Result { self.list - .try_with(|list| list.contains(msg.seed, msg.size, msg.address)) + .try_with(|list_map| { + if let Some(entry) = list_map.get(&msg.chain_id) { + return entry.contains(msg.seed, msg.size, msg.address); + } + + Ok(false) + }) .unwrap_or_else(|err| { self.bus.err(EnclaveErrorType::Sortition, err); false @@ -188,7 +212,7 @@ impl Handler for Sortition { impl Handler for Sortition { type Result = Vec; - fn handle(&mut self, _msg: GetNodes, _ctx: &mut Self::Context) -> Self::Result { - self.get_nodes() + fn handle(&mut self, msg: GetNodes, _ctx: &mut Self::Context) -> Self::Result { + self.get_nodes(msg.chain_id).unwrap_or(vec![]) } } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index ad11e18d0e..ee05bc0efc 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -9,8 +9,8 @@ use e3_request::E3Router; use enclave_sdk_isomorphic::bfv::params::SET_2048_1032193_1; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, - E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, GetErrors, - GetHistory, HistoryCollector, KeyshareCreated, OrderedSet, PlaintextAggregated, + E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, EventBusConfig, + GetErrors, GetHistory, HistoryCollector, KeyshareCreated, OrderedSet, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed, Shutdown, Subscribe, }; use fhe::ext::FheExtension; @@ -130,17 +130,20 @@ fn create_crp_bytes_params( struct AddToCommittee { bus: Addr>, count: usize, + chain_id: u64, } impl AddToCommittee { - fn new(bus: &Addr>) -> Self { + fn new(bus: &Addr>, chain_id: u64) -> Self { Self { bus: bus.clone(), + chain_id, count: 0, } } async fn add(&mut self, address: &str) -> Result { let evt = EnclaveEvent::from(CiphernodeAdded { + chain_id: self.chain_id, address: address.to_owned(), index: self.count, num_nodes: self.count + 1, @@ -192,8 +195,9 @@ fn pad_end(input: &[u64], pad: u64, total: usize) -> Vec { async fn add_ciphernodes( bus: &Addr>, addrs: &Vec, + chain_id: u64, ) -> Result> { - let mut committee = AddToCommittee::new(&bus); + let mut committee = AddToCommittee::new(&bus, chain_id); let mut evts: Vec = vec![]; for addr in addrs { @@ -264,11 +268,10 @@ fn get_common_setup() -> Result<( Seed, Arc, CommonRandomPoly, - E3id, Addr>, Addr>, )> { - let bus = EventBus::::new().start(); + let bus = EventBus::::new(EventBusConfig { deduplicate: true }).start(); let errors = ErrorCollector::::new().start(); let history = HistoryCollector::::new().start(); bus.do_send(Subscribe::new("*", history.clone().recipient())); @@ -279,15 +282,15 @@ fn get_common_setup() -> Result<( let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; let (crp_bytes, params) = create_crp_bytes_params(&moduli, degree, plaintext_modulus, &seed); let crpoly = CommonRandomPoly::deserialize(&crp_bytes.clone(), ¶ms)?; - let e3_id = E3id::new("1234"); - Ok((bus, rng, seed, params, crpoly, e3_id, errors, history)) + Ok((bus, rng, seed, params, crpoly, errors, history)) } #[actix::test] async fn test_public_key_aggregation_and_decryption() -> Result<()> { // Setup - let (bus, rng, seed, params, crpoly, e3_id, _, history_collector) = get_common_setup()?; + let (bus, rng, seed, params, crpoly, _, history_collector) = get_common_setup()?; + let e3_id = E3id::new("1234", 1); let cipher = Arc::new(Cipher::from_password("Don't tell anyone my secret").await?); // Setup actual ciphernodes and dispatch add events @@ -296,13 +299,12 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { .iter() .map(|tup| tup.0.to_owned()) .collect(); - let add_events = add_ciphernodes(&bus, ð_addrs).await?; + let add_events = add_ciphernodes(&bus, ð_addrs, 1).await?; let e3_request_event = EnclaveEvent::from(E3Requested { e3_id: e3_id.clone(), threshold_m: 3, seed: seed.clone(), params: params.to_bytes(), - src_chain_id: 1, }); // Send the computation requested event @@ -337,7 +339,6 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { pubkey: test_pubkey.to_bytes(), e3_id: e3_id.clone(), nodes: OrderedSet::from(eth_addrs.clone()), - src_chain_id: 1, }), ]); @@ -379,7 +380,6 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { EnclaveEvent::from(PlaintextAggregated { e3_id: e3_id.clone(), decrypted_output: expected.clone(), - src_chain_id: 1, }), EnclaveEvent::from(E3RequestComplete { e3_id: e3_id.clone(), @@ -397,15 +397,16 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { #[actix::test] async fn test_stopped_keyshares_retain_state() -> Result<()> { - let (bus, rng, seed, params, crpoly, e3_id, error_collector, history_collector) = - get_common_setup()?; + let (bus, rng, seed, params, crpoly, error_collector, history_collector) = get_common_setup()?; + let e3_id = E3id::new("1234", 1); + let cipher = Arc::new(Cipher::from_password("Don't tell anyone my secret").await?); let eth_addrs = create_random_eth_addrs(2); let cn1 = setup_local_ciphernode(&bus, &rng, true, ð_addrs[0], None, &cipher).await?; let cn2 = setup_local_ciphernode(&bus, &rng, true, ð_addrs[1], None, &cipher).await?; - add_ciphernodes(&bus, ð_addrs).await?; + add_ciphernodes(&bus, ð_addrs, 1).await?; // Send e3request bus.send( @@ -414,7 +415,6 @@ async fn test_stopped_keyshares_retain_state() -> Result<()> { threshold_m: 2, seed: seed.clone(), params: params.to_bytes(), - src_chain_id: 1, }) .clone(), ) @@ -490,7 +490,7 @@ async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { // Setup elements in test let (cmd_tx, mut cmd_rx) = mpsc::channel(100); // Transmit byte events to the network let (event_tx, _) = broadcast::channel(100); // Receive byte events from the network - let bus = EventBus::::new().start(); + let bus = EventBus::::new(EventBusConfig { deduplicate: true }).start(); let history_collector = HistoryCollector::::new().start(); bus.do_send(Subscribe::new("*", history_collector.clone().recipient())); let event_rx = event_tx.subscribe(); @@ -522,19 +522,17 @@ async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { }); let evt_1 = EnclaveEvent::from(PlaintextAggregated { - e3_id: E3id::new("1235"), + e3_id: E3id::new("1235", 1), decrypted_output: vec![1, 2, 3, 4], - src_chain_id: 1, }); let evt_2 = EnclaveEvent::from(PlaintextAggregated { - e3_id: E3id::new("1236"), + e3_id: E3id::new("1236", 1), decrypted_output: vec![1, 2, 3, 4], - src_chain_id: 1, }); let local_evt_3 = EnclaveEvent::from(CiphernodeSelected { - e3_id: E3id::new("1235"), + e3_id: E3id::new("1235", 1), threshold_m: 3, }); @@ -565,6 +563,85 @@ async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { Ok(()) } +#[actix::test] +async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { + // Setup + let (bus, rng, seed, params, crpoly, _, history_collector) = get_common_setup()?; + let cipher = Arc::new(Cipher::from_password("Don't tell anyone my secret").await?); + + // Setup actual ciphernodes and dispatch add events + let ciphernode_addrs = create_local_ciphernodes(&bus, &rng, 3, &cipher).await?; + let eth_addrs = ciphernode_addrs + .iter() + .map(|tup| tup.0.to_owned()) + .collect(); + add_ciphernodes(&bus, ð_addrs, 1).await?; + add_ciphernodes(&bus, ð_addrs, 2).await?; + + // Send the computation requested event + bus.send(EnclaveEvent::from(E3Requested { + e3_id: E3id::new("1234", 1), + threshold_m: 3, + seed: seed.clone(), + params: params.to_bytes(), + })) + .await?; + + // Wait for events to flush through + sleep(Duration::from_millis(10)).await; + + // Generate the test shares and pubkey + let rng_test = create_shared_rng_from_u64(42); + let test_pubkey = aggregate_public_key(&generate_pk_shares( + ¶ms, &crpoly, &rng_test, ð_addrs, + )?)?; + + let history = history_collector + .send(GetHistory::::new()) + .await?; + + assert_eq!( + history.last().unwrap(), + &EnclaveEvent::from(PublicKeyAggregated { + pubkey: test_pubkey.to_bytes(), + e3_id: E3id::new("1234", 1), + nodes: OrderedSet::from(eth_addrs.clone()), + }) + ); + + history_collector.send(ResetHistory).await?; + + // Send the computation requested event + bus.send(EnclaveEvent::from(E3Requested { + e3_id: E3id::new("1234", 2), + threshold_m: 3, + seed: seed.clone(), + params: params.to_bytes(), + })) + .await?; + + sleep(Duration::from_millis(10)).await; + + let test_pubkey = aggregate_public_key(&generate_pk_shares( + ¶ms, &crpoly, &rng_test, ð_addrs, + )?)?; + + let history = history_collector + .send(GetHistory::::new()) + .await?; + + assert_eq!( + history.last().unwrap(), + &EnclaveEvent::from(PublicKeyAggregated { + pubkey: test_pubkey.to_bytes(), + e3_id: E3id::new("1234", 2), + nodes: OrderedSet::from(eth_addrs.clone()), + }) + ); + + Ok(()) +} + #[actix::test] async fn test_p2p_actor_forwards_events_to_bus() -> Result<()> { let seed = Seed(ChaCha20Rng::seed_from_u64(123).get_seed()); @@ -572,7 +649,7 @@ async fn test_p2p_actor_forwards_events_to_bus() -> Result<()> { // Setup elements in test let (cmd_tx, _) = mpsc::channel(100); // Transmit byte events to the network let (event_tx, event_rx) = broadcast::channel(100); // Receive byte events from the network - let bus = EventBus::::new().start(); + let bus = EventBus::::new(EventBusConfig { deduplicate: true }).start(); let history_collector = HistoryCollector::::new().start(); bus.do_send(Subscribe::new("*", history_collector.clone().recipient())); @@ -580,11 +657,10 @@ async fn test_p2p_actor_forwards_events_to_bus() -> Result<()> { // Capture messages from output on msgs vec let event = EnclaveEvent::from(E3Requested { - e3_id: E3id::new("1235"), + e3_id: E3id::new("1235", 1), threshold_m: 3, seed: seed.clone(), params: vec![1, 2, 3, 4], - src_chain_id: 1, }); // lets send an event from the network From b149c5626d84bdc0607884aa51a8b928c7ca36af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 19 May 2025 15:20:18 +0000 Subject: [PATCH 011/106] Consolidate to single `enclave-sdk` package (#422) * Consolidate to single package * Use eyre within host feature * Update lock files * use full feature as gate --- examples/CRISP/apps/program/Cargo.lock | 4 +- examples/CRISP/apps/program/core/Cargo.toml | 2 +- examples/CRISP/apps/program/core/src/lib.rs | 2 +- .../apps/program/methods/guest/Cargo.lock | 4 +- examples/CRISP/apps/server/Cargo.lock | 13 +- examples/CRISP/apps/server/Cargo.toml | 1 - .../CRISP/apps/server/src/cli/commands.rs | 4 +- .../apps/server/src/server/routes/rounds.rs | 2 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 5 +- examples/CRISP/apps/wasm-crypto/Cargo.toml | 2 +- examples/CRISP/apps/wasm-crypto/src/lib.rs | 2 +- packages/ciphernode/Cargo.lock | 25 +- packages/ciphernode/Dockerfile | 1 - packages/ciphernode/fhe/Cargo.toml | 2 +- packages/ciphernode/fhe/src/utils.rs | 2 +- packages/ciphernode/test_helpers/Cargo.toml | 2 +- .../test_helpers/src/bin/fake_encrypt.rs | 2 +- .../test_helpers/src/bin/pack_e3_params.rs | 2 +- packages/ciphernode/tests/Cargo.toml | 2 +- .../tests/test_aggregation_and_decryption.rs | 2 +- packages/enclave-sdk-isomorphic/Cargo.lock | 923 ------------------ packages/enclave-sdk-isomorphic/Cargo.toml | 19 - packages/enclave-sdk-isomorphic/src/lib.rs | 1 - packages/enclave-sdk/Cargo.lock | 463 +-------- packages/enclave-sdk/Cargo.toml | 12 +- .../src/bfv/mod.rs | 0 packages/enclave-sdk/src/lib.rs | 3 + 27 files changed, 67 insertions(+), 1435 deletions(-) delete mode 100644 packages/enclave-sdk-isomorphic/Cargo.lock delete mode 100644 packages/enclave-sdk-isomorphic/Cargo.toml delete mode 100644 packages/enclave-sdk-isomorphic/src/lib.rs rename packages/{enclave-sdk-isomorphic => enclave-sdk}/src/bfv/mod.rs (100%) diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index ee967b8540..7a71bc5949 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -1932,7 +1932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] -name = "enclave-sdk-isomorphic" +name = "enclave-sdk" version = "0.1.0" dependencies = [ "alloy 0.8.3", @@ -5292,7 +5292,7 @@ name = "voting-core" version = "0.1.0" dependencies = [ "compute-provider", - "enclave-sdk-isomorphic", + "enclave-sdk", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index 1b18484c32..89bb54ca97 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -7,4 +7,4 @@ edition = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } compute-provider = { path = "../../../../../packages/compute_provider" } -enclave-sdk-isomorphic = { path = "../../../../../packages/enclave-sdk-isomorphic", default-features = false, features = ["guest"] } +enclave-sdk = { path = "../../../../../packages/enclave-sdk", default-features = false, features = ["risc0"] } diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index 8f96fee1bd..02cffdba76 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,5 +1,5 @@ use compute_provider::FHEInputs; -use enclave_sdk_isomorphic::bfv::deserialize_bfv_params_arc; +use enclave_sdk::bfv::deserialize_bfv_params_arc; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 67c76d5f63..1b64b245be 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -1202,7 +1202,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] -name = "enclave-sdk-isomorphic" +name = "enclave-sdk" version = "0.1.0" dependencies = [ "alloy", @@ -2923,7 +2923,7 @@ name = "voting-core" version = "0.1.0" dependencies = [ "compute-provider", - "enclave-sdk-isomorphic", + "enclave-sdk", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index ac0407663c..e673514f9b 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -2410,7 +2410,6 @@ dependencies = [ "dialoguer", "dotenvy", "enclave-sdk", - "enclave-sdk-isomorphic", "env_logger", "eyre", "fhe", @@ -2852,16 +2851,6 @@ dependencies = [ "fhe-traits", ] -[[package]] -name = "enclave-sdk-isomorphic" -version = "0.1.0" -dependencies = [ - "alloy 0.8.3", - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "encode_unicode" version = "1.0.0" @@ -6774,7 +6763,7 @@ name = "voting-core" version = "0.1.0" dependencies = [ "compute-provider", - "enclave-sdk-isomorphic", + "enclave-sdk", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index 667f6dd8c6..b697750af7 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -38,7 +38,6 @@ sha2 = "0.10.8" # Local dependencies compute-provider = { path = "../../../../packages/compute_provider" } enclave-sdk = { path = "../../../../packages/enclave-sdk" } -enclave-sdk-isomorphic = { path = "../../../../packages/enclave-sdk-isomorphic" } voting-host = { path = "../program/host" } # CLI and user interaction diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index f3a8fea3a8..d3b32025fd 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -7,10 +7,8 @@ use serde::{Deserialize, Serialize}; use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; use crisp::server::config::CONFIG as SERVER_CONFIG; // TODO: unify configuration +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; use enclave_sdk::evm::contracts::EnclaveContract; -use enclave_sdk_isomorphic::bfv::{ - build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1, -}; use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 31341a7f1f..89d9887b28 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -7,7 +7,7 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; use enclave_sdk::evm::contracts::EnclaveContract; use log::{error, info}; diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index fe119eda99..0ac0a539a9 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -1302,7 +1302,7 @@ dependencies = [ "bincode", "console", "console_log", - "enclave-sdk-isomorphic", + "enclave-sdk", "ethers", "fhe", "fhe-math", @@ -1618,11 +1618,12 @@ dependencies = [ ] [[package]] -name = "enclave-sdk-isomorphic" +name = "enclave-sdk" version = "0.1.0" dependencies = [ "alloy", "anyhow", + "eyre", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index 65d392614c..8c548853fe 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -enclave-sdk-isomorphic = { path = "../../../../packages/enclave-sdk-isomorphic" } +enclave-sdk = { path = "../../../../packages/enclave-sdk" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index e5ff8b5f8d..89f9ab0a76 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -2,7 +2,7 @@ mod greco; mod util; use console_log; -use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; use rand::thread_rng; diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 1c7a2391a9..1db431c152 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2420,11 +2420,12 @@ dependencies = [ ] [[package]] -name = "enclave-sdk-isomorphic" +name = "enclave-sdk" version = "0.1.0" dependencies = [ "alloy", "anyhow", + "eyre", "fhe 0.1.0-beta.7", "fhe-traits", ] @@ -2586,6 +2587,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -2658,7 +2669,7 @@ dependencies = [ "config", "data", "e3_request", - "enclave-sdk-isomorphic", + "enclave-sdk", "events", "fhe 0.1.0-beta.7", "fhe-traits", @@ -3611,6 +3622,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -6511,7 +6528,7 @@ dependencies = [ "actix", "bincode", "clap", - "enclave-sdk-isomorphic", + "enclave-sdk", "events", "fhe 0.1.0", "fhe 0.1.0-beta.7", @@ -6537,7 +6554,7 @@ dependencies = [ "crypto", "data", "e3_request", - "enclave-sdk-isomorphic", + "enclave-sdk", "events", "evm", "fhe 0.1.0", diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 01da2180ea..6d1358665f 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -45,7 +45,6 @@ COPY ./packages/ciphernode/rust-toolchain.toml . # Copy enclave-sdk package COPY ./packages/enclave-sdk ../enclave-sdk -COPY ./packages/enclave-sdk-isomorphic ../enclave-sdk-isomorphic RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 242b82db44..84ad02ee5f 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -18,4 +18,4 @@ rand = { workspace = true } rand_chacha = { workspace = true } e3_request = { workspace = true } serde = { workspace = true } -enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/fhe/src/utils.rs b/packages/ciphernode/fhe/src/utils.rs index 7aa259fa84..fcca593899 100644 --- a/packages/ciphernode/fhe/src/utils.rs +++ b/packages/ciphernode/fhe/src/utils.rs @@ -1,5 +1,5 @@ use super::SharedRng; -use enclave_sdk_isomorphic::bfv::build_bfv_params_arc; +use enclave_sdk::bfv::build_bfv_params_arc; use fhe_rs::bfv::BfvParameters; use fhe_rs::mbfv::CommonRandomPoly; use fhe_traits::Serialize; diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index 4584a1ba54..22bdad5ccc 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -14,4 +14,4 @@ fhe-traits = { workspace = true } rand_chacha = { workspace = true } rand = { workspace = true } tracing = { workspace = true } -enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs index af3bc26a49..27c16f5634 100644 --- a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs +++ b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs @@ -1,6 +1,6 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; diff --git a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs index 1326387dae..26d4ba3a45 100644 --- a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs +++ b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs @@ -1,5 +1,5 @@ use clap::{command, Parser}; -use enclave_sdk_isomorphic::bfv::{build_bfv_params_arc, encode_bfv_params}; +use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params}; use std::{error::Error, num::ParseIntError, process}; fn parse_hex(arg: &str) -> Result { diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index 143d380aa8..5de1edba00 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -30,4 +30,4 @@ bincode = { workspace = true } base64 = { workspace = true } actix = { workspace = true } anyhow = { workspace = true } -enclave-sdk-isomorphic = { path = "../../enclave-sdk-isomorphic" } +enclave-sdk = { path = "../../enclave-sdk" } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index ee05bc0efc..1e10a0b359 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -6,7 +6,7 @@ use crypto::Cipher; use data::RepositoriesFactory; use data::{DataStore, InMemStore}; use e3_request::E3Router; -use enclave_sdk_isomorphic::bfv::params::SET_2048_1032193_1; +use enclave_sdk::bfv::params::SET_2048_1032193_1; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, EventBusConfig, diff --git a/packages/enclave-sdk-isomorphic/Cargo.lock b/packages/enclave-sdk-isomorphic/Cargo.lock deleted file mode 100644 index e4cc9a4acc..0000000000 --- a/packages/enclave-sdk-isomorphic/Cargo.lock +++ /dev/null @@ -1,923 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "enclave-sdk-isomorphic" -version = "0.1.0" -dependencies = [ - "anyhow", - "fhe", - "fhe-traits", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "ethnum" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fhe" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "doc-comment", - "fhe-math", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-traits", - "prost", - "prost-build", - "rand", - "rand_chacha", - "serde", - "thiserror", - "zeroize", - "zeroize_derive", -] - -[[package]] -name = "fhe-math" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "ethnum", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-bigint-dig", - "num-traits", - "prost", - "prost-build", - "rand", - "rand_chacha", - "sha2", - "thiserror", - "zeroize", -] - -[[package]] -name = "fhe-traits" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "rand", -] - -[[package]] -name = "fhe-util" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" -dependencies = [ - "itertools 0.12.1", - "num-bigint-dig", - "num-traits", - "prime_factorization", - "rand", - "rayon", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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", - "serde", - "smallvec", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[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.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "prime_factorization" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" -dependencies = [ - "itertools 0.10.5", - "num", - "rand", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rustix" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[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", -] diff --git a/packages/enclave-sdk-isomorphic/Cargo.toml b/packages/enclave-sdk-isomorphic/Cargo.toml deleted file mode 100644 index aee4cd8291..0000000000 --- a/packages/enclave-sdk-isomorphic/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "enclave-sdk-isomorphic" -version = "0.1.0" -edition = "2021" - -[dependencies] -anyhow = "1.0.86" -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } - -[dependencies.alloy] -version = "0.8.3" -default-features = false -optional = true - -[features] -default = ["host"] -host = ["alloy/full"] -guest = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] \ No newline at end of file diff --git a/packages/enclave-sdk-isomorphic/src/lib.rs b/packages/enclave-sdk-isomorphic/src/lib.rs deleted file mode 100644 index 5e4e17e4fd..0000000000 --- a/packages/enclave-sdk-isomorphic/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod bfv; diff --git a/packages/enclave-sdk/Cargo.lock b/packages/enclave-sdk/Cargo.lock index 2a62c54c49..c163a311b9 100644 --- a/packages/enclave-sdk/Cargo.lock +++ b/packages/enclave-sdk/Cargo.lock @@ -55,7 +55,6 @@ dependencies = [ "alloy-contract", "alloy-core", "alloy-eips", - "alloy-genesis", "alloy-network", "alloy-provider", "alloy-pubsub", @@ -206,18 +205,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - [[package]] name = "alloy-json-abi" version = "0.8.25" @@ -326,7 +313,6 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types-eth", "alloy-transport", - "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "async-stream", @@ -338,14 +324,12 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "reqwest", "schnellru", "serde", "serde_json", "thiserror 2.0.12", "tokio", "tracing", - "url", "wasmtimer", ] @@ -405,7 +389,6 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest", "serde", "serde_json", "tokio", @@ -617,12 +600,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ - "alloy-json-rpc", "alloy-transport", - "reqwest", - "serde_json", - "tower", - "tracing", "url", ] @@ -891,7 +869,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1068,22 +1046,6 @@ dependencies = [ "unicode-xid", ] -[[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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - [[package]] name = "cpufeatures" version = "0.2.17" @@ -1495,21 +1457,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[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" @@ -1742,90 +1689,12 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - [[package]] name = "icu_collections" version = "2.0.0" @@ -1985,12 +1854,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - [[package]] name = "itertools" version = "0.10.5" @@ -2151,12 +2014,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "miniz_oxide" version = "0.8.8" @@ -2183,23 +2040,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndarray" version = "0.15.6" @@ -2340,9 +2180,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ - "alloy-rlp", "const-hex", - "proptest", "serde", "smallvec", ] @@ -2362,50 +2200,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" -dependencies = [ - "bitflags", - "cfg-if", - "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.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "parity-scale-codec" version = "3.7.4" @@ -2454,7 +2248,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2542,12 +2336,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "potential_utf" version = "0.1.2" @@ -2877,46 +2665,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -3047,15 +2795,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -3100,15 +2839,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "schnellru" version = "0.2.4" @@ -3140,29 +2870,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.11.0" @@ -3225,18 +2932,6 @@ dependencies = [ "serde", ] -[[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 = "sha1" version = "0.10.6" @@ -3440,9 +3135,6 @@ name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] [[package]] name = "synstructure" @@ -3569,16 +3261,6 @@ dependencies = [ "syn 2.0.101", ] -[[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-rustls" version = "0.26.2" @@ -3657,7 +3339,6 @@ dependencies = [ "futures-util", "pin-project-lite", "sync_wrapper", - "tokio", "tower-layer", "tower-service", ] @@ -3705,12 +3386,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "tungstenite" version = "0.24.0" @@ -3808,12 +3483,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[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.5" @@ -3829,15 +3498,6 @@ dependencies = [ "libc", ] -[[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.11.0+wasi-snapshot-preview1" @@ -3972,48 +3632,13 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[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.6", + "windows-targets", ] [[package]] @@ -4022,7 +3647,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4031,30 +3656,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -4063,96 +3672,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.7.10" diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml index df62c2953c..923156e488 100644 --- a/packages/enclave-sdk/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -8,6 +8,14 @@ edition = "2021" anyhow = "1.0.86" fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } -eyre = { version = "0.6.12" } +eyre = { version = "0.6.12", optional = true } +[dependencies.alloy] +version = "0.8.3" +default-features = false +optional = true + +[features] +default = ["full"] +full = ["alloy/full", "alloy/rpc-types-eth", "eyre"] +risc0 = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] diff --git a/packages/enclave-sdk-isomorphic/src/bfv/mod.rs b/packages/enclave-sdk/src/bfv/mod.rs similarity index 100% rename from packages/enclave-sdk-isomorphic/src/bfv/mod.rs rename to packages/enclave-sdk/src/bfv/mod.rs diff --git a/packages/enclave-sdk/src/lib.rs b/packages/enclave-sdk/src/lib.rs index c469d0c8ed..cc3f753bdb 100644 --- a/packages/enclave-sdk/src/lib.rs +++ b/packages/enclave-sdk/src/lib.rs @@ -1 +1,4 @@ +pub mod bfv; + +#[cfg(feature = "full")] pub mod evm; From 9ede199926a6bfc30ed20fa5f621d7762755a3f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 20 May 2025 01:00:55 +0000 Subject: [PATCH 012/106] Create event listener for shared indexer (#424) * Create event listener based on server listener * Add hook for ci * Add comment * Add toolchain file * Put factory on struct * Test multiple handlers * Linting * Add lint script * Remove println and add comment * Add comments * Fix test script bug * Adjust tokio version --- .github/workflows/rust-ci.yml | 15 +- examples/CRISP/apps/server/Cargo.lock | 36 ++ examples/CRISP/apps/wasm-crypto/Cargo.lock | 216 +++++++++++- examples/CRISP/apps/wasm-crypto/Cargo.toml | 2 +- package.json | 4 +- packages/ciphernode/Cargo.lock | 2 + packages/enclave-sdk/Cargo.lock | 332 +++++++++++++++++- packages/enclave-sdk/Cargo.toml | 11 +- packages/enclave-sdk/rust-toolchain.toml | 3 + .../enclave-sdk/scripts/build_fixtures.sh | 7 + packages/enclave-sdk/scripts/test.sh | 7 + packages/enclave-sdk/src/bfv/mod.rs | 4 +- packages/enclave-sdk/src/evm/events.rs | 20 ++ packages/enclave-sdk/src/evm/listener.rs | 84 +++++ packages/enclave-sdk/src/evm/mod.rs | 2 + packages/enclave-sdk/src/indexer/indexer.rs | 12 + packages/enclave-sdk/src/indexer/mod.rs | 1 + packages/enclave-sdk/src/lib.rs | 3 + .../enclave-sdk/tests/fixtures/.gitignore | 2 + .../enclave-sdk/tests/fixtures/emit_logs.sol | 23 ++ packages/enclave-sdk/tests/listener.rs | 70 ++++ 21 files changed, 821 insertions(+), 35 deletions(-) create mode 100644 packages/enclave-sdk/rust-toolchain.toml create mode 100755 packages/enclave-sdk/scripts/build_fixtures.sh create mode 100755 packages/enclave-sdk/scripts/test.sh create mode 100644 packages/enclave-sdk/src/evm/events.rs create mode 100644 packages/enclave-sdk/src/evm/listener.rs create mode 100644 packages/enclave-sdk/src/indexer/indexer.rs create mode 100644 packages/enclave-sdk/src/indexer/mod.rs create mode 100644 packages/enclave-sdk/tests/fixtures/.gitignore create mode 100644 packages/enclave-sdk/tests/fixtures/emit_logs.sol create mode 100644 packages/enclave-sdk/tests/listener.rs diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 4bb92fcfcc..e01132fef9 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Rust 1.81.0 + - name: Install Rust 1.85.0 uses: actions-rs/toolchain@v1 with: - toolchain: 1.81.0 + toolchain: 1.85.0 override: true # We must install foundry in order to be able to test anvil @@ -49,9 +49,14 @@ jobs: - name: "Compile the contracts and generate the TypeChain bindings" run: "pnpm typechain" - # Now we can check rust formatting and run tests - - name: Checking code format - run: cd ./packages/ciphernode && cargo fmt -- --check + - name: Checking code format sdk + run: pnpm sdk:lint + + - name: Run tests + run: "pnpm sdk:test" + + - name: Checking code format ciphernode + run: pnpm ciphernode:lint - name: Run tests run: "pnpm ciphernode:test" diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index e673514f9b..f21be79d21 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -270,6 +270,7 @@ dependencies = [ "alloy-eips 0.8.3", "alloy-genesis 0.8.3", "alloy-network 0.8.3", + "alloy-node-bindings", "alloy-provider 0.8.3", "alloy-pubsub", "alloy-rpc-client 0.8.3", @@ -687,6 +688,23 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-node-bindings" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +dependencies = [ + "alloy-genesis 0.8.3", + "alloy-primitives", + "k256", + "rand 0.8.5", + "serde_json", + "tempfile", + "thiserror 2.0.12", + "tracing", + "url", +] + [[package]] name = "alloy-primitives" version = "0.8.25" @@ -726,10 +744,14 @@ dependencies = [ "alloy-json-rpc 0.8.3", "alloy-network 0.8.3", "alloy-network-primitives 0.8.3", + "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client 0.8.3", + "alloy-rpc-types-anvil", "alloy-rpc-types-eth 0.8.3", + "alloy-signer 0.8.3", + "alloy-signer-local 0.8.3", "alloy-transport 0.8.3", "alloy-transport-http 0.8.3", "alloy-transport-ipc", @@ -908,6 +930,18 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth 0.8.3", + "alloy-serde 0.8.3", + "serde", +] + [[package]] name = "alloy-rpc-types-any" version = "0.8.3" @@ -2849,6 +2883,8 @@ dependencies = [ "eyre", "fhe", "fhe-traits", + "futures", + "tokio", ] [[package]] diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 0ac0a539a9..559ec1a501 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -77,6 +77,7 @@ dependencies = [ "alloy-core", "alloy-eips", "alloy-network", + "alloy-node-bindings", "alloy-provider", "alloy-pubsub", "alloy-rpc-client", @@ -224,6 +225,18 @@ dependencies = [ "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + [[package]] name = "alloy-json-abi" version = "0.8.25" @@ -288,6 +301,23 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-node-bindings" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +dependencies = [ + "alloy-genesis", + "alloy-primitives", + "k256", + "rand", + "serde_json", + "tempfile", + "thiserror 2.0.12", + "tracing", + "url", +] + [[package]] name = "alloy-primitives" version = "0.8.25" @@ -327,11 +357,16 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", + "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", + "alloy-rpc-types-anvil", "alloy-rpc-types-eth", + "alloy-signer", + "alloy-signer-local", "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "async-stream", @@ -343,12 +378,14 @@ dependencies = [ "lru", "parking_lot", "pin-project", + "reqwest 0.12.5", "schnellru", "serde", "serde_json", "thiserror 2.0.12", "tokio", "tracing", + "url", "wasmtimer", ] @@ -367,7 +404,7 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower", + "tower 0.5.2", "tracing", ] @@ -408,11 +445,12 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", + "reqwest 0.12.5", "serde", "serde_json", "tokio", "tokio-stream", - "tower", + "tower 0.5.2", "tracing", "url", "wasmtimer", @@ -431,6 +469,18 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-rpc-types-any" version = "0.8.3" @@ -607,7 +657,7 @@ dependencies = [ "serde_json", "thiserror 2.0.12", "tokio", - "tower", + "tower 0.5.2", "tracing", "url", "wasmtimer", @@ -619,7 +669,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ + "alloy-json-rpc", "alloy-transport", + "reqwest 0.12.5", + "serde_json", + "tower 0.5.2", + "tracing", "url", ] @@ -1626,6 +1681,8 @@ dependencies = [ "eyre", "fhe", "fhe-traits", + "futures", + "tokio", ] [[package]] @@ -1810,7 +1867,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "syn 2.0.101", @@ -1872,7 +1929,7 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest", + "reqwest 0.11.27", "semver 1.0.22", "serde", "serde_json", @@ -1897,7 +1954,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror 1.0.58", @@ -1929,7 +1986,7 @@ dependencies = [ "jsonwebtoken", "once_cell", "pin-project", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror 1.0.58", @@ -2492,6 +2549,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.8.0" @@ -2516,7 +2596,7 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2528,6 +2608,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2536,12 +2635,32 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", + "hyper 0.14.28", "rustls 0.21.10", "tokio", "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.5.2", + "pin-project-lite", + "socket2", + "tokio", + "tower 0.4.13", + "tower-service", + "tracing", +] + [[package]] name = "idna" version = "0.5.0" @@ -3677,8 +3796,8 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "ipnet", "js-sys", @@ -3702,7 +3821,42 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots 0.25.4", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.2", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.52.0", ] [[package]] @@ -4179,6 +4333,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -4350,7 +4513,7 @@ dependencies = [ "fs2", "hex", "once_cell", - "reqwest", + "reqwest 0.11.27", "semver 1.0.22", "serde", "serde_json", @@ -4571,7 +4734,9 @@ dependencies = [ "libc", "mio", "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", @@ -4732,6 +4897,21 @@ dependencies = [ "winnow 0.6.6", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + [[package]] name = "tower" version = "0.5.2" @@ -5356,6 +5536,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index 8c548853fe..244192c8fe 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -13,7 +13,7 @@ fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/ fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git", branch = "feature/greco-integration" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } rand = "0.8.5" -ethers = "2.0" +ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" enclave-sdk = { path = "../../../../packages/enclave-sdk" } diff --git a/package.json b/package.json index cadc7e2fa1..f7e4983c8a 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "scripts": { "clean": "cd packages/evm && pnpm clean", "compile": "pnpm evm:compile && pnpm ciphernode:build", - "lint": "pnpm evm:lint && pnpm ciphernode:lint", + "lint": "pnpm evm:lint && pnpm ciphernode:lint && pnpm sdk:lint", "typechain": "pnpm evm:typechain", "test": "pnpm evm:test && pnpm ciphernode:test", "test:integration": "cd ./tests/integration && ./test.sh", @@ -23,6 +23,8 @@ "ciphernode:remove": "cd packages/evm && pnpm ciphernode:remove", "ciphernode:test": "cd packages/ciphernode && ./scripts/test.sh", "ciphernode:build": "cd packages/ciphernode && cargo build --release", + "sdk:test": "cd packages/enclave-sdk && ./scripts/test.sh", + "sdk:lint": "cd packages/enclave-sdk && cargo fmt -- --check", "preciphernode:build": "pnpm evm:compile", "committee:new": "cd packages/evm && pnpm committee:new", "committee:publish": "cd packages/evm && pnpm hardhat committee:publish", diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 1db431c152..0d1b4c34b9 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2428,6 +2428,8 @@ dependencies = [ "eyre", "fhe 0.1.0-beta.7", "fhe-traits", + "futures", + "tokio", ] [[package]] diff --git a/packages/enclave-sdk/Cargo.lock b/packages/enclave-sdk/Cargo.lock index c163a311b9..e01cb8ca75 100644 --- a/packages/enclave-sdk/Cargo.lock +++ b/packages/enclave-sdk/Cargo.lock @@ -56,6 +56,7 @@ dependencies = [ "alloy-core", "alloy-eips", "alloy-network", + "alloy-node-bindings", "alloy-provider", "alloy-pubsub", "alloy-rpc-client", @@ -205,6 +206,18 @@ dependencies = [ "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + [[package]] name = "alloy-json-abi" version = "0.8.25" @@ -269,6 +282,23 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-node-bindings" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +dependencies = [ + "alloy-genesis", + "alloy-primitives", + "k256", + "rand 0.8.5", + "serde_json", + "tempfile", + "thiserror 2.0.12", + "tracing", + "url", +] + [[package]] name = "alloy-primitives" version = "0.8.25" @@ -308,11 +338,16 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", + "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", + "alloy-rpc-types-anvil", "alloy-rpc-types-eth", + "alloy-signer", + "alloy-signer-local", "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "async-stream", @@ -324,12 +359,14 @@ dependencies = [ "lru", "parking_lot", "pin-project", + "reqwest", "schnellru", "serde", "serde_json", "thiserror 2.0.12", "tokio", "tracing", + "url", "wasmtimer", ] @@ -389,6 +426,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", + "reqwest", "serde", "serde_json", "tokio", @@ -412,6 +450,18 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-rpc-types-any" version = "0.8.3" @@ -600,7 +650,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ + "alloy-json-rpc", "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", "url", ] @@ -869,7 +924,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1289,6 +1344,8 @@ dependencies = [ "eyre", "fhe", "fhe-traits", + "futures", + "tokio", ] [[package]] @@ -1689,12 +1746,74 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -1854,6 +1973,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + [[package]] name = "itertools" version = "0.10.5" @@ -2014,6 +2139,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -2248,7 +2379,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2665,6 +2796,42 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -2932,6 +3099,18 @@ dependencies = [ "serde", ] +[[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 = "sha1" version = "0.10.6" @@ -2980,6 +3159,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -3135,6 +3323,9 @@ name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -3244,7 +3435,9 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -3339,6 +3532,7 @@ dependencies = [ "futures-util", "pin-project-lite", "sync_wrapper", + "tokio", "tower-layer", "tower-service", ] @@ -3386,6 +3580,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tungstenite" version = "0.24.0" @@ -3498,6 +3698,15 @@ dependencies = [ "libc", ] +[[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.11.0+wasi-snapshot-preview1" @@ -3632,13 +3841,48 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3647,7 +3891,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3656,14 +3900,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -3672,48 +3932,96 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.7.10" diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml index 923156e488..6c982e50ce 100644 --- a/packages/enclave-sdk/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -9,6 +9,8 @@ anyhow = "1.0.86" fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } eyre = { version = "0.6.12", optional = true } +futures = { version = "0.3.30", optional = true } +tokio = { version = "1.37.0", optional = true } [dependencies.alloy] version = "0.8.3" @@ -17,5 +19,12 @@ optional = true [features] default = ["full"] -full = ["alloy/full", "alloy/rpc-types-eth", "eyre"] +full = [ + "alloy/full", + "alloy/rpc-types-eth", + "alloy/node-bindings", + "eyre", + "futures", + "tokio/full", +] risc0 = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] diff --git a/packages/enclave-sdk/rust-toolchain.toml b/packages/enclave-sdk/rust-toolchain.toml new file mode 100644 index 0000000000..c68e3d8ae1 --- /dev/null +++ b/packages/enclave-sdk/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.85" +components = ["rustfmt"] diff --git a/packages/enclave-sdk/scripts/build_fixtures.sh b/packages/enclave-sdk/scripts/build_fixtures.sh new file mode 100755 index 0000000000..2b65360e00 --- /dev/null +++ b/packages/enclave-sdk/scripts/build_fixtures.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +echo "Building fixtures..." + +echo "{\"abi\": $(solc --abi tests/fixtures/emit_logs.sol | tail -n 1), \"bin\": \"$(solc --bin tests/fixtures/emit_logs.sol| tail -n 1)\"}" | jq '.' > tests/fixtures/emit_logs.json diff --git a/packages/enclave-sdk/scripts/test.sh b/packages/enclave-sdk/scripts/test.sh new file mode 100755 index 0000000000..46b830cdd3 --- /dev/null +++ b/packages/enclave-sdk/scripts/test.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +./scripts/build_fixtures.sh + +cargo test -- $@ diff --git a/packages/enclave-sdk/src/bfv/mod.rs b/packages/enclave-sdk/src/bfv/mod.rs index 6bd66ea881..30fe4c8133 100644 --- a/packages/enclave-sdk/src/bfv/mod.rs +++ b/packages/enclave-sdk/src/bfv/mod.rs @@ -14,8 +14,8 @@ pub mod params { /// - Plaintext modulus: 1032193 /// - Moduli: [0x3FFFFFFF000001] (provides good security level) pub const SET_2048_1032193_1: (usize, u64, [u64; 1]) = ( - 2048, // degree - 1032193, // plaintext_modulus + 2048, // degree + 1032193, // plaintext_modulus [0x3FFFFFFF000001], // moduli ); } diff --git a/packages/enclave-sdk/src/evm/events.rs b/packages/enclave-sdk/src/evm/events.rs new file mode 100644 index 0000000000..f758d184b3 --- /dev/null +++ b/packages/enclave-sdk/src/evm/events.rs @@ -0,0 +1,20 @@ +use alloy::sol; + +// TODO: extract these from that actual contract + +sol! { + #[derive(Debug)] + event E3Activated(uint256 e3Id, uint256 expiration, bytes committeePublicKey); + + #[derive(Debug)] + event InputPublished(uint256 indexed e3Id, bytes data, uint256 inputHash, uint256 index); + + #[derive(Debug)] + event CiphertextOutputPublished(uint256 indexed e3Id, bytes ciphertextOutput); + + #[derive(Debug)] + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); + + #[derive(Debug)] + event CommitteePublished(uint256 indexed e3Id, bytes publicKey); +} diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/enclave-sdk/src/evm/listener.rs new file mode 100644 index 0000000000..2e4e1ca521 --- /dev/null +++ b/packages/enclave-sdk/src/evm/listener.rs @@ -0,0 +1,84 @@ +use alloy::{ + primitives::{Address, B256}, + providers::{Provider, ProviderBuilder, RootProvider}, + rpc::types::{BlockNumberOrTag, Filter, Log}, + sol_types::SolEvent, + transports::BoxTransport, +}; +use eyre::Result; +use futures::stream::StreamExt; +use std::{collections::HashMap, sync::Arc}; + +// Define a domain event type that's decoupled from Log +pub trait DomainEvent: Send + Sync { + fn signature(&self) -> B256; +} + +pub struct EventListener { + provider: Arc>, + filter: Filter, + handlers: HashMap Result<()> + Send + Sync>>>, +} + +impl EventListener { + pub fn new(provider: Arc>, filter: Filter) -> Self { + Self { + provider, + filter, + handlers: HashMap::new(), + } + } + + pub fn add_event_handler( + &mut self, + handler: impl Fn(&E) -> Result<()> + Send + Sync + 'static, + ) where + E: SolEvent + 'static, + { + let signature = E::SIGNATURE_HASH; + let wrapped_handler = Box::new(move |log: &Log| -> Result<()> { + let event = log.log_decode::()?.inner.data; + handler(&event) + }); + self.handlers + .entry(signature) + .or_insert_with(Vec::new) + .push(wrapped_handler); + } + + pub async fn listen(&self) -> Result<()> { + let mut stream = self + .provider + .subscribe_logs(&self.filter) + .await? + .into_stream(); + + while let Some(log) = stream.next().await { + if let Some(topic0) = log.topic0() { + if let Some(handlers) = self.handlers.get(topic0) { + for handler in handlers { + if let Err(e) = handler(&log) { + // We don't necessarily want logging here so just printing to stderr + // for now. We can make this fancier later if we need to. + eprintln!("Error processing event 0x{:x}: {:?}", topic0, e); + } + } + } + } + } + + Ok(()) + } + + pub async fn create_contract_listener( + ws_url: &str, + contract_address: &Address, + ) -> Result { + let provider = Arc::new(ProviderBuilder::new().on_builtin(ws_url).await?); + let filter = Filter::new() + .address(contract_address.clone()) + .from_block(BlockNumberOrTag::Latest); + + Ok(EventListener::new(provider, filter)) + } +} diff --git a/packages/enclave-sdk/src/evm/mod.rs b/packages/enclave-sdk/src/evm/mod.rs index 3f152f8b75..c6d9047212 100644 --- a/packages/enclave-sdk/src/evm/mod.rs +++ b/packages/enclave-sdk/src/evm/mod.rs @@ -1 +1,3 @@ pub mod contracts; +pub mod events; +pub mod listener; diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs new file mode 100644 index 0000000000..7e0017a608 --- /dev/null +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -0,0 +1,12 @@ +// Stub indexer +use crate::evm::contracts::EnclaveContract; + +pub struct EnclaveIndexer { + contract: EnclaveContract, +} + +impl EnclaveIndexer { + pub fn start() { + todo!(); + } +} diff --git a/packages/enclave-sdk/src/indexer/mod.rs b/packages/enclave-sdk/src/indexer/mod.rs new file mode 100644 index 0000000000..6e9a8c0544 --- /dev/null +++ b/packages/enclave-sdk/src/indexer/mod.rs @@ -0,0 +1 @@ +mod indexer; diff --git a/packages/enclave-sdk/src/lib.rs b/packages/enclave-sdk/src/lib.rs index cc3f753bdb..57e4a2475a 100644 --- a/packages/enclave-sdk/src/lib.rs +++ b/packages/enclave-sdk/src/lib.rs @@ -2,3 +2,6 @@ pub mod bfv; #[cfg(feature = "full")] pub mod evm; + +#[cfg(feature = "full")] +pub mod indexer; diff --git a/packages/enclave-sdk/tests/fixtures/.gitignore b/packages/enclave-sdk/tests/fixtures/.gitignore new file mode 100644 index 0000000000..8dd919b529 --- /dev/null +++ b/packages/enclave-sdk/tests/fixtures/.gitignore @@ -0,0 +1,2 @@ +# ignore .json +*.json diff --git a/packages/enclave-sdk/tests/fixtures/emit_logs.sol b/packages/enclave-sdk/tests/fixtures/emit_logs.sol new file mode 100644 index 0000000000..b5a1c4e842 --- /dev/null +++ b/packages/enclave-sdk/tests/fixtures/emit_logs.sol @@ -0,0 +1,23 @@ +pragma solidity >=0.4.24; + +contract EmitLogs { + event ValueChanged(address indexed author, uint256 count, string value); + + string _value; + + uint256 count = 0; + + constructor() { + _value = ""; + } + + function getValue() public view returns (string memory) { + return _value; + } + + function setValue(string memory value) public { + count++; + emit ValueChanged(msg.sender, count, value); + _value = value; + } +} diff --git a/packages/enclave-sdk/tests/listener.rs b/packages/enclave-sdk/tests/listener.rs new file mode 100644 index 0000000000..2cc5edc97a --- /dev/null +++ b/packages/enclave-sdk/tests/listener.rs @@ -0,0 +1,70 @@ +use alloy::{ + node_bindings::Anvil, + providers::{ProviderBuilder, WsConnect}, + sol, +}; +use enclave_sdk::evm::listener::EventListener; +use eyre::Result; + +sol!( + #[sol(rpc)] + EmitLogs, + "tests/fixtures/emit_logs.json" +); + +#[tokio::test] +async fn event_listener() -> Result<()> { + let anvil = Anvil::new().block_time(1).try_spawn()?; + let (tx, mut rx) = tokio::sync::mpsc::channel::(10); + let (tx_addr, mut rx_addr) = tokio::sync::mpsc::channel::(10); + + let provider = ProviderBuilder::new() + .on_ws(WsConnect::new(anvil.ws_endpoint())) + .await?; + + let contract = EmitLogs::deploy(provider).await?; + + let mut event_listener = + EventListener::create_contract_listener(&anvil.ws_endpoint(), contract.address()).await?; + + event_listener.add_event_handler::( + move |event: &EmitLogs::ValueChanged| { + let _ = tx.clone().try_send(event.value.clone()); + Ok(()) + }, + ); + + event_listener.add_event_handler::( + move |event: &EmitLogs::ValueChanged| { + let _ = tx_addr.clone().try_send(event.author.to_string()); + Ok(()) + }, + ); + tokio::spawn(async move { event_listener.listen().await.unwrap() }); + + contract + .setValue("hello".to_string()) + .send() + .await? + .watch() + .await?; + contract + .setValue("world!".to_string()) + .send() + .await? + .watch() + .await?; + + assert_eq!(rx.recv().await.unwrap(), "hello"); + assert_eq!(rx.recv().await.unwrap(), "world!"); + + assert_eq!( + rx_addr.recv().await.unwrap(), + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + assert_eq!( + rx_addr.recv().await.unwrap(), + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + Ok(()) +} From 87ea59c5a151d9e8ebfca33c063610d660225561 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Tue, 20 May 2025 12:19:47 +0200 Subject: [PATCH 013/106] Apply `Enforce Valid Params` AGAIN (#423) * reapply valid params * use decode instead of deserialize * naming nits * lint bfv --- examples/CRISP/apps/program/core/src/lib.rs | 4 +- .../server/src/server/blockchain/handlers.rs | 2 +- .../CRISP/apps/server/src/server/models.rs | 2 +- .../apps/server/src/server/routes/state.rs | 4 +- packages/ciphernode/fhe/src/fhe.rs | 13 +- .../tests/test_aggregation_and_decryption.rs | 10 +- packages/enclave-sdk/src/bfv/mod.rs | 171 ++++++++++-------- packages/evm/contracts/Enclave.sol | 34 +++- packages/evm/contracts/interfaces/IE3.sol | 1 + .../evm/contracts/interfaces/IEnclave.sol | 4 + packages/evm/deploy/enclave.ts | 12 +- packages/evm/test/Enclave.spec.ts | 83 ++++++++- packages/evm/test/fixtures/Enclave.fixture.ts | 12 +- 13 files changed, 250 insertions(+), 102 deletions(-) diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index 02cffdba76..0f91950e45 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,11 +1,11 @@ use compute_provider::FHEInputs; -use enclave_sdk::bfv::deserialize_bfv_params_arc; +use enclave_sdk::bfv::decode_bfv_params_arc; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; /// CRISP Implementation of the CiphertextProcessor function pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { - let params = deserialize_bfv_params_arc(&fhe_inputs.params); + let params = decode_bfv_params_arc(&fhe_inputs.params); let mut sum = Ciphertext::zero(¶ms); for ciphertext_bytes in &fhe_inputs.ciphertexts { diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index 7f098db4ba..ba1b4beb79 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -35,7 +35,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { info!("E3: {:?}", e3); let start_time = Utc::now().timestamp() as u64; - let expiration = e3_activated.expiration.to::(); + let expiration = e3_activated.expiration.to::(); let e3_obj = E3 { // Identifiers diff --git a/examples/CRISP/apps/server/src/server/models.rs b/examples/CRISP/apps/server/src/server/models.rs index b9decaec9d..472dc3c768 100644 --- a/examples/CRISP/apps/server/src/server/models.rs +++ b/examples/CRISP/apps/server/src/server/models.rs @@ -95,7 +95,7 @@ pub struct E3StateLite { pub duration: u64, pub expiration: u64, pub start_block: u64, - + pub committee_public_key: Vec, pub emojis: [String; 2], } diff --git a/examples/CRISP/apps/server/src/server/routes/state.rs b/examples/CRISP/apps/server/src/server/routes/state.rs index b25e65aa11..2595cacb19 100644 --- a/examples/CRISP/apps/server/src/server/routes/state.rs +++ b/examples/CRISP/apps/server/src/server/routes/state.rs @@ -83,8 +83,6 @@ async fn get_round_state_lite(data: web::Json) -> impl Responde let state_lite: E3StateLite = state.into(); HttpResponse::Ok().json(state_lite) } - Err(_e) => { - HttpResponse::InternalServerError().body("Failed to get E3 state") - } + Err(_e) => HttpResponse::InternalServerError().body("Failed to get E3 state"), } } diff --git a/packages/ciphernode/fhe/src/fhe.rs b/packages/ciphernode/fhe/src/fhe.rs index 8d72575b1e..e981d3f265 100644 --- a/packages/ciphernode/fhe/src/fhe.rs +++ b/packages/ciphernode/fhe/src/fhe.rs @@ -2,11 +2,10 @@ use super::set_up_crp; use anyhow::*; use async_trait::async_trait; use data::{FromSnapshotWithParams, Snapshot}; +use enclave_sdk::bfv::{build_bfv_params_arc, decode_bfv_params_arc}; use events::{OrderedSet, Seed}; use fhe_rs::{ - bfv::{ - BfvParameters, BfvParametersBuilder, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey, - }, + bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}, mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, }; use fhe_traits::{Deserialize, DeserializeParametrized, FheDecoder, Serialize}; @@ -44,7 +43,7 @@ impl Fhe { } pub fn from_encoded(bytes: &[u8], seed: Seed, rng: SharedRng) -> Result { - let params = Arc::new(BfvParameters::try_deserialize(bytes)?); + let params = decode_bfv_params_arc(bytes); let crp = set_up_crp( params.clone(), Arc::new(Mutex::new(ChaCha20Rng::from_seed(seed.into()))), @@ -59,11 +58,7 @@ impl Fhe { crp: &[u8], rng: Arc>, ) -> Result { - let params = BfvParametersBuilder::new() - .set_degree(degree) - .set_plaintext_modulus(plaintext_modulus) - .set_moduli(moduli) - .build_arc()?; + let params = build_bfv_params_arc(degree, plaintext_modulus, moduli); Ok(Fhe::new( params.clone(), diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index 1e10a0b359..4a0a260213 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -6,7 +6,7 @@ use crypto::Cipher; use data::RepositoriesFactory; use data::{DataStore, InMemStore}; use e3_request::E3Router; -use enclave_sdk::bfv::params::SET_2048_1032193_1; +use enclave_sdk::bfv::{encode_bfv_params, params::SET_2048_1032193_1}; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, EventBusConfig, @@ -304,7 +304,7 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { e3_id: e3_id.clone(), threshold_m: 3, seed: seed.clone(), - params: params.to_bytes(), + params: encode_bfv_params(¶ms), }); // Send the computation requested event @@ -414,7 +414,7 @@ async fn test_stopped_keyshares_retain_state() -> Result<()> { e3_id: e3_id.clone(), threshold_m: 2, seed: seed.clone(), - params: params.to_bytes(), + params: encode_bfv_params(¶ms), }) .clone(), ) @@ -583,7 +583,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { e3_id: E3id::new("1234", 1), threshold_m: 3, seed: seed.clone(), - params: params.to_bytes(), + params: encode_bfv_params(¶ms), })) .await?; @@ -616,7 +616,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { e3_id: E3id::new("1234", 2), threshold_m: 3, seed: seed.clone(), - params: params.to_bytes(), + params: encode_bfv_params(¶ms), })) .await?; diff --git a/packages/enclave-sdk/src/bfv/mod.rs b/packages/enclave-sdk/src/bfv/mod.rs index 30fe4c8133..9372a948a2 100644 --- a/packages/enclave-sdk/src/bfv/mod.rs +++ b/packages/enclave-sdk/src/bfv/mod.rs @@ -1,5 +1,4 @@ -use anyhow::Context; -use anyhow::Result; +use alloy::dyn_abi::{DynSolType, DynSolValue}; use fhe_rs::bfv::{BfvParameters, BfvParametersBuilder}; use fhe_traits::{Deserialize, Serialize}; use std::sync::Arc; @@ -81,11 +80,30 @@ pub fn build_bfv_params_arc( } } -/// Deserializes BFV parameters from a byte slice. +/// Serializes BFV parameters into raw bytes. +/// +/// This function converts BFV parameters into a raw byte representation +/// without any specific encoding format. +/// +/// # Arguments +/// +/// * `params` - The BFV parameters to serialize +/// +/// # Returns +/// +/// Returns a `Vec` containing the raw serialized parameters. +pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { + params.to_bytes() +} + +/// Deserializes BFV parameters from raw bytes. +/// +/// This function converts raw bytes back into BFV parameters. +/// The bytes should be in the raw format produced by `serialize_bfv_params`. /// /// # Arguments /// -/// * `bytes` - The byte slice containing the serialized parameters +/// * `bytes` - The raw bytes containing the serialized parameters /// /// # Returns /// @@ -101,14 +119,14 @@ pub fn deserialize_bfv_params(bytes: &[u8]) -> BfvParameters { } } -/// Deserializes BFV parameters from a byte slice and wraps them in an `Arc`. +/// Deserializes BFV parameters from raw bytes and wraps them in an `Arc`. /// /// This is a convenience function that combines `deserialize_bfv_params` with `Arc::new` /// to provide thread-safe shared ownership of the deserialized parameters. /// /// # Arguments /// -/// * `bytes` - The byte slice containing the serialized parameters +/// * `bytes` - The raw bytes containing the serialized parameters /// /// # Returns /// @@ -121,55 +139,70 @@ pub fn deserialize_bfv_params_arc(bytes: &[u8]) -> Arc { Arc::new(deserialize_bfv_params(bytes)) } -/// Serializes BFV parameters into a byte vector. +/// ABI-encodes BFV parameters using the Solidity ABI format. +/// +/// This function takes BFV parameters, serializes them to raw bytes, +/// and then ABI-encodes those bytes using the Solidity ABI format. /// /// # Arguments /// -/// * `params` - The BFV parameters to serialize +/// * `params` - The BFV parameters to encode /// /// # Returns /// -/// Returns a `Vec` containing the serialized parameters. -/// -/// # Panics -/// -/// Panics if the serialization fails. -pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { - params.to_bytes() +/// Returns a `Vec` containing the ABI-encoded parameters. +pub fn encode_bfv_params(params: &BfvParameters) -> Vec { + DynSolValue::Bytes(serialize_bfv_params(params)).abi_encode_params() } -/// Encodes BFV parameters into a byte vector. +/// ABI-decodes BFV parameters from Solidity ABI format. /// -/// This function takes a `BfvParameters` instance and returns it serialized as a byte vector. +/// This function takes ABI-encoded bytes, decodes them using the Solidity ABI format, +/// and then deserializes the resulting bytes into BFV parameters. /// /// # Arguments /// -/// * `params` - The BFV parameters to encode +/// * `bytes` - The ABI-encoded bytes containing the parameters /// /// # Returns /// -/// Returns a `Vec` containing the serialized parameters. -pub fn encode_bfv_params(params: &BfvParameters) -> Vec { - params.to_bytes() +/// Returns a `BfvParameters` instance deserialized from the bytes. +/// +/// # Panics +/// +/// Panics if the decoding/deserialization fails. +pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { + let bytes_type = DynSolType::Bytes; + let decoded = bytes_type + .abi_decode(bytes) + .expect("Failed to ABI decode bytes"); + + match decoded { + DynSolValue::Bytes(inner_bytes) => { + BfvParameters::try_deserialize(&inner_bytes).expect("Could not decode Bfv Params") + } + _ => panic!("Expected bytes value in ABI encoding"), + } } -/// Decodes BFV parameters from a byte slice. +/// ABI-decodes BFV parameters from Solidity ABI format and wraps them in an `Arc`. /// -/// This function attempts to deserialize BFV parameters from a byte slice -/// and wraps them in an `Arc` for thread-safe shared ownership. +/// This function is similar to `decode_bfv_params` but returns the parameters +/// wrapped in an `Arc` for thread-safe shared ownership. /// /// # Arguments /// -/// * `bytes` - The byte slice containing the serialized parameters +/// * `bytes` - The ABI-encoded bytes containing the parameters /// /// # Returns /// -/// Returns a `Result>` containing the deserialized parameters -/// or an error if deserialization fails. -pub fn decode_bfv_params(bytes: &[u8]) -> Result> { - Ok(Arc::new( - BfvParameters::try_deserialize(bytes).context("Could not decode Bfv Params")?, - )) +/// Returns an `Arc` containing the deserialized parameters. +/// +/// # Panics +/// +/// Panics if the decoding/deserialization fails. +pub fn decode_bfv_params_arc(bytes: &[u8]) -> Arc { + Arc::new(decode_bfv_params(bytes)) } #[cfg(test)] @@ -201,85 +234,75 @@ mod tests { } #[test] - fn test_deserialize_bfv_params() { + fn test_raw_serialization_roundtrip() { let degree = 2048; let plaintext_modulus = 1032193; - let moduli = [0x3FFFFFFF000001]; + let moduli = vec![0x3FFFFFFF000001]; let params = build_bfv_params(degree, plaintext_modulus, &moduli); - let serialized = params.to_bytes(); + let serialized = serialize_bfv_params(¶ms); let deserialized = deserialize_bfv_params(&serialized); assert_eq!(deserialized.degree(), degree); assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); + assert_eq!(deserialized.moduli(), moduli.as_slice()); } #[test] - fn test_deserialize_bfv_params_arc() { + fn test_abi_encoding_roundtrip() { let degree = 2048; let plaintext_modulus = 1032193; - let moduli = [0x3FFFFFFF000001]; + let moduli = vec![0x3FFFFFFF000001]; let params = build_bfv_params(degree, plaintext_modulus, &moduli); - let serialized = params.to_bytes(); - let deserialized = deserialize_bfv_params_arc(&serialized); - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); - } - - #[test] - fn test_serialize_deserialize_roundtrip() { - let degree = 2048; - let plaintext_modulus = 1032193; - let moduli = [0x3FFFFFFF000001]; - - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + // First serialize to raw bytes let serialized = serialize_bfv_params(¶ms); - let deserialized = deserialize_bfv_params(&serialized); - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); - } - - #[test] - fn test_serialize_deserialize_arc_roundtrip() { - let degree = 2048; - let plaintext_modulus = 1032193; - let moduli = [0x3FFFFFFF000001]; - - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); - let serialized = serialize_bfv_params(¶ms); - let deserialized = deserialize_bfv_params_arc(&serialized); + // Then ABI encode the raw bytes + let encoded = encode_bfv_params(¶ms); - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); + // Verify the encoded result is deterministic + let encoded_again = encode_bfv_params(¶ms); + assert_eq!( + encoded, encoded_again, + "ABI encoding should be deterministic" + ); + + // Verify the ABI-encoded result is different from the raw serialized bytes + assert_ne!( + encoded, serialized, + "ABI-encoded result should be different from raw serialized bytes" + ); + + // Verify we can ABI-decode and deserialize back to the original parameters + let decoded = decode_bfv_params(&encoded); + assert_eq!(decoded.degree(), degree); + assert_eq!(decoded.plaintext(), plaintext_modulus); + assert_eq!(decoded.moduli(), moduli.as_slice()); } #[test] - fn test_encode_bfv_params() { + fn test_abi_encoding_roundtrip_arc() { let degree = 2048; let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; let params = build_bfv_params(degree, plaintext_modulus, &moduli); let encoded = encode_bfv_params(¶ms); - let decoded = decode_bfv_params(&encoded).unwrap(); + // Verify we can ABI-decode and deserialize back to the original parameters with Arc + let decoded = decode_bfv_params_arc(&encoded); assert_eq!(decoded.degree(), degree); assert_eq!(decoded.plaintext(), plaintext_modulus); assert_eq!(decoded.moduli(), moduli.as_slice()); } #[test] - fn test_decode_params_error() { + #[should_panic(expected = "Failed to ABI decode bytes")] + fn test_decode_bfv_params_error() { let invalid_bytes = vec![0u8; 10]; - let result = decode_bfv_params(&invalid_bytes); - assert!(result.is_err()); + let _ = decode_bfv_params(&invalid_bytes); } mod params_tests { diff --git a/packages/evm/contracts/Enclave.sol b/packages/evm/contracts/Enclave.sol index 5cdca8b419..640d8c50a5 100644 --- a/packages/evm/contracts/Enclave.sol +++ b/packages/evm/contracts/Enclave.sol @@ -44,6 +44,9 @@ contract Enclave is IEnclave, OwnableUpgradeable { mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier) public decryptionVerifiers; + /// Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV). + mapping(bytes e3ProgramParams => bool allowed) public e3ProgramsParams; + //////////////////////////////////////////////////////////// // // // Errors // @@ -82,24 +85,35 @@ contract Enclave is IEnclave, OwnableUpgradeable { /// @param _owner The owner of this contract /// @param _maxDuration The maximum duration of a computation in seconds + /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV) constructor( address _owner, ICiphernodeRegistry _ciphernodeRegistry, - uint256 _maxDuration + uint256 _maxDuration, + bytes[] memory _e3ProgramsParams ) { - initialize(_owner, _ciphernodeRegistry, _maxDuration); + initialize( + _owner, + _ciphernodeRegistry, + _maxDuration, + _e3ProgramsParams + ); } /// @param _owner The owner of this contract + /// @param _ciphernodeRegistry The address of the ciphernode registry /// @param _maxDuration The maximum duration of a computation in seconds + /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV) function initialize( address _owner, ICiphernodeRegistry _ciphernodeRegistry, - uint256 _maxDuration + uint256 _maxDuration, + bytes[] memory _e3ProgramsParams ) public initializer { __Ownable_init(msg.sender); setMaxDuration(_maxDuration); setCiphernodeRegistry(_ciphernodeRegistry); + setE3ProgramsParams(_e3ProgramsParams); if (_owner != owner()) transferOwnership(_owner); } @@ -364,6 +378,20 @@ contract Enclave is IEnclave, OwnableUpgradeable { emit EncryptionSchemeDisabled(encryptionSchemeId); } + function setE3ProgramsParams( + bytes[] memory _e3ProgramsParams + ) public onlyOwner returns (bool success) { + uint256 length = _e3ProgramsParams.length; + for (uint256 i; i < length; ) { + e3ProgramsParams[_e3ProgramsParams[i]] = true; + unchecked { + ++i; + } + } + success = true; + emit AllowedE3ProgramsParamsSet(_e3ProgramsParams); + } + //////////////////////////////////////////////////////////// // // // Get Functions // diff --git a/packages/evm/contracts/interfaces/IE3.sol b/packages/evm/contracts/interfaces/IE3.sol index 609715049f..67e43095e9 100644 --- a/packages/evm/contracts/interfaces/IE3.sol +++ b/packages/evm/contracts/interfaces/IE3.sol @@ -13,6 +13,7 @@ import { IDecryptionVerifier } from "./IDecryptionVerifier.sol"; /// @param duration Duration of the E3. /// @param expiration Timestamp when committee duties expire. /// @param e3Program Address of the E3 Program contract. +/// @param e3ProgramParams ABI encoded computation parameters. /// @param computeProvider Address of the compute provider contract. /// @param inputValidator Address of the input validator contract. /// @param decryptionVerifier Address of the output verifier contract. diff --git a/packages/evm/contracts/interfaces/IEnclave.sol b/packages/evm/contracts/interfaces/IEnclave.sol index 56f81c6e03..35f1a84392 100644 --- a/packages/evm/contracts/interfaces/IEnclave.sol +++ b/packages/evm/contracts/interfaces/IEnclave.sol @@ -82,6 +82,10 @@ interface IEnclave { /// @param e3Program The address of the E3 Program. event E3ProgramDisabled(IE3Program e3Program); + /// @notice Emitted when the allowed E3 encryption scheme parameters are configured. + /// @param e3ProgramParams Array of encoded encryption scheme parameters (e.g, for BFV) + event AllowedE3ProgramsParamsSet(bytes[] e3ProgramParams); + //////////////////////////////////////////////////////////// // // // Core Entrypoints // diff --git a/packages/evm/deploy/enclave.ts b/packages/evm/deploy/enclave.ts index 207be341c3..bcbdcc12a0 100644 --- a/packages/evm/deploy/enclave.ts +++ b/packages/evm/deploy/enclave.ts @@ -1,3 +1,4 @@ +import { ethers } from "ethers"; import { DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { PoseidonT3, proxy } from "poseidon-solidity"; @@ -36,10 +37,19 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { } // Deploy Enclave contract + const polynomial_degree = ethers.toBigInt(2048); + const plaintext_modulus = ethers.toBigInt(1032193); + const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + + // Encode just the struct (NOT the function selector) + const encoded = ethers.AbiCoder.defaultAbiCoder().encode( + ["uint256", "uint256", "uint256[]"], + [polynomial_degree, plaintext_modulus, moduli], + ); const enclave = await deploy("Enclave", { from: deployer, - args: [deployer, addressOne, THIRTY_DAYS_IN_SECONDS], + args: [deployer, addressOne, THIRTY_DAYS_IN_SECONDS, [encoded]], log: true, libraries: { PoseidonT3: PoseidonT3.address, diff --git a/packages/evm/test/Enclave.spec.ts b/packages/evm/test/Enclave.spec.ts index 000f91812f..a7e2956827 100644 --- a/packages/evm/test/Enclave.spec.ts +++ b/packages/evm/test/Enclave.spec.ts @@ -33,6 +33,14 @@ const data = "0xda7a"; const dataHash = ethers.keccak256(data); const _publicKeyHash = ethers.keccak256(abiCoder.encode(["uint256"], [0])); const proof = "0x1337"; +const polynomial_degree = ethers.toBigInt(2048); +const plaintext_modulus = ethers.toBigInt(1032193); +const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + +const encodedE3ProgramParams = ethers.AbiCoder.defaultAbiCoder().encode( + ["uint256", "uint256", "uint256[]"], + [polynomial_degree, plaintext_modulus, moduli], +); // Hash function used to compute the tree nodes. const hash = (a: bigint, b: bigint) => poseidon2([a, b]); @@ -65,6 +73,8 @@ describe("Enclave", function () { await enclave.enableE3Program(await e3Program.getAddress()); + await enclave.setE3ProgramsParams([encodedE3ProgramParams]); + return { owner, notTheOwner, @@ -86,7 +96,7 @@ describe("Enclave", function () { ], duration: time.duration.days(30), e3Program: await e3Program.getAddress(), - e3ProgramParams: "0x12345678", + e3ProgramParams: encodedE3ProgramParams, computeProviderParams: abiCoder.encode( ["address"], [await decryptionVerifier.getAddress()], @@ -186,6 +196,70 @@ describe("Enclave", function () { }); }); + describe("setE3ProgramsParams()", function () { + const polynomial_degree = ethers.toBigInt(2048); + const plaintext_modulus = ethers.toBigInt(1032193); + const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + + const encodedE3ProgramParams = ethers.AbiCoder.defaultAbiCoder().encode( + ["uint256", "uint256", "uint256[]"], + [polynomial_degree, plaintext_modulus, moduli], + ); + + const encodedE3ProgramsParams = [encodedE3ProgramParams]; + + it("reverts if not called by owner", async function () { + const { enclave, notTheOwner } = await loadFixture(setup); + + await expect( + enclave + .connect(notTheOwner) + .setE3ProgramsParams(encodedE3ProgramsParams), + ) + .to.be.revertedWithCustomError(enclave, "OwnableUnauthorizedAccount") + .withArgs(notTheOwner); + }); + + it("sets E3 program parameters correctly", async function () { + const { enclave } = await loadFixture(setup); + + await enclave.setE3ProgramsParams(encodedE3ProgramsParams); + + expect(await enclave.e3ProgramsParams(encodedE3ProgramsParams[0])).to.be + .true; + }); + + it("returns true if parameters are set successfully", async function () { + const { enclave } = await loadFixture(setup); + + const result = await enclave.setE3ProgramsParams.staticCall( + encodedE3ProgramsParams, + ); + expect(result).to.be.true; + }); + + it("emits AllowedE3ProgramsParamsSet event", async function () { + const { enclave } = await loadFixture(setup); + + await expect(enclave.setE3ProgramsParams(encodedE3ProgramsParams)) + .to.emit(enclave, "AllowedE3ProgramsParamsSet") + .withArgs(encodedE3ProgramsParams); + }); + + it("handles multiple parameters", async function () { + const { enclave } = await loadFixture(setup); + encodedE3ProgramsParams.push( + "0x0000000000000000000000000000000000000000000000000000000000000001", + ); + + await enclave.setE3ProgramsParams(encodedE3ProgramsParams); + + for (const param of encodedE3ProgramsParams) { + expect(await enclave.e3ProgramsParams(param)).to.be.true; + } + }); + }); + describe("getE3()", function () { it("reverts if E3 does not exist", async function () { const { enclave } = await loadFixture(setup); @@ -538,7 +612,12 @@ describe("Enclave", function () { request.startTime, request.duration, request.e3Program, - abiCoder.encode(["bytes", "address"], [ZeroHash, ethers.ZeroAddress]), + ethers.keccak256( + abiCoder.encode( + ["bytes", "address"], + [ZeroHash, ethers.ZeroAddress], + ), + ), request.computeProviderParams, { value: 10 }, ), diff --git a/packages/evm/test/fixtures/Enclave.fixture.ts b/packages/evm/test/fixtures/Enclave.fixture.ts index b5d9087c09..b9f1dce1d9 100644 --- a/packages/evm/test/fixtures/Enclave.fixture.ts +++ b/packages/evm/test/fixtures/Enclave.fixture.ts @@ -9,13 +9,23 @@ export async function deployEnclaveFixture( maxDuration?: number, ) { const [signer] = await ethers.getSigners(); + const polynomial_degree = ethers.toBigInt(2048); + const plaintext_modulus = ethers.toBigInt(1032193); + const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + + // Encode just the struct (NOT the function selector) + const encoded = ethers.AbiCoder.defaultAbiCoder().encode( + ["uint256", "uint256", "uint256[]"], + [polynomial_degree, plaintext_modulus, moduli], + ); + const deployment = await ( await ethers.getContractFactory("Enclave", { libraries: { PoseidonT3: poseidonT3, }, }) - ).deploy(owner, registry, maxDuration || 60 * 60 * 24 * 30); + ).deploy(owner, registry, maxDuration || 60 * 60 * 24 * 30, [encoded]); return Enclave__factory.connect(await deployment.getAddress(), signer); } From 6c2884599b55322177d0862c98a59e318fb98974 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Tue, 20 May 2025 16:20:04 +0200 Subject: [PATCH 014/106] make fhe.rs ref to main (#430) --- examples/CRISP/apps/program/Cargo.lock | 8 ++-- examples/CRISP/apps/program/Cargo.toml | 6 +-- .../apps/program/methods/guest/Cargo.lock | 8 ++-- examples/CRISP/apps/server/Cargo.lock | 8 ++-- examples/CRISP/apps/server/Cargo.toml | 4 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 46 +++++++++++++++++-- examples/CRISP/apps/wasm-crypto/Cargo.toml | 8 ++-- packages/ciphernode/Cargo.lock | 8 ++-- packages/ciphernode/Cargo.toml | 8 ++-- packages/enclave-sdk/Cargo.toml | 4 +- 10 files changed, 73 insertions(+), 35 deletions(-) diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 7a71bc5949..ffdc743e85 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -2033,7 +2033,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -2056,7 +2056,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -2078,7 +2078,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand 0.8.5", ] @@ -2086,7 +2086,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index 33d712cfa1..f7c56e1c3b 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -29,9 +29,9 @@ risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", ta risc0-zkvm = { version = "2.0.0" } risc0-zkp = { version = "2.0.0", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } compute-provider = { path = "../../../../packages/compute_provider" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 1b64b245be..5282d7bd94 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -1294,7 +1294,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -1317,7 +1317,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand", ] @@ -1347,7 +1347,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index f21be79d21..9a0c6093b2 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -3007,7 +3007,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -3030,7 +3030,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -3052,7 +3052,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand 0.8.5", ] @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index b697750af7..fa931d4406 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -29,8 +29,8 @@ futures = "0.3.30" alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } hmac = "0.12.1" jwt = "0.16.0" sha2 = "0.10.8" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 559ec1a501..02b43aba8f 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -2098,7 +2098,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git?branch=feature%2Fgreco-integration#26e5f2ff6c860d47a1c88a777936bc68eaedb129" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -2121,7 +2121,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git?branch=feature%2Fgreco-integration#26e5f2ff6c860d47a1c88a777936bc68eaedb129" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -2143,7 +2143,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git?branch=feature%2Fgreco-integration#26e5f2ff6c860d47a1c88a777936bc68eaedb129" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand", ] @@ -2151,12 +2151,14 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git?branch=feature%2Fgreco-integration#26e5f2ff6c860d47a1c88a777936bc68eaedb129" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", "num-traits", + "prime_factorization", "rand", + "rayon", ] [[package]] @@ -3062,6 +3064,20 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "num" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -3124,6 +3140,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -3489,6 +3516,17 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand", +] + [[package]] name = "primitive-types" version = "0.12.2" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index 244192c8fe..a6252c5a79 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -8,10 +8,10 @@ repository = "https://github.com/gnosisguild/enclave" [dependencies] web-sys = { version = "0.3", features = ["console"] } console = "0.15.7" -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git", branch = "feature/greco-integration" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } rand = "0.8.5" ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 0d1b4c34b9..ba78cc9944 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -2640,7 +2640,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -2684,7 +2684,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -2706,7 +2706,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand 0.8.5", ] @@ -2714,7 +2714,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index ac5468b8e4..33209b252c 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -64,10 +64,10 @@ clap = { version = "4.5.17", features = ["derive"] } compile-time = "0.2.0" dirs = "5.0.1" dialoguer = "0.11.0" -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git", branch = "feature/greco-integration" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } figment = { version = "0.10.19", features = ["yaml", "test"] } futures = "0.3.30" futures-util = "0.3" diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml index 6c982e50ce..7c9e9723e8 100644 --- a/packages/enclave-sdk/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" # Core dependencies compatible with everything [dependencies] anyhow = "1.0.86" -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "feature/greco-integration" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } eyre = { version = "0.6.12", optional = true } futures = { version = "0.3.30", optional = true } tokio = { version = "1.37.0", optional = true } From 45fd4d6109e27755a89fccd5a11e51e6598a42c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 21 May 2025 17:56:34 +0000 Subject: [PATCH 015/106] Draft indexer component (#434) * Draft indexer * Update Cargo.toml * Update lock move indexer to own file and update test * Add handlers * Update test * Update mutability * Fix bugs * Fix compilation bugs * tidy up package versions and add traits * Wrong arg order * Handle errors more gracefully * Return JoinHandle so consumers can await handle * Better conversions --- examples/CRISP/apps/server/Cargo.lock | 7 + examples/CRISP/apps/server/Cargo.toml | 1 + .../CRISP/apps/server/src/cli/commands.rs | 2 +- .../server/src/server/blockchain/handlers.rs | 3 +- .../apps/server/src/server/blockchain/sync.rs | 12 +- .../CRISP/apps/server/src/server/database.rs | 17 +- .../apps/server/src/server/routes/rounds.rs | 3 +- .../apps/server/src/server/routes/state.rs | 7 +- .../apps/server/src/server/routes/voting.rs | 3 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 109 +++++++ packages/ciphernode/Cargo.lock | 98 +++++- packages/enclave-sdk/Cargo.lock | 129 +++++++- packages/enclave-sdk/Cargo.toml | 13 + .../enclave-sdk/scripts/build_fixtures.sh | 21 +- packages/enclave-sdk/scripts/test.sh | 2 +- packages/enclave-sdk/src/evm/contracts.rs | 274 +++++++++++++---- packages/enclave-sdk/src/evm/listener.rs | 59 ++-- packages/enclave-sdk/src/indexer/indexer.rs | 287 +++++++++++++++++- packages/enclave-sdk/src/indexer/mod.rs | 2 + packages/enclave-sdk/src/indexer/models.rs | 20 ++ .../tests/fixtures/fake_enclave.sol | 100 ++++++ packages/enclave-sdk/tests/indexer.rs | 114 +++++++ packages/enclave-sdk/tests/listener.rs | 40 ++- 23 files changed, 1188 insertions(+), 135 deletions(-) create mode 100644 packages/enclave-sdk/src/indexer/models.rs create mode 100644 packages/enclave-sdk/tests/fixtures/fake_enclave.sol create mode 100644 packages/enclave-sdk/tests/indexer.rs diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 9a0c6093b2..e9207532cf 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -2436,6 +2436,7 @@ dependencies = [ "alloy 0.8.3", "alloy-primitives", "alloy-sol-types", + "async-trait", "bincode", "chrono", "clap", @@ -2880,10 +2881,16 @@ version = "0.1.0" dependencies = [ "alloy 0.8.3", "anyhow", + "async-trait", + "bincode", + "chrono", "eyre", "fhe", "fhe-traits", "futures", + "futures-util", + "serde", + "thiserror 1.0.69", "tokio", ] diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index fa931d4406..cb2d16771c 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -29,6 +29,7 @@ futures = "0.3.30" alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" +async-trait = { version = "0.1.88" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } hmac = "0.12.1" diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index d3b32025fd..9fe603540a 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -8,7 +8,7 @@ use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; use crisp::server::config::CONFIG as SERVER_CONFIG; // TODO: unify configuration use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; -use enclave_sdk::evm::contracts::EnclaveContract; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index ba1b4beb79..f877836039 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -9,7 +9,8 @@ use crate::server::{ }; use chrono::Utc; use compute_provider::FHEInputs; -use enclave_sdk::evm::contracts::EnclaveContract; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; +use enclave_sdk::indexer::DataStore; use log::info; use std::error::Error; use std::time::{Duration, SystemTime, UNIX_EPOCH}; diff --git a/examples/CRISP/apps/server/src/server/blockchain/sync.rs b/examples/CRISP/apps/server/src/server/blockchain/sync.rs index 11c14f2f80..8030cb20f2 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/sync.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/sync.rs @@ -11,7 +11,11 @@ use alloy::{ sol_types::SolEvent, }; use compute_provider::FHEInputs; -use enclave_sdk::evm::contracts::{EnclaveContract, E3 as ContractE3}; +use enclave_sdk::evm::contracts::{ + EnclaveContract, EnclaveRead, EnclaveReadOnlyProvider, EnclaveWrite, ReadOnly, ReadWrite, + E3 as ContractE3, +}; +use enclave_sdk::indexer::DataStore; use futures::future::join_all; use log::{error, info, warn}; use std::{ @@ -123,7 +127,7 @@ async fn find_last_finished_e3_id(latest_db_id: u64) -> Result> { /// Fetches events from the blockchain starting from a specific block. async fn fetch_events( - contract: Arc, + contract: Arc>, from_block: u64, ) -> Result>> { let filter = Filter::new() @@ -152,7 +156,7 @@ async fn fetch_events( /// Synchronizes a single E3. async fn sync_e3( e3_id: U256, - contract: Arc, + contract: Arc>, published_events: Arc>>, ) -> Result<()> { let events_clone = published_events.clone(); @@ -222,7 +226,7 @@ fn calculate_expiration(expiration_secs: &U256) -> Result { /// Computes and publishes the ciphertext output. async fn compute_and_publish_ciphertext( e3_id: U256, - contract: Arc, + contract: Arc>, events: Arc>>, ) -> Result<()> { let ciphertext_inputs = events diff --git a/examples/CRISP/apps/server/src/server/database.rs b/examples/CRISP/apps/server/src/server/database.rs index ef31bb19f6..1d522c5fb5 100644 --- a/examples/CRISP/apps/server/src/server/database.rs +++ b/examples/CRISP/apps/server/src/server/database.rs @@ -1,4 +1,6 @@ use super::models::E3; +use async_trait::async_trait; +use enclave_sdk::indexer::DataStore; use log::error; use once_cell::sync::Lazy; use rand::Rng; @@ -27,14 +29,25 @@ impl SledDB { db: Arc::new(RwLock::new(db)), }) } +} - pub async fn insert(&self, key: &str, value: &T) -> Result<(), DatabaseError> { +#[async_trait] +impl DataStore for SledDB { + type Error = DatabaseError; + async fn insert( + &self, + key: &str, + value: &T, + ) -> Result<(), Self::Error> { let serialized = serde_json::to_vec(value)?; self.db.write().await.insert(key.as_bytes(), serialized)?; Ok(()) } - pub async fn get(&self, key: &str) -> Result, DatabaseError> { + async fn get( + &self, + key: &str, + ) -> Result, Self::Error> { if let Some(bytes) = self.db.read().await.get(key.as_bytes())? { let value = serde_json::from_slice(&bytes)?; Ok(Some(value)) diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 89d9887b28..429e4e85eb 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -8,7 +8,8 @@ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; -use enclave_sdk::evm::contracts::EnclaveContract; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; +use enclave_sdk::indexer::DataStore; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { diff --git a/examples/CRISP/apps/server/src/server/routes/state.rs b/examples/CRISP/apps/server/src/server/routes/state.rs index 2595cacb19..175ab238ac 100644 --- a/examples/CRISP/apps/server/src/server/routes/state.rs +++ b/examples/CRISP/apps/server/src/server/routes/state.rs @@ -1,8 +1,9 @@ -use actix_web::{web, HttpResponse, Responder}; -use log::info; - use crate::server::database::{get_e3, GLOBAL_DB}; use crate::server::models::{CurrentRound, E3StateLite, GetRoundRequest, WebResultRequest}; +use actix_web::{web, HttpResponse, Responder}; +use enclave_sdk::evm::contracts::{EnclaveRead, EnclaveWrite}; +use enclave_sdk::indexer::DataStore; +use log::info; pub fn setup_routes(config: &mut web::ServiceConfig) { config.service( diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index 34cfa3fe57..48546c716c 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -8,7 +8,8 @@ use alloy::{ dyn_abi::DynSolValue, primitives::{Bytes, U256}, }; -use enclave_sdk::evm::contracts::EnclaveContract; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; +use enclave_sdk::indexer::DataStore; use eyre::Error; use log::info; diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 02b43aba8f..3a111fd065 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -731,6 +731,21 @@ dependencies = [ "tracing", ] +[[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 = "anyhow" version = "1.0.98" @@ -1193,7 +1208,12 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets 0.52.5", ] [[package]] @@ -1678,10 +1698,16 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "async-trait", + "bincode", + "chrono", "eyre", "fhe", "fhe-traits", "futures", + "futures-util", + "serde", + "thiserror 1.0.58", "tokio", ] @@ -2663,6 +2689,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "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 = "idna" version = "0.5.0" @@ -5398,6 +5448,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index ba78cc9944..86e3117982 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1000,6 +1000,21 @@ dependencies = [ "tracing", ] +[[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 = "anstream" version = "0.6.18" @@ -1738,7 +1753,12 @@ version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-link", ] [[package]] @@ -2425,10 +2445,16 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "async-trait", + "bincode", + "chrono", "eyre", "fhe 0.1.0-beta.7", "fhe-traits", "futures", + "futures-util", + "serde", + "thiserror 1.0.69", "tokio", ] @@ -3407,6 +3433,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[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 = "icu_collections" version = "1.5.0" @@ -7336,7 +7386,7 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "windows-core", + "windows-core 0.53.0", "windows-targets 0.52.6", ] @@ -7350,6 +7400,41 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "windows-link" version = "0.1.1" @@ -7363,7 +7448,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result 0.3.2", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -7394,6 +7479,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/packages/enclave-sdk/Cargo.lock b/packages/enclave-sdk/Cargo.lock index e01cb8ca75..e1ead888d2 100644 --- a/packages/enclave-sdk/Cargo.lock +++ b/packages/enclave-sdk/Cargo.lock @@ -712,6 +712,21 @@ dependencies = [ "tracing", ] +[[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 = "anyhow" version = "1.0.98" @@ -951,6 +966,15 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -1062,6 +1086,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "const-hex" version = "1.14.1" @@ -1101,6 +1139,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1341,10 +1385,17 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "async-trait", + "bincode", + "chrono", "eyre", "fhe", "fhe-traits", "futures", + "futures-util", + "serde", + "serde_json", + "thiserror 1.0.69", "tokio", ] @@ -1421,7 +1472,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -1444,7 +1495,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -1466,7 +1517,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand 0.8.5", ] @@ -1474,7 +1525,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=feature%2Fgreco-integration#b529be34a8b6cfa589b3ce451dbba0ce0126b92a" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", @@ -1814,6 +1865,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "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 = "icu_collections" version = "2.0.0" @@ -3841,6 +3916,41 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "windows-link" version = "0.1.1" @@ -3854,7 +3964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -3876,6 +3986,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml index 7c9e9723e8..461986abd4 100644 --- a/packages/enclave-sdk/Cargo.toml +++ b/packages/enclave-sdk/Cargo.toml @@ -11,6 +11,13 @@ fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } eyre = { version = "0.6.12", optional = true } futures = { version = "0.3.30", optional = true } tokio = { version = "1.37.0", optional = true } +async-trait = { version = "0.1.73", optional = true } +serde = { version = "1.0.208", optional = true } +serde_json = { version = "1.0.140", optional = true } +bincode = { version = "1.3.3", optional = true } +thiserror = { version = "1.0.58", optional = true } +chrono = { version = "0.4.38", optional = true } +futures-util = { version = "0.3.30", optional = true } [dependencies.alloy] version = "0.8.3" @@ -26,5 +33,11 @@ full = [ "eyre", "futures", "tokio/full", + "async-trait", + "serde/derive", + "bincode", + "thiserror", + "futures-util", + "chrono" ] risc0 = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] diff --git a/packages/enclave-sdk/scripts/build_fixtures.sh b/packages/enclave-sdk/scripts/build_fixtures.sh index 2b65360e00..2e037393dd 100755 --- a/packages/enclave-sdk/scripts/build_fixtures.sh +++ b/packages/enclave-sdk/scripts/build_fixtures.sh @@ -1,7 +1,22 @@ #!/usr/bin/env bash - set -e -echo "Building fixtures..." +echo "Building fixtures for all Solidity files..." + +# Folder containing the .sol files +SOLIDITY_DIR="tests/fixtures" + +# For each .sol file in the directory +for solidity_file in "$SOLIDITY_DIR"/*.sol; do + # Extract just the filename without path or extension + filename=$(basename "$solidity_file" .sol) + + echo "Processing $filename.sol..." + + # Create the JSON file with ABI and bytecode + echo "{\"abi\": $(solc --abi "$solidity_file" | tail -n 1), \"bin\": \"$(solc --bin "$solidity_file" | tail -n 1)\"}" | jq '.' > "$SOLIDITY_DIR/$filename.json" + + echo "Created $filename.json" +done -echo "{\"abi\": $(solc --abi tests/fixtures/emit_logs.sol | tail -n 1), \"bin\": \"$(solc --bin tests/fixtures/emit_logs.sol| tail -n 1)\"}" | jq '.' > tests/fixtures/emit_logs.json +echo "All fixtures built successfully." diff --git a/packages/enclave-sdk/scripts/test.sh b/packages/enclave-sdk/scripts/test.sh index 46b830cdd3..189d8fdb0d 100755 --- a/packages/enclave-sdk/scripts/test.sh +++ b/packages/enclave-sdk/scripts/test.sh @@ -4,4 +4,4 @@ set -e ./scripts/build_fixtures.sh -cargo test -- $@ +cargo test -- "$@" diff --git a/packages/enclave-sdk/src/evm/contracts.rs b/packages/enclave-sdk/src/evm/contracts.rs index c2b624d60b..7fe050be0d 100644 --- a/packages/enclave-sdk/src/evm/contracts.rs +++ b/packages/enclave-sdk/src/evm/contracts.rs @@ -11,7 +11,9 @@ use alloy::{ sol, transports::BoxTransport, }; +use async_trait::async_trait; use eyre::Result; +use std::marker::PhantomData; use std::sync::Arc; sol! { @@ -51,7 +53,120 @@ sol! { } } -pub type CRISPProvider = FillProvider< +/// Trait for read-only operations on the Enclave contract +#[async_trait] +pub trait EnclaveRead { + /// Get the next E3 ID + async fn get_e3_id(&self) -> Result; + + /// Get the details of an E3 by ID + async fn get_e3(&self, e3_id: U256) -> Result; + + /// Get the input count for a specific E3 ID + async fn get_input_count(&self, e3_id: U256) -> Result; + + /// Get the latest block number + async fn get_latest_block(&self) -> Result; + + /// Get the root for a specific ID + async fn get_root(&self, id: U256) -> Result; + + /// Get E3 parameters for a specific E3 ID + async fn get_e3_params(&self, e3_id: U256) -> Result; + + /// Check if an E3 program is enabled + async fn is_e3_program_enabled(&self, e3_program: Address) -> Result; +} + +/// Trait for write operations on the Enclave contract +#[async_trait] +pub trait EnclaveWrite { + /// Request a new E3 + async fn request_e3( + &self, + filter: Address, + threshold: [u32; 2], + start_window: [U256; 2], + duration: U256, + e3_program: Address, + e3_params: Bytes, + compute_provider_params: Bytes, + ) -> Result; + + /// Activate an E3 with a public key + async fn activate(&self, e3_id: U256, pub_key: Bytes) -> Result; + + /// Enable an E3 program + async fn enable_e3_program(&self, e3_program: Address) -> Result; + + /// Publish input data for an E3 + async fn publish_input(&self, e3_id: U256, data: Bytes) -> Result; + + /// Publish ciphertext output with proof + async fn publish_ciphertext_output( + &self, + e3_id: U256, + data: Bytes, + proof: Bytes, + ) -> Result; + + /// Publish plaintext output + async fn publish_plaintext_output( + &self, + e3_id: U256, + data: Bytes, + ) -> Result; +} + +/// Generic type to represent different provider types +pub trait ProviderType: Send { + type Provider: Provider + Send + Sync + 'static; +} + +/// Marker type for read-only provider +#[derive(Clone)] +pub struct ReadOnly; +impl ProviderType for ReadOnly { + type Provider = EnclaveReadOnlyProvider; +} +/// Marker type for read-write provider +pub struct ReadWrite; +impl ProviderType for ReadWrite { + type Provider = EnclaveWriteProvider; +} + +/// Generic Enclave contract +#[derive(Clone)] +pub struct EnclaveContract { + pub provider: Arc, + pub contract_address: Address, + _marker: PhantomData, +} + +impl EnclaveContract { + pub async fn new( + http_rpc_url: &str, + private_key: &str, + contract_address: &str, + ) -> Result> { + EnclaveContractFactory::create_write(http_rpc_url, contract_address, private_key).await + } +} + +impl EnclaveContract { + pub async fn create_read( + http_rpc_url: &str, + contract_address: &str, + ) -> Result> { + EnclaveContractFactory::create_read(http_rpc_url, contract_address).await + } +} + +/// Type alias for read-only provider +pub type EnclaveReadOnlyProvider = RootProvider; + +/// Type alias for read-write provider +pub type EnclaveWriteProvider = FillProvider< JoinFill< JoinFill< Identity, @@ -64,17 +179,22 @@ pub type CRISPProvider = FillProvider< Ethereum, >; -pub struct EnclaveContract { - pub provider: Arc, - pub contract_address: Address, -} +/// Type aliases for the two contract variants +pub type EnclaveReadContract = EnclaveContract; +pub type EnclaveWriteContract = EnclaveContract; -impl EnclaveContract { - pub async fn new( +// Factory for creating contract instances +pub struct EnclaveContractFactory; + +impl EnclaveContractFactory { + /// Create a write-capable contract + pub async fn create_write( http_rpc_url: &str, - private_key: &str, contract_address: &str, - ) -> Result { + private_key: &str, + ) -> Result> { + let contract_address = contract_address.parse()?; + let signer: PrivateKeySigner = private_key.parse()?; let wallet = EthereumWallet::from(signer); let provider = ProviderBuilder::new() @@ -83,13 +203,82 @@ impl EnclaveContract { .on_builtin(http_rpc_url) .await?; - Ok(Self { + Ok(EnclaveContract:: { provider: Arc::new(provider), - contract_address: contract_address.parse()?, + contract_address, + _marker: PhantomData, }) } - pub async fn request_e3( + /// Create a read-only contract + pub async fn create_read( + http_rpc_url: &str, + contract_address: &str, + ) -> Result> { + let contract_address = contract_address.parse()?; + + let provider = ProviderBuilder::new().on_builtin(http_rpc_url).await?; + + Ok(EnclaveContract:: { + provider: Arc::new(provider), + contract_address, + _marker: PhantomData, + }) + } +} + +// Implement EnclaveRead for any EnclaveContract regardless of provider type +#[async_trait] +impl EnclaveRead for EnclaveContract +where + T: ProviderType, +{ + async fn get_e3_id(&self) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let e3_id = contract.nexte3Id().call().await?; + Ok(e3_id.nexte3Id) + } + + async fn get_e3(&self, e3_id: U256) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let e3_return = contract.getE3(e3_id).call().await?; + Ok(e3_return.e3) + } + + async fn get_input_count(&self, e3_id: U256) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let input_count = contract.inputCounts(e3_id).call().await?; + Ok(input_count.inputCount) + } + + async fn get_latest_block(&self) -> Result { + let block = self.provider.get_block_number().await?; + Ok(block) + } + + async fn get_root(&self, id: U256) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let root = contract.getRoot(id).call().await?; + Ok(root._0) + } + + async fn get_e3_params(&self, e3_id: U256) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let params = contract.e3Params(e3_id).call().await?; + Ok(params.params) + } + + async fn is_e3_program_enabled(&self, e3_program: Address) -> Result { + let contract = Enclave::new(self.contract_address, &self.provider); + let enabled = contract.e3Programs(e3_program).call().await?; + Ok(enabled.allowed) + } +} + +// Implement EnclaveWrite only for contracts with ReadWrite marker +#[async_trait] +impl EnclaveWrite for EnclaveContract { + async fn request_e3( &self, filter: Address, threshold: [u32; 2], @@ -111,32 +300,32 @@ impl EnclaveContract { compute_provider_params, ) .value(U256::from(1)); - let receipt = builder.send().await.unwrap().get_receipt().await.unwrap(); + let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - pub async fn activate(&self, e3_id: U256, pub_key: Bytes) -> Result { + async fn activate(&self, e3_id: U256, pub_key: Bytes) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.activate(e3_id, pub_key); - let receipt = builder.send().await.unwrap().get_receipt().await.unwrap(); + let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - pub async fn enable_e3_program(&self, e3_program: Address) -> Result { + async fn enable_e3_program(&self, e3_program: Address) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.enableE3Program(e3_program); let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - pub async fn publish_input(&self, e3_id: U256, data: Bytes) -> Result { + async fn publish_input(&self, e3_id: U256, data: Bytes) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.publishInput(e3_id, data); - let receipt = builder.send().await.unwrap().get_receipt().await.unwrap(); + let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - pub async fn publish_ciphertext_output( + async fn publish_ciphertext_output( &self, e3_id: U256, data: Bytes, @@ -144,59 +333,18 @@ impl EnclaveContract { ) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.publishCiphertextOutput(e3_id, data, proof); - let receipt = builder.send().await.unwrap().get_receipt().await.unwrap(); + let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - pub async fn publish_plaintext_output( + async fn publish_plaintext_output( &self, e3_id: U256, data: Bytes, ) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.publishPlaintextOutput(e3_id, data); - let receipt = builder.send().await.unwrap().get_receipt().await.unwrap(); + let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } - - pub async fn get_e3_id(&self) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let e3_id = contract.nexte3Id().call().await?; - Ok(e3_id.nexte3Id) - } - - pub async fn get_e3(&self, e3_id: U256) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let e3_return = contract.getE3(e3_id).call().await?; - Ok(e3_return.e3) - } - - pub async fn get_input_count(&self, e3_id: U256) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let input_count = contract.inputCounts(e3_id).call().await?; - Ok(input_count.inputCount) - } - - pub async fn get_latest_block(&self) -> Result { - let block = self.provider.get_block_number().await?; - Ok(block) - } - - pub async fn get_root(&self, id: U256) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let root = contract.getRoot(id).call().await?; - Ok(root._0) - } - - pub async fn get_e3_params(&self, e3_id: U256) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let params = contract.e3Params(e3_id).call().await?; - Ok(params.params) - } - - pub async fn is_e3_program_enabled(&self, e3_program: Address) -> Result { - let contract = Enclave::new(self.contract_address, &self.provider); - let enabled = contract.e3Programs(e3_program).call().await?; - Ok(enabled.allowed) - } } diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/enclave-sdk/src/evm/listener.rs index 2e4e1ca521..bfc2da5b3f 100644 --- a/packages/enclave-sdk/src/evm/listener.rs +++ b/packages/enclave-sdk/src/evm/listener.rs @@ -7,17 +7,18 @@ use alloy::{ }; use eyre::Result; use futures::stream::StreamExt; -use std::{collections::HashMap, sync::Arc}; +use futures_util::future::FutureExt; +use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc}; +use tokio::sync::RwLock; -// Define a domain event type that's decoupled from Log -pub trait DomainEvent: Send + Sync { - fn signature(&self) -> B256; -} +type EventHandler = + Box Pin> + Send>> + Send + Sync>; +#[derive(Clone)] pub struct EventListener { provider: Arc>, filter: Filter, - handlers: HashMap Result<()> + Send + Sync>>>, + handlers: Arc>>>, } impl EventListener { @@ -25,22 +26,34 @@ impl EventListener { Self { provider, filter, - handlers: HashMap::new(), + handlers: Arc::new(RwLock::new(HashMap::new())), } } - pub fn add_event_handler( - &mut self, - handler: impl Fn(&E) -> Result<()> + Send + Sync + 'static, - ) where - E: SolEvent + 'static, + pub async fn add_event_handler(&mut self, handler: F) + where + E: SolEvent + Send + Clone + 'static, + F: FnMut(E) -> Fut + Send + Sync + 'static, + Fut: Future> + Send + 'static, { let signature = E::SIGNATURE_HASH; - let wrapped_handler = Box::new(move |log: &Log| -> Result<()> { - let event = log.log_decode::()?.inner.data; - handler(&event) + let handler = Arc::new(RwLock::new(handler)); + + let wrapped_handler = Box::new(move |log: &Log| { + let handler = Arc::clone(&handler); + let log = log.clone(); + async move { + let decoded = log.log_decode::()?; + let event = decoded.inner.data; + let mut fnwrite = handler.write().await; + fnwrite(event.clone()).await + } + .boxed() }); + self.handlers + .write() + .await .entry(signature) .or_insert_with(Vec::new) .push(wrapped_handler); @@ -55,30 +68,24 @@ impl EventListener { while let Some(log) = stream.next().await { if let Some(topic0) = log.topic0() { - if let Some(handlers) = self.handlers.get(topic0) { + if let Some(handlers) = self.handlers.clone().read().await.get(topic0) { for handler in handlers { - if let Err(e) = handler(&log) { - // We don't necessarily want logging here so just printing to stderr - // for now. We can make this fancier later if we need to. + if let Err(e) = handler(&log).await { eprintln!("Error processing event 0x{:x}: {:?}", topic0, e); } } } } } - Ok(()) } - pub async fn create_contract_listener( - ws_url: &str, - contract_address: &Address, - ) -> Result { + pub async fn create_contract_listener(ws_url: &str, contract_address: &str) -> Result { let provider = Arc::new(ProviderBuilder::new().on_builtin(ws_url).await?); + let address = contract_address.parse::
()?; let filter = Filter::new() - .address(contract_address.clone()) + .address(address) .from_block(BlockNumberOrTag::Latest); - Ok(EventListener::new(provider, filter)) } } diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs index 7e0017a608..71f97db719 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -1,12 +1,285 @@ -// Stub indexer -use crate::evm::contracts::EnclaveContract; +use super::models::E3; +use alloy::primitives::Uint; +use alloy::providers::Provider; +use async_trait::async_trait; +use eyre::eyre; +use eyre::Result; +use serde::{de::DeserializeOwned, Serialize}; +use std::{collections::HashMap, sync::Arc}; +use thiserror::Error; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; -pub struct EnclaveIndexer { - contract: EnclaveContract, +use crate::evm::{ + contracts::{ + EnclaveContract, EnclaveContractFactory, EnclaveRead, EnclaveReadOnlyProvider, ReadOnly, + }, + events::{CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished}, + listener::EventListener, +}; + +type E3Id = u64; + +#[derive(Error, Debug)] +pub enum IndexerError { + #[error("E3 not found: {0}")] + E3NotFound(E3Id), + #[error("Object not serializable: {0}")] + Serialization(E3Id), +} + +/// Trait for injectable DataStore. Note the implementor must manage interior mutability +#[async_trait] +pub trait DataStore: Send + Sync + 'static { + type Error; + async fn insert( + &self, + key: &str, + value: &T, + ) -> Result<(), Self::Error>; + async fn get( + &self, + key: &str, + ) -> Result, Self::Error>; +} + +pub struct InMemoryStore { + data: Arc>>>, +} + +impl InMemoryStore { + pub fn new() -> Self { + Self { + data: Arc::new(RwLock::new(HashMap::new())), + } + } +} + +#[async_trait] +impl DataStore for InMemoryStore { + type Error = eyre::Error; + + async fn insert( + &self, + key: &str, + value: &T, + ) -> Result<(), Self::Error> { + self.data + .write() + .await + .insert(key.to_string(), bincode::serialize(value)?); + Ok(()) + } + + async fn get( + &self, + key: &str, + ) -> Result, Self::Error> { + Ok(self + .data + .read() + .await + .get(key) + .map(|bytes| bincode::deserialize(bytes)) + .transpose()?) + } +} + +#[derive(Clone)] +pub struct EnclaveIndexer { + listener: EventListener, + contract: EnclaveContract, + store: Arc>, + contract_address: String, + chain_id: u64, +} + +impl EnclaveIndexer { + pub async fn new(ws_url: &str, contract_address: &str, store: Store) -> Result { + let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; + let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; + let chain_id = contract.provider.get_chain_id().await?; + let mut instance = Self { + store: Arc::new(RwLock::new(store)), + contract, + listener, + contract_address: contract_address.to_string(), + chain_id, + }; + instance.setup_listeners().await?; + Ok(instance) + } + + async fn capture_e3_activated(&mut self) -> Result<()> { + let db = self.store.clone(); + let contract = self.contract.clone(); + let chain_id = self.chain_id; + let enclave_address = self.contract_address.clone(); + self.listener + .add_event_handler(move |e: E3Activated| { + let db = db.clone(); + let enclave_address = enclave_address.clone(); + let contract = contract.clone(); + async move { + println!("E3Activated:{:?}", e); + let e3_id = u64_try_from(e.e3Id)?; + let e3 = contract.get_e3(e.e3Id).await?; + let e3_obj = E3 { + chain_id, + ciphertext_inputs: vec![], + ciphertext_output: vec![], + committee_public_key: e.committeePublicKey.to_vec(), + duration: u64_try_from(e3.duration)?, + e3_params: e3.e3ProgramParams.to_vec(), + enclave_address, + encryption_scheme_id: e3.encryptionSchemeId.to_vec(), + expiration: u64_try_from(e.expiration)?, + id: e3_id, + plaintext_output: vec![], + request_block: u64_try_from(e3.requestBlock)?, + seed: u64_try_from(e3.seed)?, // TODO: make this into a bytes32 + start_window: [ + u64_try_from(e3.startWindow[0])?, + u64_try_from(e3.startWindow[1])?, + ], + threshold: e3.threshold, + }; + + let key = format!("e3:{}", e3_id); + + db.write() + .await + .insert(&key, &e3_obj) + .await + .map_err(|_| IndexerError::Serialization(e3_id))?; + + Ok(()) + } + }) + .await; + Ok(()) + } + + async fn capture_input_published(&mut self) -> Result<()> { + let store = self.store.clone(); + self.listener + .add_event_handler(move |e: InputPublished| { + let store = store.clone(); + async move { + println!("InputPublished:{:?}", e); + let e3_id = u64_try_from(e.e3Id)?; + let (mut e3, key) = get_e3(store.clone(), e3_id).await?; + e3.ciphertext_inputs + .push((e.data.to_vec(), e.index.to::())); + store + .write() + .await + .insert(&key, &e3) + .await + .map_err(|_| IndexerError::Serialization(e3_id))?; + + Ok(()) + } + }) + .await; + Ok(()) + } + + async fn capture_ciphertext_output_published(&mut self) -> Result<()> { + let store = self.store.clone(); + self.listener + .add_event_handler(move |e: CiphertextOutputPublished| { + let store = store.clone(); + async move { + println!("CiphertextOutputPublished:{:?}", e); + let e3_id = u64_try_from(e.e3Id)?; + let (mut e3, key) = get_e3(store.clone(), e3_id).await?; + e3.ciphertext_output = e.ciphertextOutput.to_vec(); + + store + .write() + .await + .insert(&key, &e3) + .await + .map_err(|_| IndexerError::Serialization(e3_id))?; + + Ok(()) + } + }) + .await; + Ok(()) + } + + async fn capture_plaintext_output_published(&mut self) -> Result<()> { + let store = self.store.clone(); + self.listener + .add_event_handler(move |e: PlaintextOutputPublished| { + let store = store.clone(); + async move { + println!("PlaintextOutputPublished:{:?}", e); + let e3_id = u64_try_from(e.e3Id)?; + let (mut e3, key) = get_e3(store.clone(), e3_id).await?; + e3.plaintext_output = e.plaintextOutput.to_vec(); + + store + .write() + .await + .insert(&key, &e3) + .await + .map_err(|_| IndexerError::Serialization(e3_id))?; + + Ok(()) + } + }) + .await; + Ok(()) + } + + async fn setup_listeners(&mut self) -> Result<()> { + self.capture_e3_activated().await?; + self.capture_input_published().await?; + self.capture_ciphertext_output_published().await?; + self.capture_plaintext_output_published().await?; + Ok(()) + } + + pub fn start(&self) -> Result> { + let listener = self.listener.clone(); + let handle = tokio::spawn(async move { + if let Err(e) = listener.listen().await { + eprintln!("Error: {}", e); + } + }); + Ok(handle) + } + + pub async fn get_e3(&self, e3_id: u64) -> Result { + let (e3, _) = get_e3(self.store.clone(), e3_id).await?; + Ok(e3) + } + + pub fn get_listener(&self) -> EventListener { + self.listener.clone() + } } -impl EnclaveIndexer { - pub fn start() { - todo!(); +pub async fn get_e3( + store: Arc>, + e3_id: u64, +) -> Result<(E3, String), IndexerError> { + let key = format!("e3:{}", e3_id); + match store + .read() + .await + .get::(&key) + .await + .map_err(|_| IndexerError::Serialization(e3_id))? + { + Some(e3) => Ok((e3, key)), + None => Err(IndexerError::E3NotFound(e3_id)), } } + +fn u64_try_from(input: Uint<256, 4>) -> Result { + u64::try_from(input).map_err(|_| eyre!("larger than 64-bit")) +} diff --git a/packages/enclave-sdk/src/indexer/mod.rs b/packages/enclave-sdk/src/indexer/mod.rs index 6e9a8c0544..ab6e7dec6a 100644 --- a/packages/enclave-sdk/src/indexer/mod.rs +++ b/packages/enclave-sdk/src/indexer/mod.rs @@ -1 +1,3 @@ mod indexer; +pub mod models; +pub use indexer::*; diff --git a/packages/enclave-sdk/src/indexer/models.rs b/packages/enclave-sdk/src/indexer/models.rs new file mode 100644 index 0000000000..e836676b60 --- /dev/null +++ b/packages/enclave-sdk/src/indexer/models.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize)] +pub struct E3 { + pub chain_id: u64, + pub ciphertext_inputs: Vec<(Vec, u64)>, + pub ciphertext_output: Vec, + pub committee_public_key: Vec, + pub duration: u64, + pub e3_params: Vec, + pub enclave_address: String, + pub encryption_scheme_id: Vec, + pub expiration: u64, + pub id: u64, + pub plaintext_output: Vec, + pub request_block: u64, + pub seed: u64, + pub start_window: [u64; 2], + pub threshold: [u32; 2], +} diff --git a/packages/enclave-sdk/tests/fixtures/fake_enclave.sol b/packages/enclave-sdk/tests/fixtures/fake_enclave.sol new file mode 100644 index 0000000000..469547e291 --- /dev/null +++ b/packages/enclave-sdk/tests/fixtures/fake_enclave.sol @@ -0,0 +1,100 @@ +pragma solidity >=0.4.24; + +contract FakeEnclave { + event E3Activated( + uint256 e3Id, + uint256 expiration, + bytes committeePublicKey + ); + event InputPublished( + uint256 indexed e3Id, + bytes data, + uint256 inputHash, + uint256 index + ); + event CiphertextOutputPublished( + uint256 indexed e3Id, + bytes ciphertextOutput + ); + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); + event CommitteePublished(uint256 indexed e3Id, bytes publicKey); + + // Emit E3Activated event with passed test data + function emitE3Activated( + uint256 e3Id, + uint256 expiration, + bytes memory committeePublicKey + ) public { + emit E3Activated(e3Id, expiration, committeePublicKey); + } + + // Emit InputPublished event with passed test data + function emitInputPublished( + uint256 e3Id, + bytes memory data, + uint256 inputHash, + uint256 index + ) public { + emit InputPublished(e3Id, data, inputHash, index); + } + + // Emit CiphertextOutputPublished event with passed test data + function emitCiphertextOutputPublished( + uint256 e3Id, + bytes memory ciphertextOutput + ) public { + emit CiphertextOutputPublished(e3Id, ciphertextOutput); + } + + // Emit PlaintextOutputPublished event with passed test data + function emitPlaintextOutputPublished( + uint256 e3Id, + bytes memory plaintextOutput + ) public { + emit PlaintextOutputPublished(e3Id, plaintextOutput); + } + + // Emit CommitteePublished event with passed test data + function emitCommitteePublished( + uint256 e3Id, + bytes memory publicKey + ) public { + emit CommitteePublished(e3Id, publicKey); + } + + function getE3(uint256 _e3Id) external view returns (E3 memory e3) { + e3 = E3({ + seed: 123456789012, + threshold: [uint32(2), uint32(3)], + requestBlock: 18750000, + startWindow: [uint256(18750100), uint256(18750200)], + duration: 100, + expiration: block.timestamp + 1 days, + encryptionSchemeId: bytes32(keccak256("AES-256-GCM")), + e3Program: 0x7F3E4df648B8Cb96C1D343be976b91B97CaD5c21, + inputValidator: 0xA51D5E87c0C82dDEBfa4E7E515B2D8Eea8f3e4f2, + decryptionVerifier: 0x4B0D8c2E5f7a6c832f8b16d3aB0e7F5d9E9B24b1, + e3ProgramParams: abi.encode(42, "testParams"), + committeePublicKey: bytes32(keccak256("committee_public_key")), + ciphertextOutput: bytes32(keccak256("encrypted_data")), + plaintextOutput: abi.encode("decrypted_result") + }); + } +} + +struct E3 { + uint256 seed; + uint32[2] threshold; + uint256 requestBlock; + uint256[2] startWindow; + uint256 duration; + uint256 expiration; + bytes32 encryptionSchemeId; + address e3Program; + bytes e3ProgramParams; + address inputValidator; + address decryptionVerifier; + bytes32 committeePublicKey; + bytes32 ciphertextOutput; + bytes plaintextOutput; +} diff --git a/packages/enclave-sdk/tests/indexer.rs b/packages/enclave-sdk/tests/indexer.rs new file mode 100644 index 0000000000..b82c278156 --- /dev/null +++ b/packages/enclave-sdk/tests/indexer.rs @@ -0,0 +1,114 @@ +use std::time::Duration; + +use alloy::{ + node_bindings::Anvil, + primitives::{Bytes, Uint}, + providers::{ProviderBuilder, WsConnect}, + sol, +}; +use enclave_sdk::indexer::{EnclaveIndexer, InMemoryStore}; +use eyre::Result; +use tokio::time::sleep; + +sol!( + #[sol(rpc)] + Enclave, + "tests/fixtures/fake_enclave.json" +); + +#[tokio::test] +async fn test_indexer() -> Result<()> { + let anvil = Anvil::new().block_time(1).try_spawn()?; + + let provider = ProviderBuilder::new() + .on_ws(WsConnect::new(anvil.ws_endpoint())) + .await?; + + let contract = Enclave::deploy(provider).await?; + let address = contract.address().to_string(); + let endpoint = anvil.ws_endpoint(); + + let indexer = EnclaveIndexer::new(&endpoint, &address, InMemoryStore::new()).await?; + + // Start tracking state + indexer.start()?; + + // E3Activated + let e3_id = 10; + + let pubkey = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; + contract + .emitE3Activated( + Uint::from(e3_id), + Uint::from(10), + Bytes::from(pubkey.clone()), + ) + .send() + .await? + .watch() + .await?; + + // InputPublished + let data = "Random data that wont actually be a string".to_string(); + contract + .emitInputPublished( + Uint::from(e3_id), + Bytes::from(data.clone()), + Uint::from(1111), + Uint::from(1), + ) + .send() + .await? + .watch() + .await?; + + contract + .emitInputPublished( + Uint::from(e3_id), + Bytes::from(data.clone()), + Uint::from(2222), + Uint::from(2), + ) + .send() + .await? + .watch() + .await?; + + contract + .emitInputPublished( + Uint::from(e3_id), + Bytes::from(data.clone()), + Uint::from(3333), + Uint::from(3), + ) + .send() + .await? + .watch() + .await?; + + sleep(Duration::from_millis(10)).await; + + assert_eq!(indexer.get_e3(e3_id).await?.ciphertext_inputs.len(), 3); + assert_eq!( + indexer.get_e3(e3_id).await?.ciphertext_inputs, + vec![ + (Bytes::from(data.clone()).to_vec(), 1), + (Bytes::from(data.clone()).to_vec(), 2), + (Bytes::from(data.clone()).to_vec(), 3), + ] + ); + + let ciphertext_output = vec![9, 8, 7, 6, 5, 4, 3, 2, 1]; + contract + .emitCiphertextOutputPublished(Uint::from(e3_id), Bytes::from(ciphertext_output.clone())) + .send() + .await? + .watch() + .await?; + + let e3 = indexer.get_e3(e3_id).await?; + + assert_eq!(e3.ciphertext_output, ciphertext_output); + + Ok(()) +} diff --git a/packages/enclave-sdk/tests/listener.rs b/packages/enclave-sdk/tests/listener.rs index 2cc5edc97a..e5068d8dda 100644 --- a/packages/enclave-sdk/tests/listener.rs +++ b/packages/enclave-sdk/tests/listener.rs @@ -13,7 +13,7 @@ sol!( ); #[tokio::test] -async fn event_listener() -> Result<()> { +async fn test_event_listener() -> Result<()> { let anvil = Anvil::new().block_time(1).try_spawn()?; let (tx, mut rx) = tokio::sync::mpsc::channel::(10); let (tx_addr, mut rx_addr) = tokio::sync::mpsc::channel::(10); @@ -24,22 +24,32 @@ async fn event_listener() -> Result<()> { let contract = EmitLogs::deploy(provider).await?; - let mut event_listener = - EventListener::create_contract_listener(&anvil.ws_endpoint(), contract.address()).await?; + let mut event_listener = EventListener::create_contract_listener( + &anvil.ws_endpoint(), + &contract.address().to_string(), + ) + .await?; - event_listener.add_event_handler::( - move |event: &EmitLogs::ValueChanged| { - let _ = tx.clone().try_send(event.value.clone()); - Ok(()) - }, - ); + event_listener + .add_event_handler(move |event: EmitLogs::ValueChanged| { + let tx = tx.clone(); + async move { + let _ = tx.clone().try_send(event.value.clone()); + Ok(()) + } + }) + .await; + + event_listener + .add_event_handler(move |event: EmitLogs::ValueChanged| { + let tx_addr = tx_addr.clone(); + async move { + let _ = tx_addr.clone().try_send(event.author.to_string()); + Ok(()) + } + }) + .await; - event_listener.add_event_handler::( - move |event: &EmitLogs::ValueChanged| { - let _ = tx_addr.clone().try_send(event.author.to_string()); - Ok(()) - }, - ); tokio::spawn(async move { event_listener.listen().await.unwrap() }); contract From 4c3b550403fd26825fa6908619267eef86653440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 22 May 2025 02:24:17 +0000 Subject: [PATCH 016/106] Better blosure types (#436) --- packages/enclave-sdk/src/evm/listener.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/enclave-sdk/src/evm/listener.rs index bfc2da5b3f..6a16c3ef36 100644 --- a/packages/enclave-sdk/src/evm/listener.rs +++ b/packages/enclave-sdk/src/evm/listener.rs @@ -33,20 +33,18 @@ impl EventListener { pub async fn add_event_handler(&mut self, handler: F) where E: SolEvent + Send + Clone + 'static, - F: FnMut(E) -> Fut + Send + Sync + 'static, + F: Fn(E) -> Fut + Send + Sync + 'static, Fut: Future> + Send + 'static, { let signature = E::SIGNATURE_HASH; - let handler = Arc::new(RwLock::new(handler)); - + let handler = Arc::new(handler); let wrapped_handler = Box::new(move |log: &Log| { let handler = Arc::clone(&handler); let log = log.clone(); async move { let decoded = log.log_decode::()?; let event = decoded.inner.data; - let mut fnwrite = handler.write().await; - fnwrite(event.clone()).await + handler(event.clone()).await } .boxed() }); From 840c7165a68058a0a526f8a0b9d099d4c57aae3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 22 May 2025 14:44:19 +0000 Subject: [PATCH 017/106] Improve DataStore API mutability design (#437) * Better interior mutability handling * No need for Arc * Ensure GLOBAL_DB is not public * Update DB access * Update db_instance method * Fix compilation issues --- .../server/src/server/blockchain/handlers.rs | 14 +++---- .../apps/server/src/server/blockchain/sync.rs | 14 +++---- .../CRISP/apps/server/src/server/database.rs | 39 +++++++++++++------ examples/CRISP/apps/server/src/server/mod.rs | 5 --- .../CRISP/apps/server/src/server/models.rs | 5 +-- .../apps/server/src/server/routes/rounds.rs | 13 ++----- .../apps/server/src/server/routes/state.rs | 4 +- .../apps/server/src/server/routes/voting.rs | 6 +-- packages/enclave-sdk/src/indexer/indexer.rs | 12 ++---- 9 files changed, 53 insertions(+), 59 deletions(-) diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index f877836039..6e441ada6e 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -4,7 +4,7 @@ use super::events::{ }; use crate::server::{ config::CONFIG, - database::{generate_emoji, get_e3, update_e3_status, GLOBAL_DB}, + database::{db_get, db_insert, generate_emoji, get_e3, update_e3_status}, models::{CurrentRound, E3}, }; use chrono::Utc; @@ -74,11 +74,11 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { // Save E3 to the database let key = format!("e3:{}", e3_id); - GLOBAL_DB.insert(&key, &e3_obj).await?; + db_insert(&key, &e3_obj).await?; // Set Current Round let current_round = CurrentRound { id: e3_id }; - GLOBAL_DB.insert("e3:current_round", ¤t_round).await?; + db_insert("e3:current_round", ¤t_round).await?; let expiration = Instant::now() + (UNIX_EPOCH + Duration::from_secs(expiration)) @@ -130,7 +130,7 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { info!("E3 has no votes to decrypt. Setting status to Finished."); e3.status = "Finished".to_string(); - GLOBAL_DB.insert(&key, &e3).await?; + db_insert(&key, &e3).await?; } info!("E3 request handled successfully."); Ok(()) @@ -146,7 +146,7 @@ pub async fn handle_input_published(input: InputPublished) -> Result<()> { .push((input.data.to_vec(), input.index.to::())); e3.vote_count += 1; - GLOBAL_DB.insert(&key, &e3).await?; + db_insert(&key, &e3).await?; info!("Saved Input with Hash: {:?}", input.inputHash); Ok(()) @@ -163,7 +163,7 @@ pub async fn handle_ciphertext_output_published( e3.ciphertext_output = ciphertext_output.ciphertextOutput.to_vec(); e3.status = "CiphertextPublished".to_string(); - GLOBAL_DB.insert(&key, &e3).await?; + db_insert(&key, &e3).await?; info!("CiphertextOutputPublished event handled."); Ok(()) @@ -186,7 +186,7 @@ pub async fn handle_plaintext_output_published( info!("Votes Option 1: {:?}", e3.votes_option_1); info!("Votes Option 2: {:?}", e3.votes_option_2); - GLOBAL_DB.insert(&key, &e3).await?; + db_insert(&key, &e3).await?; info!("PlaintextOutputPublished event handled."); Ok(()) diff --git a/examples/CRISP/apps/server/src/server/blockchain/sync.rs b/examples/CRISP/apps/server/src/server/blockchain/sync.rs index 8030cb20f2..0e5fbf2b48 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/sync.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/sync.rs @@ -1,7 +1,7 @@ use super::events::InputPublished; use crate::server::{ config::CONFIG, - database::{generate_emoji, get_e3, update_e3_status, GLOBAL_DB}, + database::{db_get, db_insert, generate_emoji, get_e3, update_e3_status}, models::{CurrentRound, E3}, }; use alloy::{ @@ -43,7 +43,7 @@ pub async fn sync_server() -> Result<()> { ); // Retrieve the current round from the database. - let current_round = match GLOBAL_DB.get::("e3:current_round").await? { + let current_round = match db_get::("e3:current_round").await? { Some(round) => round, None => { info!("No current round found in DB. Exiting sync process. Will compute next round."); @@ -103,9 +103,7 @@ pub async fn sync_server() -> Result<()> { let new_current_round = CurrentRound { id: latest_contract_e3_id, }; - GLOBAL_DB - .insert("e3:current_round", &new_current_round) - .await?; + db_insert("e3:current_round", &new_current_round).await?; info!("Server synchronization completed."); Ok(()) @@ -250,9 +248,7 @@ async fn compute_and_publish_ciphertext( // Update vote count let mut db_e3 = get_e3(e3_id.to::()).await?.0; db_e3.vote_count = ciphertext_inputs.len() as u64; - GLOBAL_DB - .insert(&format!("e3:{}", e3_id.to::()), &db_e3) - .await?; + db_insert(&format!("e3:{}", e3_id.to::()), &db_e3).await?; let contract_e3 = contract.get_e3(e3_id).await?; let fhe_inputs = FHEInputs { @@ -320,7 +316,7 @@ async fn sync_e3_with_db(e3_id: U256, contract_e3: &ContractE3, vote_count: u64) warn!("Unexpected plaintext output format for E3 {}", e3_id); } - GLOBAL_DB.insert(&key, &db_e3).await?; + db_insert(&key, &db_e3).await?; info!("E3 {} synced with DB", e3_id); Ok(()) diff --git a/examples/CRISP/apps/server/src/server/database.rs b/examples/CRISP/apps/server/src/server/database.rs index 1d522c5fb5..b493cbb612 100644 --- a/examples/CRISP/apps/server/src/server/database.rs +++ b/examples/CRISP/apps/server/src/server/database.rs @@ -8,6 +8,7 @@ use serde::{de::DeserializeOwned, Serialize}; use sled::Db; use std::{error::Error, str, sync::Arc}; use thiserror::Error; +use tokio::sync::Mutex; use tokio::sync::RwLock; #[derive(Error, Debug)] @@ -19,15 +20,13 @@ pub enum DatabaseError { } #[derive(Clone)] pub struct SledDB { - pub db: Arc>, + pub db: Db, } impl SledDB { pub fn new(path: &str) -> Result { let db = sled::open(path)?; - Ok(Self { - db: Arc::new(RwLock::new(db)), - }) + Ok(Self { db }) } } @@ -35,12 +34,12 @@ impl SledDB { impl DataStore for SledDB { type Error = DatabaseError; async fn insert( - &self, + &mut self, key: &str, value: &T, ) -> Result<(), Self::Error> { let serialized = serde_json::to_vec(value)?; - self.db.write().await.insert(key.as_bytes(), serialized)?; + self.db.insert(key.as_bytes(), serialized)?; Ok(()) } @@ -48,7 +47,7 @@ impl DataStore for SledDB { &self, key: &str, ) -> Result, Self::Error> { - if let Some(bytes) = self.db.read().await.get(key.as_bytes())? { + if let Some(bytes) = self.db.get(key.as_bytes())? { let value = serde_json::from_slice(&bytes)?; Ok(Some(value)) } else { @@ -57,14 +56,30 @@ impl DataStore for SledDB { } } -pub static GLOBAL_DB: Lazy = Lazy::new(|| { +static GLOBAL_DB: Lazy> = Lazy::new(|| { let pathdb = std::env::current_dir().unwrap().join("database/server"); - SledDB::new(pathdb.to_str().unwrap()).unwrap() + RwLock::new(SledDB::new(pathdb.to_str().unwrap()).unwrap()) }); +pub async fn db_insert( + key: &str, + value: &T, +) -> Result<(), DatabaseError> { + let mut db = GLOBAL_DB.write().await; + db.insert(key, value).await?; + Ok(()) +} + +pub async fn db_get( + key: &str, +) -> Result, DatabaseError> { + let db = GLOBAL_DB.read().await; + db.get::(key).await +} + pub async fn get_e3(e3_id: u64) -> Result<(E3, String), Box> { let key = format!("e3:{}", e3_id); - match GLOBAL_DB.get::(&key).await? { + match db_get::(&key).await? { Some(e3) => Ok((e3, key)), None => { error!("E3 state not found for key: {}", key); @@ -78,9 +93,9 @@ pub async fn update_e3_status( status: String, ) -> Result<(), Box> { let key = format!("e3:{}", e3_id); - let mut e3 = GLOBAL_DB.get::(&key).await?.unwrap(); + let mut e3 = db_get::(&key).await?.unwrap(); e3.status = status; - GLOBAL_DB.insert(&key, &e3).await?; + db_insert(&key, &e3).await?; Ok(()) } diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index fa7cf78df6..28c134af97 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -8,8 +8,6 @@ use actix_cors::Cors; use actix_web::{middleware::Logger, web, App, HttpServer}; use blockchain::listener::start_listener; -use database::GLOBAL_DB; -use models::AppState; use crate::logger::init_logger; use config::CONFIG; @@ -47,9 +45,6 @@ pub async fn start() -> Result<(), Box> { App::new() .wrap(cors) .wrap(Logger::new(r#"%a "%r" %s %b %T"#)) - .app_data(web::Data::new(AppState { - sled: GLOBAL_DB.clone(), - })) .configure(routes::setup_routes) }) .bind("0.0.0.0:4000")? diff --git a/examples/CRISP/apps/server/src/server/models.rs b/examples/CRISP/apps/server/src/server/models.rs index 472dc3c768..f4e44a85dd 100644 --- a/examples/CRISP/apps/server/src/server/models.rs +++ b/examples/CRISP/apps/server/src/server/models.rs @@ -1,9 +1,6 @@ use crate::server::database::SledDB; use serde::{Deserialize, Serialize}; - -pub struct AppState { - pub sled: SledDB, -} +use tokio::sync::RwLock; #[derive(Debug, Deserialize, Serialize)] pub struct JsonResponse { diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 429e4e85eb..52e54bbc02 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -1,8 +1,7 @@ use crate::server::config::CONFIG; -use crate::server::database::get_e3; +use crate::server::database::{db_get, get_e3}; use crate::server::models::{ - AppState, CTRequest, ComputeProviderParams, CronRequestE3, CurrentRound, JsonResponse, - PKRequest, + CTRequest, ComputeProviderParams, CronRequestE3, CurrentRound, JsonResponse, PKRequest, }; use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; @@ -50,15 +49,11 @@ async fn request_new_round(data: web::Json) -> impl Responder { /// Get the current E3 round /// -/// # Arguments -/// -/// * `AppState` - The application state -/// /// # Returns /// /// * A JSON response containing the current round -async fn get_current_round(state: web::Data) -> impl Responder { - match state.sled.get::("e3:current_round").await { +async fn get_current_round() -> impl Responder { + match db_get::("e3:current_round").await { Ok(Some(current_round)) => HttpResponse::Ok().json(current_round), Ok(None) => HttpResponse::NotFound().json(JsonResponse { response: "No current round found".to_string(), diff --git a/examples/CRISP/apps/server/src/server/routes/state.rs b/examples/CRISP/apps/server/src/server/routes/state.rs index 175ab238ac..a75b12ee1e 100644 --- a/examples/CRISP/apps/server/src/server/routes/state.rs +++ b/examples/CRISP/apps/server/src/server/routes/state.rs @@ -1,4 +1,4 @@ -use crate::server::database::{get_e3, GLOBAL_DB}; +use crate::server::database::{db_get, get_e3}; use crate::server::models::{CurrentRound, E3StateLite, GetRoundRequest, WebResultRequest}; use actix_web::{web, HttpResponse, Responder}; use enclave_sdk::evm::contracts::{EnclaveRead, EnclaveWrite}; @@ -43,7 +43,7 @@ async fn get_round_result(data: web::Json) -> impl Responder { /// /// * A JSON response containing the results for all rounds async fn get_all_round_results() -> impl Responder { - let round_count = match GLOBAL_DB.get::("e3:current_round").await { + let round_count = match db_get::("e3:current_round").await { Ok(count) => count.unwrap().id, Err(e) => { info!("Error retrieving round count: {:?}", e); diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index 48546c716c..0f13e039a7 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -1,6 +1,6 @@ use crate::server::{ config::CONFIG, - database::{get_e3, GLOBAL_DB}, + database::{db_get, db_insert, get_e3}, models::{EncryptedVote, VoteResponse, VoteResponseStatus, E3}, }; use actix_web::{web, HttpResponse, Responder}; @@ -88,7 +88,7 @@ async fn validate_and_update_vote_status( } state_data.has_voted.push(vote.address.clone()); - GLOBAL_DB.insert(&key, &state_data).await.unwrap(); + db_insert(&key, &state_data).await.unwrap(); Ok((state_data, key.to_string())) } @@ -112,7 +112,7 @@ async fn handle_vote_error( // Rollback the vote if let Some(pos) = state_data.has_voted.iter().position(|x| x == address) { state_data.has_voted.remove(pos); - GLOBAL_DB.insert(key, state_data).await.unwrap(); + db_insert(key, state_data).await.unwrap(); } HttpResponse::Ok().json(VoteResponse { diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs index 71f97db719..b15d2efd26 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -33,7 +33,7 @@ pub enum IndexerError { pub trait DataStore: Send + Sync + 'static { type Error; async fn insert( - &self, + &mut self, key: &str, value: &T, ) -> Result<(), Self::Error>; @@ -44,13 +44,13 @@ pub trait DataStore: Send + Sync + 'static { } pub struct InMemoryStore { - data: Arc>>>, + data: HashMap>, } impl InMemoryStore { pub fn new() -> Self { Self { - data: Arc::new(RwLock::new(HashMap::new())), + data: HashMap::new(), } } } @@ -60,13 +60,11 @@ impl DataStore for InMemoryStore { type Error = eyre::Error; async fn insert( - &self, + &mut self, key: &str, value: &T, ) -> Result<(), Self::Error> { self.data - .write() - .await .insert(key.to_string(), bincode::serialize(value)?); Ok(()) } @@ -77,8 +75,6 @@ impl DataStore for InMemoryStore { ) -> Result, Self::Error> { Ok(self .data - .read() - .await .get(key) .map(|bytes| bincode::deserialize(bytes)) .transpose()?) From 75e23b147687c7c833377aaceff8f4f4f112eb5a Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Fri, 23 May 2025 14:59:27 +0500 Subject: [PATCH 018/106] Dockerfile for CRISP (#435) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Init Dockerfiles * CRISP build workflow * Update Workflow * Update Workflow * Update Workflow [skip ci] * Skip sol image id [skip ci] * Push to GHCR [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update handler * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Update Workflow [skip ci] * Remove Docker Formatter [skip ci] * Update Dockerfile [skip ci] * Commit Lockfiles [skip ci] * Remove Stubs [skip ci] * Update Dockerfile [skip ci] * Update Dockerfile [skip ci] * Update Dockerfile [skip ci] * Update Dockerfile * Add sleep to allow events from node to settle * Update examples/CRISP/apps/server/src/server/blockchain/handlers.rs * Update Dockerfile [skip ci] * Testing build speed * Cache Cargo git * Add comment [skip ci] * Testing Cache [skip ci] * Fix Env Vars [skip ci] * Testing Cache [skip ci] * Update Dockerfile [skip ci] * Testing Cache [skip ci] * Debugging logs [skip ci] * Remove debug logs --------- Co-authored-by: гλ --- .github/workflows/crisp-docker.yml | 75 ++++++++++++ .github/workflows/ec2-deployment.yml | 2 +- .vscode/settings.json | 11 +- examples/CRISP/apps/program/methods/build.rs | 15 ++- examples/CRISP/apps/server/.dockerignore | 9 ++ examples/CRISP/apps/server/Dockerfile | 107 ++++++++++++++++++ .../server/src/server/blockchain/handlers.rs | 3 +- packages/enclave-sdk/tests/indexer.rs | 2 + 8 files changed, 212 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/crisp-docker.yml create mode 100644 examples/CRISP/apps/server/.dockerignore create mode 100644 examples/CRISP/apps/server/Dockerfile diff --git a/.github/workflows/crisp-docker.yml b/.github/workflows/crisp-docker.yml new file mode 100644 index 0000000000..cc88afca38 --- /dev/null +++ b/.github/workflows/crisp-docker.yml @@ -0,0 +1,75 @@ +name: Build Crisp Server + +on: + workflow_dispatch: + push: + branches: + - release + - main + - hacknet + paths: + - 'examples/CRISP/apps/server/**' + pull_request: + branches: + - release + - main + - hacknet + paths: + - 'examples/CRISP/apps/server/**' + +env: + DOCKERFILE_PATH: examples/CRISP/apps/server/Dockerfile + IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/crisp-server + +permissions: + contents: read + packages: write + +jobs: + build: + name: Build & Push Image + runs-on: ubuntu-latest + outputs: + image_tag: ${{ steps.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + + - name: Generate version tag + id: version + run: | + echo "version=$(date +'%Y%m%d')-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + + - name: Set up BuildKit + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Prepare .dockerignore + run: cp examples/CRISP/apps/server/.dockerignore .dockerignore + + - name: Build image + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE_PATH }} + push: true + tags: | + ${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} + ${{ github.ref == 'refs/heads/release' && format('{0}:latest', env.IMAGE_NAME) || '' }} + build-args: | + SKIP_SOLIDITY=1 + cache-from: | + type=gha,scope=cargo-registry + type=gha,scope=cargo-git + type=gha,scope=cargo-target + type=gha,scope=buildcache + cache-to: | + type=gha,mode=max,scope=cargo-registry + type=gha,mode=max,scope=cargo-git + type=gha,mode=max,scope=cargo-target + type=gha,mode=max,scope=buildcache \ No newline at end of file diff --git a/.github/workflows/ec2-deployment.yml b/.github/workflows/ec2-deployment.yml index 8dd961f7c2..23460feb34 100644 --- a/.github/workflows/ec2-deployment.yml +++ b/.github/workflows/ec2-deployment.yml @@ -27,7 +27,7 @@ permissions: jobs: build: - name: Build Image + name: Build & Push Image runs-on: ubuntu-latest outputs: image_tag: ${{ steps.version.outputs.version }} diff --git a/.vscode/settings.json b/.vscode/settings.json index e731e67341..dcae73898f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,18 +1,23 @@ { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, - "prettier.documentSelectors": ["**/*.sol"], + "prettier.documentSelectors": [ + "**/*.sol" + ], "solidity.formatter": "prettier", "typescript.tsdk": "node_modules/typescript/lib", "rust-analyzer.linkedProjects": [ "packages/ciphernode/Cargo.toml", "packages/compute_provider/Cargo.toml", - "packages/commons/Cargo.toml", + "packages/enclave-sdk/Cargo.toml", "examples/CRISP/apps/program/Cargo.toml", "examples/CRISP/apps/server/Cargo.toml", "examples/CRISP/apps/wasm-crypto/Cargo.toml" ], "[solidity]": { "editor.defaultFormatter": "NomicFoundation.hardhat-solidity" + }, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" } -} +} \ No newline at end of file diff --git a/examples/CRISP/apps/program/methods/build.rs b/examples/CRISP/apps/program/methods/build.rs index b65eeff505..c460987a89 100644 --- a/examples/CRISP/apps/program/methods/build.rs +++ b/examples/CRISP/apps/program/methods/build.rs @@ -40,10 +40,13 @@ fn main() { // Generate Rust source files for the methods crate. let guests = embed_methods_with_options(HashMap::from([("guests", guest_options)])); - // Generate Solidity source files for use with Forge. - let solidity_opts = risc0_build_ethereum::Options::default() - .with_image_id_sol_path(SOLIDITY_IMAGE_ID_PATH) - .with_elf_sol_path(SOLIDITY_ELF_PATH); - - generate_solidity_files(guests.as_slice(), &solidity_opts).unwrap(); + if std::env::var("SKIP_SOLIDITY").unwrap_or_default() != "1" { + // Generate Solidity source files for use with Forge. + let solidity_opts = risc0_build_ethereum::Options::default() + .with_image_id_sol_path(SOLIDITY_IMAGE_ID_PATH) + .with_elf_sol_path(SOLIDITY_ELF_PATH); + generate_solidity_files(guests.as_slice(), &solidity_opts).unwrap(); + } else { + println!("cargo:warning=Skipping solidity codegen (SKIP_SOLIDITY set)"); + } } diff --git a/examples/CRISP/apps/server/.dockerignore b/examples/CRISP/apps/server/.dockerignore new file mode 100644 index 0000000000..b43307271d --- /dev/null +++ b/examples/CRISP/apps/server/.dockerignore @@ -0,0 +1,9 @@ +target +**/target +node_modules +**/node_modules +.git +.DS_Store +**/.DS_Store +**/tests/tmp/ +**/*.log \ No newline at end of file diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile new file mode 100644 index 0000000000..85e3850eb3 --- /dev/null +++ b/examples/CRISP/apps/server/Dockerfile @@ -0,0 +1,107 @@ +############### stage 0: base-dev ############### +ARG RUST_VERSION=1.85.0 +ARG RISC0_VERSION=2.0.0 +ARG SKIP_SOLIDITY=0 + +FROM rust:${RUST_VERSION}-slim-bullseye AS base-dev + +ENV RISC0_HOME=/root/.risc0 +ENV PATH="${RISC0_HOME}/bin:${PATH}" +ENV CARGO_HOME=/usr/local/cargo + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + pkg-config libssl-dev curl ca-certificates && \ + rm -rf /var/lib/apt/lists/* + +RUN curl -sSfL https://risczero.com/install | bash +RUN rzup install rust ${RUST_VERSION} +RUN rzup install r0vm ${RISC0_VERSION} +RUN rzup install cargo-risczero ${RISC0_VERSION} + +RUN cargo install --locked cargo-chef + +################################################# +############### stage 1: chef ################### +FROM base-dev AS chef +WORKDIR /app + +COPY examples/CRISP/apps/server/Cargo.toml examples/CRISP/apps/server/Cargo.lock examples/CRISP/apps/server/ +COPY examples/CRISP/apps/program/Cargo.toml examples/CRISP/apps/program/ +COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/host/ +COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ +COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ +COPY packages/enclave-sdk/Cargo.toml packages/enclave-sdk/ +COPY packages/compute_provider/Cargo.toml packages/compute_provider/ + +WORKDIR /app/examples/CRISP/apps/server +RUN cargo chef prepare --recipe-path recipe.json + +############### stage 2: planner ############### +FROM base-dev AS planner + +ARG SKIP_SOLIDITY +ENV SKIP_SOLIDITY=${SKIP_SOLIDITY} + +WORKDIR /app +COPY --from=chef /app/examples/CRISP/apps/server/recipe.json \ + /app/examples/CRISP/apps/server/recipe.json + +COPY examples/CRISP/apps/server/Cargo.toml examples/CRISP/apps/server/Cargo.lock examples/CRISP/apps/server/ +COPY examples/CRISP/apps/program/Cargo.toml examples/CRISP/apps/program/ +COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/host/ +COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ +COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ +COPY packages/enclave-sdk/Cargo.toml packages/enclave-sdk/ +COPY packages/compute_provider/Cargo.toml packages/compute_provider/ + +RUN set -eux; \ + find \ + examples/CRISP/apps/program \ + packages/enclave-sdk \ + packages/compute_provider \ + -type f -name Cargo.toml ! -path '*/target/*' -print0 \ + | while IFS= read -r -d '' manifest_path; do \ + crate_dir="$(dirname "$manifest_path")"; \ + if [ "$manifest_path" = "examples/CRISP/apps/program/Cargo.toml" ]; then \ + continue; \ + fi; \ + mkdir -p "$crate_dir/src"; \ + if [ ! -f "$crate_dir/src/lib.rs" ] && [ ! -f "$crate_dir/src/main.rs" ]; then \ + echo "// Stub lib.rs for $crate_dir" > "$crate_dir/src/lib.rs"; \ + fi; \ + done + +WORKDIR /app/examples/CRISP/apps/server +RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=cargo-target,target=/app/target,sharing=locked \ + cargo chef cook --release --recipe-path recipe.json + +############### stage 3: builder ############### +FROM base-dev AS builder + +ARG SKIP_SOLIDITY +ENV SKIP_SOLIDITY=${SKIP_SOLIDITY} + +WORKDIR /app + +COPY examples/CRISP/apps/server/ examples/CRISP/apps/server/ +COPY examples/CRISP/apps/program/ examples/CRISP/apps/program/ +COPY packages/enclave-sdk/ packages/enclave-sdk/ +COPY packages/compute_provider/ packages/compute_provider/ + +WORKDIR /app/examples/CRISP/apps/server +RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=cargo-target,target=/app/target,sharing=locked \ + cargo build --release --bin server && \ + mkdir -p /app/dist && cp target/release/server /app/dist/server + +############### stage 4: runtime ############### +FROM gcr.io/distroless/cc-debian12 AS runtime +WORKDIR / + +COPY --from=builder /app/dist/server \ + /usr/local/bin/server +ENTRYPOINT ["/usr/local/bin/server"] \ No newline at end of file diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index 6e441ada6e..60dd7891e6 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -193,9 +193,8 @@ pub async fn handle_plaintext_output_published( } pub async fn handle_committee_published(committee_published: CommitteePublished) -> Result<()> { - info!("Handling CommitteePublished event..."); info!( - "Committee Published for round: {:?}", + "Handling CommitteePublished event for E3: {}", committee_published.e3Id ); diff --git a/packages/enclave-sdk/tests/indexer.rs b/packages/enclave-sdk/tests/indexer.rs index b82c278156..646c992d20 100644 --- a/packages/enclave-sdk/tests/indexer.rs +++ b/packages/enclave-sdk/tests/indexer.rs @@ -106,6 +106,8 @@ async fn test_indexer() -> Result<()> { .watch() .await?; + sleep(Duration::from_millis(10)).await; + let e3 = indexer.get_e3(e3_id).await?; assert_eq!(e3.ciphertext_output, ciphertext_output); From a9721f3f0bc43011b6854b7533c0f41a77db0ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 25 May 2025 20:01:19 +0000 Subject: [PATCH 019/106] Isolate Risc0 (#441) * Add server * Use HTTP to commuicate between server and FHE * Build crisp-program * Fix build issues --- examples/CRISP/apps/program/Cargo.lock | 606 ++++- examples/CRISP/apps/program/Cargo.toml | 7 +- examples/CRISP/apps/program/app/Cargo.toml | 10 +- examples/CRISP/apps/program/app/src/main.rs | 46 +- examples/CRISP/apps/program/client/Cargo.toml | 9 + examples/CRISP/apps/program/client/src/lib.rs | 34 + examples/CRISP/apps/server/Cargo.lock | 2133 ++--------------- examples/CRISP/apps/server/Cargo.toml | 2 +- .../server/src/server/blockchain/handlers.rs | 18 +- .../apps/server/src/server/blockchain/sync.rs | 13 +- examples/CRISP/apps/server/src/server/mod.rs | 12 +- examples/CRISP/scripts/tasks/dev_program.sh | 9 + examples/CRISP/scripts/tasks/dev_server.sh | 3 +- examples/CRISP/scripts/tasks/dev_services.sh | 3 +- examples/CRISP/scripts/tasks/setup.sh | 2 + 15 files changed, 892 insertions(+), 2015 deletions(-) create mode 100644 examples/CRISP/apps/program/client/Cargo.toml create mode 100644 examples/CRISP/apps/program/client/src/lib.rs create mode 100755 examples/CRISP/scripts/tasks/dev_program.sh diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index ffdc743e85..622cb35e89 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -2,6 +2,189 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags 2.9.0", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags 2.9.0", + "brotli", + "bytes", + "bytestring", + "derive_more 2.0.1", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.9.1", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "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.101", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more 2.0.1", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -38,6 +221,21 @@ 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.21" @@ -706,16 +904,62 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -[[package]] -name = "app" -version = "0.1.0" - [[package]] name = "ark-bn254" version = "0.4.0" @@ -1155,6 +1399,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.3.0" @@ -1325,6 +1575,27 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bumpalo" version = "3.17.0" @@ -1372,6 +1643,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + [[package]] name = "c-kzg" version = "1.0.3" @@ -1425,6 +1705,8 @@ version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -1459,6 +1741,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "compute-provider" version = "0.1.0" @@ -1514,6 +1802,17 @@ dependencies = [ "unicode-xid", ] +[[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" @@ -1565,6 +1864,29 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crisp-program" +version = "0.1.0" +dependencies = [ + "actix-web", + "compute-provider", + "env_logger", + "program-client", + "serde", + "serde_json", + "tokio", + "voting-host", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -1970,6 +2292,29 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2114,6 +2459,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2339,6 +2694,44 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2426,6 +2819,17 @@ dependencies = [ "digest 0.10.7", ] +[[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.3.1" @@ -2444,7 +2848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.3.1", ] [[package]] @@ -2455,7 +2859,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", + "http 1.3.1", "http-body", "pin-project-lite", ] @@ -2466,6 +2870,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.6.0" @@ -2475,7 +2885,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", + "h2 0.4.10", + "http 1.3.1", "http-body", "httparse", "itoa", @@ -2492,7 +2903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http", + "http 1.3.1", "hyper", "hyper-util", "rustls", @@ -2528,7 +2939,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", + "http 1.3.1", "http-body", "hyper", "libc", @@ -2685,6 +3096,12 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + [[package]] name = "impl-trait-for-tuples" version = "0.2.3" @@ -2730,6 +3147,12 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -2772,6 +3195,40 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jiff" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.2", + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -2815,6 +3272,12 @@ dependencies = [ "sha3-asm", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "lazy-regex" version = "3.4.1" @@ -2902,6 +3365,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[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.4.12" @@ -3045,6 +3525,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3265,6 +3746,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "openssl" version = "0.10.72" @@ -3453,6 +3940,21 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "postcard" version = "1.1.1" @@ -3585,6 +4087,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "program-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "reqwest", + "serde", +] + [[package]] name = "proptest" version = "1.6.0" @@ -3909,6 +4420,12 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.6.29" @@ -3929,10 +4446,12 @@ checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", - "http", + "h2 0.4.10", + "http 1.3.1", "http-body", "http-body-util", "hyper", @@ -3955,6 +4474,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -4589,6 +5109,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2" version = "0.10.9" @@ -4830,6 +5361,27 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -5269,6 +5821,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "valuable" version = "0.1.1" @@ -5964,3 +6522,31 @@ dependencies = [ "quote", "syn 2.0.101", ] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index f7c56e1c3b..9a6cd2aec7 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["host", "core", "methods", "app"] +members = ["host", "core", "methods", "app", "client"] exclude = ["methods/guests"] [workspace.package] @@ -11,6 +11,7 @@ edition = "2021" voting-host = { path = "./host" } voting-core = { path = "./core" } methods = { path = "./methods" } +program-client = { path = "./client" } alloy-primitives = { version = "0.8", default-features = false, features = [ "rlp", @@ -19,16 +20,20 @@ alloy-primitives = { version = "0.8", default-features = false, features = [ ]} alloy-sol-types = { version = "0.8" } anyhow = { version = "1.0.86" } +actix-web = "4.10.2" bincode = { version = "1.3.3" } bytemuck = { version = "1" } +env_logger = "0.11.5" hex = { version = "0.4.3" } log = { version = "0.4" } +reqwest = { version = "0.12.15", features = ["json"] } risc0-build = { version = "2.0.1", features = ["docker"] } risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } risc0-zkvm = { version = "2.0.0" } risc0-zkp = { version = "2.0.0", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } +serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/examples/CRISP/apps/program/app/Cargo.toml b/examples/CRISP/apps/program/app/Cargo.toml index f0be1d2be7..85b1d8959f 100644 --- a/examples/CRISP/apps/program/app/Cargo.toml +++ b/examples/CRISP/apps/program/app/Cargo.toml @@ -1,6 +1,14 @@ [package] -name = "app" +name = "crisp-program" version.workspace = true edition.workspace = true [dependencies] +actix-web.workspace = true +env_logger.workspace = true +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +compute-provider.workspace = true +voting-host.workspace = true +program-client.workspace = true diff --git a/examples/CRISP/apps/program/app/src/main.rs b/examples/CRISP/apps/program/app/src/main.rs index e7a11a969c..9dd8d7a76f 100644 --- a/examples/CRISP/apps/program/app/src/main.rs +++ b/examples/CRISP/apps/program/app/src/main.rs @@ -1,3 +1,45 @@ -fn main() { - println!("Hello, world!"); +use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result}; +use compute_provider::FHEInputs; +use program_client::{ComputeRequest, ComputeResponse}; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +// Run compute handler +async fn run_compute(req: web::Json) -> Result { + let fhe_inputs = FHEInputs { + params: req.params.clone(), + ciphertexts: req.ciphertext_inputs.clone(), + }; + let (risc0_output, ciphertext) = + tokio::task::spawn_blocking(move || voting_host::run_compute(fhe_inputs)) + .await + .map_err(|e| { + eprintln!("Task spawn error: {:?}", e); + actix_web::error::ErrorInternalServerError("Task execution failed") + })? + .map_err(|e| { + eprintln!("Compute function error: {:?}", e); + actix_web::error::ErrorInternalServerError("Computation failed") + })?; + + let proof: Vec = risc0_output.seal.into(); + let response = ComputeResponse { ciphertext, proof }; + + Ok(HttpResponse::Ok().json(response)) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + env_logger::init(); + let bind_addr = "0.0.0.0:4001"; + let server = HttpServer::new(|| { + App::new() + .wrap(Logger::default()) + .route("/run_compute", web::post().to(run_compute)) + }) + .bind(bind_addr)?; + + println!("'crisp-program' listening on http://{}", bind_addr); + + server.run().await } diff --git a/examples/CRISP/apps/program/client/Cargo.toml b/examples/CRISP/apps/program/client/Cargo.toml new file mode 100644 index 0000000000..2f3ef34799 --- /dev/null +++ b/examples/CRISP/apps/program/client/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "program-client" +version.workspace = true +edition.workspace = true + +[dependencies] +serde.workspace = true +reqwest.workspace = true +anyhow.workspace = true diff --git a/examples/CRISP/apps/program/client/src/lib.rs b/examples/CRISP/apps/program/client/src/lib.rs new file mode 100644 index 0000000000..c8edef8318 --- /dev/null +++ b/examples/CRISP/apps/program/client/src/lib.rs @@ -0,0 +1,34 @@ +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct ComputeRequest { + pub params: Vec, + pub ciphertext_inputs: Vec<(Vec, u64)>, +} + +#[derive(Deserialize, Serialize)] +pub struct ComputeResponse { + pub ciphertext: Vec, + pub proof: Vec, +} + +pub async fn run_compute( + params: Vec, + ciphertext_inputs: Vec<(Vec, u64)>, +) -> Result<(Vec, Vec)> { + let request = ComputeRequest { + params, + ciphertext_inputs, + }; + + let response: ComputeResponse = reqwest::Client::new() + .post("http://127.0.0.1:4001/run_compute") + .json(&request) + .send() + .await? + .json() + .await?; + + Ok((response.proof, response.ciphertext)) +} diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index e9207532cf..43184c1098 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -264,48 +264,26 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-contract 0.8.3", + "alloy-consensus", + "alloy-contract", "alloy-core", - "alloy-eips 0.8.3", - "alloy-genesis 0.8.3", - "alloy-network 0.8.3", + "alloy-eips", + "alloy-genesis", + "alloy-network", "alloy-node-bindings", - "alloy-provider 0.8.3", + "alloy-provider", "alloy-pubsub", - "alloy-rpc-client 0.8.3", - "alloy-rpc-types 0.8.3", - "alloy-serde 0.8.3", - "alloy-signer 0.8.3", - "alloy-signer-local 0.8.3", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", ] -[[package]] -name = "alloy" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-contract 0.12.6", - "alloy-core", - "alloy-eips 0.12.6", - "alloy-genesis 0.12.6", - "alloy-network 0.12.6", - "alloy-provider 0.12.6", - "alloy-rpc-client 0.12.6", - "alloy-rpc-types 0.12.6", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", - "alloy-signer-local 0.12.6", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", -] - [[package]] name = "alloy-chains" version = "0.1.69" @@ -323,10 +301,10 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ - "alloy-eips 0.8.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.8.3", + "alloy-serde", "alloy-trie", "auto_impl", "c-kzg", @@ -335,54 +313,17 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-consensus" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" -dependencies = [ - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.12.6", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 2.0.1", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "serde", - "serde_with", - "thiserror 2.0.12", -] - [[package]] name = "alloy-consensus-any" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] @@ -394,35 +335,14 @@ checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-network 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-network", + "alloy-network-primitives", "alloy-primitives", - "alloy-provider 0.8.3", + "alloy-provider", "alloy-pubsub", - "alloy-rpc-types-eth 0.8.3", - "alloy-sol-types", - "alloy-transport 0.8.3", - "futures", - "futures-util", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-contract" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-provider 0.12.6", - "alloy-rpc-types-eth 0.12.6", + "alloy-rpc-types-eth", "alloy-sol-types", - "alloy-transport 0.12.6", + "alloy-transport", "futures", "futures-util", "thiserror 2.0.12", @@ -458,19 +378,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "alloy-eip2124" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "crc", - "serde", - "thiserror 2.0.12", -] - [[package]] name = "alloy-eip2930" version = "0.1.0" @@ -495,18 +402,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-eip7702" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", - "thiserror 2.0.12", -] - [[package]] name = "alloy-eips" version = "0.8.3" @@ -514,10 +409,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ "alloy-eip2930", - "alloy-eip7702 0.4.2", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.8.3", + "alloy-serde", "c-kzg", "derive_more 1.0.0", "once_cell", @@ -525,27 +420,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "alloy-eips" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702 0.5.1", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.12.6", - "auto_impl", - "c-kzg", - "derive_more 2.0.1", - "either", - "once_cell", - "serde", - "sha2", -] - [[package]] name = "alloy-genesis" version = "0.8.3" @@ -553,20 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" dependencies = [ "alloy-primitives", - "alloy-serde 0.8.3", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-genesis" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" -dependencies = [ - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-trie", "serde", ] @@ -597,36 +458,22 @@ dependencies = [ "tracing", ] -[[package]] -name = "alloy-json-rpc" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27434beae2514d4a2aa90f53832cbdf6f23e4b5e2656d95eaf15f9276e2418b6" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - [[package]] name = "alloy-network" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", "alloy-primitives", - "alloy-rpc-types-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", - "alloy-signer 0.8.3", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", "alloy-sol-types", "async-trait", "auto_impl", @@ -636,55 +483,16 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "alloy-network" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-rpc-types-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", - "alloy-sol-types", - "async-trait", - "auto_impl", - "derive_more 2.0.1", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - [[package]] name = "alloy-network-primitives" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", + "alloy-consensus", + "alloy-eips", "alloy-primitives", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] @@ -694,7 +502,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" dependencies = [ - "alloy-genesis 0.8.3", + "alloy-genesis", "alloy-primitives", "k256", "rand 0.8.5", @@ -718,7 +526,7 @@ dependencies = [ "derive_more 2.0.1", "foldhash", "hashbrown 0.15.3", - "indexmap 2.9.0", + "indexmap", "itoa", "k256", "keccak-asm", @@ -739,21 +547,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" dependencies = [ "alloy-chains", - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", - "alloy-rpc-client 0.8.3", + "alloy-rpc-client", "alloy-rpc-types-anvil", - "alloy-rpc-types-eth 0.8.3", - "alloy-signer 0.8.3", - "alloy-signer-local 0.8.3", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", + "alloy-rpc-types-eth", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "async-stream", @@ -762,7 +570,7 @@ dependencies = [ "dashmap", "futures", "futures-utils-wasm", - "lru 0.12.5", + "lru", "parking_lot 0.12.3", "pin-project", "reqwest", @@ -776,52 +584,15 @@ dependencies = [ "wasmtimer", ] -[[package]] -name = "alloy-provider" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" -dependencies = [ - "alloy-chains", - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-rpc-client 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-sol-types", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru 0.13.0", - "parking_lot 0.12.3", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - [[package]] name = "alloy-pubsub" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" dependencies = [ - "alloy-json-rpc 0.8.3", + "alloy-json-rpc", "alloy-primitives", - "alloy-transport 0.8.3", + "alloy-transport", "bimap", "futures", "serde", @@ -860,11 +631,11 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ - "alloy-json-rpc 0.8.3", + "alloy-json-rpc", "alloy-primitives", "alloy-pubsub", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "futures", @@ -880,31 +651,6 @@ dependencies = [ "wasmtimer", ] -[[package]] -name = "alloy-rpc-client" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" -dependencies = [ - "alloy-json-rpc 0.12.6", - "alloy-primitives", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", - "async-stream", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "tracing-futures", - "url", - "wasmtimer", -] - [[package]] name = "alloy-rpc-types" version = "0.8.3" @@ -913,20 +659,8 @@ checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", + "alloy-rpc-types-eth", + "alloy-serde", "serde", ] @@ -937,8 +671,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", + "alloy-rpc-types-eth", + "alloy-serde", "serde", ] @@ -948,20 +682,9 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" dependencies = [ - "alloy-consensus-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" -dependencies = [ - "alloy-consensus-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", ] [[package]] @@ -970,11 +693,11 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.8.3", + "alloy-serde", "derive_more 1.0.0", "serde", "strum 0.26.3", @@ -986,13 +709,13 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.8.3", + "alloy-serde", "alloy-sol-types", "derive_more 1.0.0", "itertools 0.13.0", @@ -1000,26 +723,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "alloy-rpc-types-eth" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.12.6", - "alloy-sol-types", - "itertools 0.14.0", - "serde", - "serde_json", - "thiserror 2.0.12", -] - [[package]] name = "alloy-serde" version = "0.8.3" @@ -1031,17 +734,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "alloy-serde" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1cd73fc054de6353c7f22ff9b846b0f0f145cd0112da07d4119e41e9959207" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - [[package]] name = "alloy-signer" version = "0.8.3" @@ -1056,47 +748,16 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "alloy-signer" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96fbde54bee943cd94ebacc8a62c50b38c7dfd2552dcd79ff61aea778b1bfcc" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - [[package]] name = "alloy-signer-local" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-network 0.8.3", - "alloy-primitives", - "alloy-signer 0.8.3", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-signer-local" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-network 0.12.6", + "alloy-consensus", + "alloy-network", "alloy-primitives", - "alloy-signer 0.12.6", + "alloy-signer", "async-trait", "k256", "rand 0.8.5", @@ -1126,8 +787,8 @@ dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", - "heck 0.5.0", - "indexmap 2.9.0", + "heck", + "indexmap", "proc-macro-error2", "proc-macro2", "quote", @@ -1145,7 +806,7 @@ dependencies = [ "alloy-json-abi", "const-hex", "dunce", - "heck 0.5.0", + "heck", "macro-string", "proc-macro2", "quote", @@ -1183,7 +844,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" dependencies = [ - "alloy-json-rpc 0.8.3", + "alloy-json-rpc", "base64 0.22.1", "futures-util", "futures-utils-wasm", @@ -1198,50 +859,13 @@ dependencies = [ ] [[package]] -name = "alloy-transport" -version = "0.12.6" +name = "alloy-transport-http" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ - "alloy-json-rpc 0.12.6", - "base64 0.22.1", - "derive_more 2.0.1", - "futures", - "futures-utils-wasm", - "parking_lot 0.12.3", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc 0.8.3", - "alloy-transport 0.8.3", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" -dependencies = [ - "alloy-json-rpc 0.12.6", - "alloy-transport 0.12.6", + "alloy-json-rpc", + "alloy-transport", "reqwest", "serde_json", "tower", @@ -1255,9 +879,9 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" dependencies = [ - "alloy-json-rpc 0.8.3", + "alloy-json-rpc", "alloy-pubsub", - "alloy-transport 0.8.3", + "alloy-transport", "bytes", "futures", "interprocess", @@ -1275,7 +899,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" dependencies = [ "alloy-pubsub", - "alloy-transport 0.8.3", + "alloy-transport", "futures", "http 1.3.1", "rustls", @@ -1379,56 +1003,11 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" dependencies = [ - "ark-ec 0.4.2", + "ark-ec", "ark-ff 0.4.2", "ark-std 0.4.0", ] -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-crypto-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" -dependencies = [ - "ahash", - "ark-crypto-primitives-macros", - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-snark", - "ark-std 0.5.0", - "blake2", - "derivative", - "digest 0.10.7", - "fnv", - "merlin", - "sha2", -] - -[[package]] -name = "ark-crypto-primitives-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "ark-ec" version = "0.4.2" @@ -1436,7 +1015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ "ark-ff 0.4.2", - "ark-poly 0.4.2", + "ark-poly", "ark-serialize 0.4.2", "ark-std 0.4.0", "derivative", @@ -1446,27 +1025,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - [[package]] name = "ark-ff" version = "0.3.0" @@ -1505,26 +1063,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -1545,16 +1083,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.101", -] - [[package]] name = "ark-ff-macros" version = "0.3.0" @@ -1580,34 +1108,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-groth16" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" -dependencies = [ - "ark-crypto-primitives", - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - [[package]] name = "ark-poly" version = "0.4.2" @@ -1621,50 +1121,6 @@ dependencies = [ "hashbrown 0.13.2", ] -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec 0.5.0", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "ark-serialize" version = "0.3.0" @@ -1681,25 +1137,12 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive 0.4.2", + "ark-serialize-derive", "ark-std 0.4.0", "digest 0.10.7", "num-bigint", ] -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] - [[package]] name = "ark-serialize-derive" version = "0.4.2" @@ -1711,29 +1154,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-snark" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" -dependencies = [ - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - [[package]] name = "ark-std" version = "0.3.0" @@ -1754,16 +1174,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - [[package]] name = "arraydeque" version = "0.5.1" @@ -1912,7 +1322,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec 0.6.3", + "bit-vec", ] [[package]] @@ -1921,12 +1331,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "1.3.2" @@ -1954,21 +1358,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -1990,42 +1379,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "bonsai-sdk" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" -dependencies = [ - "duplicate", - "maybe-async", - "reqwest", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "brotli" version = "8.0.1" @@ -2059,26 +1412,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -2118,38 +1451,6 @@ dependencies = [ "serde", ] -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 2.0.12", -] - [[package]] name = "cc" version = "1.2.22" @@ -2167,12 +1468,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.41" @@ -2183,7 +1478,6 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", - "serde", "wasm-bindgen", "windows-link", ] @@ -2216,7 +1510,7 @@ version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.101", @@ -2228,12 +1522,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - [[package]] name = "colorchoice" version = "1.0.3" @@ -2244,7 +1532,7 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" name = "compute-provider" version = "0.1.0" dependencies = [ - "ark-bn254 0.4.0", + "ark-bn254", "ark-ff 0.4.2", "hex", "lean-imt", @@ -2272,7 +1560,7 @@ dependencies = [ "serde", "serde_json", "toml", - "yaml-rust2 0.8.1", + "yaml-rust2", ] [[package]] @@ -2383,17 +1671,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -2403,21 +1680,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" -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.2" @@ -2433,7 +1695,7 @@ version = "0.1.0" dependencies = [ "actix-cors", "actix-web", - "alloy 0.8.3", + "alloy", "alloy-primitives", "alloy-sol-types", "async-trait", @@ -2455,6 +1717,7 @@ dependencies = [ "jwt", "log", "once_cell", + "program-client", "rand 0.8.5", "reqwest", "serde", @@ -2463,7 +1726,6 @@ dependencies = [ "sled", "thiserror 1.0.69", "tokio", - "voting-host", "wasm-bindgen", ] @@ -2520,41 +1782,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.101", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.101", -] - [[package]] name = "dashmap" version = "6.1.0" @@ -2592,7 +1819,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", - "serde", ] [[package]] @@ -2606,37 +1832,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -2714,27 +1909,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -2761,12 +1935,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "docker-generate" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" - [[package]] name = "doctest-file" version = "1.0.0" @@ -2779,28 +1947,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "duplicate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -2811,37 +1963,15 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "serdect", "signature", "spki", ] -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "elf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" [[package]] name = "elliptic-curve" @@ -2858,28 +1988,15 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", - "serdect", "subtle", "zeroize", ] -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - [[package]] name = "enclave-sdk" version = "0.1.0" dependencies = [ - "alloy 0.8.3", + "alloy", "anyhow", "async-trait", "bincode", @@ -2909,26 +2026,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "env_filter" version = "0.1.3" @@ -3024,7 +2121,7 @@ dependencies = [ "ndarray", "num-bigint", "num-traits", - "prost 0.12.6", + "prost", "prost-build", "rand 0.8.5", "rand_chacha 0.3.1", @@ -3047,7 +2144,7 @@ dependencies = [ "num-bigint", "num-bigint-dig", "num-traits", - "prost 0.12.6", + "prost", "prost-build", "rand 0.8.5", "rand_chacha 0.3.1", @@ -3123,28 +2220,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "foreign-types-shared", ] [[package]] @@ -3153,12 +2229,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -3315,10 +2385,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -3328,11 +2396,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", ] [[package]] @@ -3370,7 +2436,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -3389,19 +2455,13 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.13.2" @@ -3442,21 +2502,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -3478,12 +2523,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "hmac" version = "0.12.1" @@ -3585,7 +2624,6 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 0.26.11", ] [[package]] @@ -3734,12 +2772,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.0.3" @@ -3787,29 +2819,12 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - [[package]] name = "indenter" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.9.0" @@ -3884,15 +2899,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.15" @@ -3979,7 +2985,6 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "serdect", "sha2", ] @@ -4008,29 +3013,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" -[[package]] -name = "lazy-regex" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.101", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -4061,23 +3043,13 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", -] - [[package]] name = "light-poseidon" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ - "ark-bn254 0.4.0", + "ark-bn254", "ark-ff 0.4.2", "num-bigint", "thiserror 1.0.69", @@ -4137,21 +3109,6 @@ dependencies = [ "hashbrown 0.15.3", ] -[[package]] -name = "lru" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" -dependencies = [ - "hashbrown 0.15.3", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "macro-string" version = "0.1.4" @@ -4163,24 +3120,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -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 = "matrixmultiply" version = "0.3.10" @@ -4191,60 +3130,12 @@ dependencies = [ "rawpointer", ] -[[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.101", -] - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.1", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "methods" -version = "0.1.0" -dependencies = [ - "hex", - "risc0-build", - "risc0-build-ethereum", - "risc0-zkp", -] - [[package]] name = "mime" version = "0.3.17" @@ -4314,12 +3205,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "no_std_strings" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" - [[package]] name = "nom" version = "7.1.3" @@ -4330,16 +3215,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num" version = "0.4.3" @@ -4480,15 +3355,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "object" version = "0.36.7" @@ -4512,7 +3378,7 @@ checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.9.1", "cfg-if", - "foreign-types 0.3.2", + "foreign-types", "libc", "once_cell", "openssl-macros", @@ -4548,12 +3414,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "ordered-multimap" version = "0.7.3" @@ -4564,12 +3424,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parity-scale-codec" version = "3.7.4" @@ -4716,7 +3570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.9.0", + "indexmap", ] [[package]] @@ -4792,18 +3646,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "postcard" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - [[package]] name = "potential_utf" version = "0.1.2" @@ -4869,30 +3711,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -4924,6 +3742,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "program-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "reqwest", + "serde", +] + [[package]] name = "proptest" version = "1.4.0" @@ -4931,14 +3758,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bit-vec 0.6.3", + "bit-vec", "bitflags 2.9.1", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -4951,17 +3778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.6", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", + "prost-derive", ] [[package]] @@ -4971,14 +3788,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", + "heck", "itertools 0.12.1", "log", "multimap", "once_cell", "petgraph", "prettyplease", - "prost 0.12.6", + "prost", "prost-types", "regex", "syn 2.0.101", @@ -4998,26 +3815,13 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "prost-types" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "prost 0.12.6", + "prost", ] [[package]] @@ -5026,61 +3830,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quinn" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.12", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" -dependencies = [ - "bytes", - "getrandom 0.3.3", - "lru-slab", - "rand 0.9.1", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.40" @@ -5221,17 +3970,6 @@ dependencies = [ "bitflags 2.9.1", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - [[package]] name = "regex" version = "1.11.1" @@ -5240,17 +3978,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[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", + "regex-automata", + "regex-syntax", ] [[package]] @@ -5261,7 +3990,7 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] @@ -5270,12 +3999,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" -[[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.5" @@ -5291,7 +4014,6 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2 0.4.10", @@ -5302,297 +4024,53 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.11", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "risc0-binfmt" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" -dependencies = [ - "anyhow", - "borsh", - "derive_more 2.0.1", - "elf", - "lazy_static", - "postcard", - "risc0-zkp", - "risc0-zkvm-platform", - "semver 1.0.26", - "serde", - "tracing", -] - -[[package]] -name = "risc0-build" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" -dependencies = [ - "anyhow", - "cargo_metadata", - "derive_builder", - "dirs", - "docker-generate", - "hex", - "risc0-binfmt", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rzup", - "semver 1.0.26", - "serde", - "serde_json", - "stability", - "tempfile", -] - -[[package]] -name = "risc0-build-ethereum" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "risc0-build", - "risc0-zkp", - "risc0-zkvm", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt", - "risc0-circuit-recursion", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" -dependencies = [ - "anyhow", - "bit-vec 0.8.0", - "bytemuck", - "derive_more 2.0.1", - "paste", - "risc0-binfmt", - "risc0-core", - "risc0-zkp", - "serde", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core 0.6.4", -] - -[[package]] -name = "risc0-ethereum-contracts" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" -dependencies = [ - "alloy 0.12.6", - "alloy-sol-types", - "anyhow", - "cfg-if", - "risc0-zkvm", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "risc0-groth16" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" -dependencies = [ - "anyhow", - "ark-bn254 0.5.0", - "ark-ec 0.5.0", - "ark-groth16", - "ark-serialize 0.5.0", - "bytemuck", - "hex", - "num-bigint", - "num-traits", - "risc0-binfmt", - "risc0-zkp", - "serde", - "stability", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkp" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" -dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest 0.10.7", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core 0.6.4", - "risc0-core", - "risc0-zkvm-platform", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", "serde", - "sha2", - "stability", - "tracing", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", ] [[package]] -name = "risc0-zkvm" -version = "2.0.2" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "anyhow", - "bincode", - "bonsai-sdk", - "borsh", - "bytemuck", - "bytes", - "derive_more 2.0.1", - "getrandom 0.2.16", - "hex", - "lazy-regex", - "prost 0.13.5", - "risc0-binfmt", - "risc0-build", - "risc0-circuit-keccak", - "risc0-circuit-recursion", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-groth16", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rrs-lib", - "rzup", - "semver 1.0.26", - "serde", - "sha2", - "stability", - "tempfile", - "tracing", + "hmac", + "subtle", ] [[package]] -name = "risc0-zkvm-platform" -version = "2.0.2" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "bytemuck", + "cc", "cfg-if", "getrandom 0.2.16", - "getrandom 0.3.3", - "libm", - "stability", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -5617,16 +4095,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "rrs-lib" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" -dependencies = [ - "downcast-rs", - "paste", -] - [[package]] name = "ruint" version = "1.12.3" @@ -5745,7 +4213,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "web-time", "zeroize", ] @@ -5784,21 +4251,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "rzup" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" -dependencies = [ - "semver 1.0.26", - "serde", - "strum 0.26.3", - "tempfile", - "thiserror 2.0.12", - "toml", - "yaml-rust2 0.9.0", -] - [[package]] name = "schannel" version = "0.1.27" @@ -5835,7 +4287,6 @@ dependencies = [ "der", "generic-array", "pkcs8", - "serdect", "subtle", "zeroize", ] @@ -5877,9 +4328,6 @@ name = "semver" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] [[package]] name = "semver-parser" @@ -5949,46 +4397,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.9.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - [[package]] name = "sha1" version = "0.10.6" @@ -6031,15 +4439,6 @@ dependencies = [ "cfg-if", ] -[[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-words" version = "1.1.0" @@ -6131,16 +4530,6 @@ dependencies = [ "der", ] -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.101", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -6183,7 +4572,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", @@ -6196,7 +4585,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", @@ -6412,21 +4801,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -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.45.0" @@ -6544,7 +4918,7 @@ version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.9.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -6615,57 +4989,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 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 = [ - "futures", - "futures-task", - "pin-project", - "tracing", -] - -[[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-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] [[package]] @@ -6801,40 +5124,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "voting-core" -version = "0.1.0" -dependencies = [ - "compute-provider", - "enclave-sdk", - "fhe", - "fhe-traits", -] - -[[package]] -name = "voting-host" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "anyhow", - "bincode", - "bytemuck", - "compute-provider", - "fhe", - "fhe-traits", - "fhe-util", - "log", - "methods", - "rand 0.8.5", - "risc0-ethereum-contracts", - "risc0-zkvm", - "serde", - "tokio", - "tracing-subscriber 0.3.19", - "voting-core", -] - [[package]] name = "wait-timeout" version = "0.2.1" @@ -6939,19 +5228,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wasmtimer" version = "0.4.1" @@ -6976,16 +5252,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-roots" version = "0.26.11" @@ -7111,15 +5377,6 @@ dependencies = [ "windows-link", ] -[[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" @@ -7138,21 +5395,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[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.6" @@ -7185,12 +5427,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -7203,12 +5439,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" -[[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.6" @@ -7221,12 +5451,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" -[[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.6" @@ -7251,12 +5475,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" -[[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.6" @@ -7269,12 +5487,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" -[[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.6" @@ -7287,12 +5499,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" -[[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.6" @@ -7305,12 +5511,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" -[[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.6" @@ -7383,18 +5583,7 @@ checksum = "8902160c4e6f2fb145dbe9d6760a75e3c9522d8bf796ed7047c85919ac7115f8" dependencies = [ "arraydeque", "encoding_rs", - "hashlink 0.8.4", -] - -[[package]] -name = "yaml-rust2" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink 0.9.1", + "hashlink", ] [[package]] diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index cb2d16771c..7e0657017b 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -39,7 +39,7 @@ sha2 = "0.10.8" # Local dependencies compute-provider = { path = "../../../../packages/compute_provider" } enclave-sdk = { path = "../../../../packages/enclave-sdk" } -voting-host = { path = "../program/host" } +program-client = { path = "../program/client" } # CLI and user interaction dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs index 60dd7891e6..07584dbd23 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs @@ -4,18 +4,17 @@ use super::events::{ }; use crate::server::{ config::CONFIG, - database::{db_get, db_insert, generate_emoji, get_e3, update_e3_status}, + database::{db_insert, generate_emoji, get_e3, update_e3_status}, models::{CurrentRound, E3}, }; use chrono::Utc; use compute_provider::FHEInputs; use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; -use enclave_sdk::indexer::DataStore; use log::info; +use program_client::run_compute; use std::error::Error; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use tokio::time::{sleep_until, Instant}; -use voting_host::run_compute; type Result = std::result::Result>; @@ -104,22 +103,17 @@ pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { }; info!("Starting computation for E3: {}", e3_id); update_e3_status(e3_id, "Computing".to_string()).await?; - // Call Compute Provider in a separate thread + let (risc0_output, ciphertext) = - tokio::task::spawn_blocking(move || run_compute(fhe_inputs).unwrap()) - .await - .unwrap(); + run_compute(fhe_inputs.params, fhe_inputs.ciphertexts).await?; info!("Computation completed for E3: {}", e3_id); info!("RISC0 Output: {:?}", risc0_output); update_e3_status(e3_id, "PublishingCiphertext".to_string()).await?; + // Params will be encoded on chain to create the journal let tx = contract - .publish_ciphertext_output( - e3_activated.e3Id, - ciphertext.into(), - risc0_output.seal.into(), - ) + .publish_ciphertext_output(e3_activated.e3Id, ciphertext.into(), risc0_output.into()) .await?; info!( diff --git a/examples/CRISP/apps/server/src/server/blockchain/sync.rs b/examples/CRISP/apps/server/src/server/blockchain/sync.rs index 0e5fbf2b48..363e0a0d12 100644 --- a/examples/CRISP/apps/server/src/server/blockchain/sync.rs +++ b/examples/CRISP/apps/server/src/server/blockchain/sync.rs @@ -12,12 +12,12 @@ use alloy::{ }; use compute_provider::FHEInputs; use enclave_sdk::evm::contracts::{ - EnclaveContract, EnclaveRead, EnclaveReadOnlyProvider, EnclaveWrite, ReadOnly, ReadWrite, - E3 as ContractE3, + EnclaveContract, EnclaveRead, EnclaveWrite, ReadWrite, E3 as ContractE3, }; use enclave_sdk::indexer::DataStore; use futures::future::join_all; use log::{error, info, warn}; +use program_client::run_compute; use std::{ collections::HashMap, error::Error, @@ -26,7 +26,6 @@ use std::{ time::{Duration, SystemTime, UNIX_EPOCH}, }; use tokio::time::{sleep_until, Instant}; -use voting_host::run_compute; /// Type alias for results with a boxed error. type Result = std::result::Result>; @@ -256,13 +255,11 @@ async fn compute_and_publish_ciphertext( ciphertexts: ciphertext_inputs, }; - let (risc0_output, ciphertext) = - tokio::task::spawn_blocking(move || run_compute(fhe_inputs).unwrap()) - .await - .unwrap(); + let (risc0_output, ciphertext) = run_compute(fhe_inputs.params, fhe_inputs.ciphertexts).await?; + // Params will be encoded on chain to create the journal let tx = contract - .publish_ciphertext_output(e3_id, ciphertext.into(), risc0_output.seal.into()) + .publish_ciphertext_output(e3_id, ciphertext.into(), risc0_output.into()) .await?; info!( diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index 28c134af97..70505a9d99 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -33,8 +33,8 @@ pub async fn start() -> Result<(), Box> { eprintln!("Listener failed: {:?}", e); } }); - - let _ = HttpServer::new(|| { + let bind_addr = "0.0.0.0:4000"; + let server = HttpServer::new(|| { let cors = Cors::default() .allow_any_origin() .allowed_methods(vec!["GET", "POST", "OPTIONS"]) @@ -47,9 +47,11 @@ pub async fn start() -> Result<(), Box> { .wrap(Logger::new(r#"%a "%r" %s %b %T"#)) .configure(routes::setup_routes) }) - .bind("0.0.0.0:4000")? - .run() - .await; + .bind(bind_addr)?; + + println!("'crisp-server' listening on http://{}", bind_addr); + + server.run().await?; Ok(()) } diff --git a/examples/CRISP/scripts/tasks/dev_program.sh b/examples/CRISP/scripts/tasks/dev_program.sh new file mode 100755 index 0000000000..86e576e71a --- /dev/null +++ b/examples/CRISP/scripts/tasks/dev_program.sh @@ -0,0 +1,9 @@ + +#!/usr/bin/env bash + +set -e + +export CARGO_INCREMENTAL=1 +export RISC0_DEV_MODE=1 + +(cd ./apps/program && cargo run --bin crisp-program) diff --git a/examples/CRISP/scripts/tasks/dev_server.sh b/examples/CRISP/scripts/tasks/dev_server.sh index 67929716eb..7007fdf15f 100755 --- a/examples/CRISP/scripts/tasks/dev_server.sh +++ b/examples/CRISP/scripts/tasks/dev_server.sh @@ -1,8 +1,7 @@ #!/usr/bin/env bash -set -euo pipefail +set -e export CARGO_INCREMENTAL=1 -export RISC0_DEV_MODE=1 (cd ./apps/server && cargo run --bin server) diff --git a/examples/CRISP/scripts/tasks/dev_services.sh b/examples/CRISP/scripts/tasks/dev_services.sh index 43385dfad6..882c2d0662 100755 --- a/examples/CRISP/scripts/tasks/dev_services.sh +++ b/examples/CRISP/scripts/tasks/dev_services.sh @@ -4,5 +4,6 @@ set -euo pipefail concurrently -kr \ "./scripts/tasks/dev_cipher.sh" \ + "./scripts/tasks/dev_program.sh" \ "sleep 3 && ./scripts/tasks/dev_server.sh" \ - "./scripts/tasks/dev_client.sh" + "wait-on tcp:4001 && wait-on tcp:4000 && ./scripts/tasks/dev_client.sh" diff --git a/examples/CRISP/scripts/tasks/setup.sh b/examples/CRISP/scripts/tasks/setup.sh index 061e6403d8..6ba8f1ab2f 100755 --- a/examples/CRISP/scripts/tasks/setup.sh +++ b/examples/CRISP/scripts/tasks/setup.sh @@ -13,6 +13,8 @@ echo "evm" (cd /app/packages/evm && pnpm compile) echo "ciphernode" (cd /app/packages/ciphernode && cargo build && cargo install --path ./enclave --force) +echo "program" +(cd ./apps/program && cargo build --bin crisp-program) echo "server" (cd ./apps/server && [[ ! -f .env ]] && cp .env.example .env; cargo build --bin cli && cargo build --bin server) echo "crisp-wasm-crypto" From 42e81f7e4c483770b0df68c7dc5c40a4b95ac776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 26 May 2025 10:51:23 +0000 Subject: [PATCH 020/106] Update readme for program (#442) * Update architecture diagram * Update docs * Update README.md * Update README.md * Update README.md * Update Readme.md --- examples/CRISP/Readme.md | 26 +++------------- examples/CRISP/apps/program/README.md | 45 ++++++++++++++++++--------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/examples/CRISP/Readme.md b/examples/CRISP/Readme.md index 815ad009da..43cb296ab3 100644 --- a/examples/CRISP/Readme.md +++ b/examples/CRISP/Readme.md @@ -9,42 +9,26 @@ CRISP ├── Dockerfile - Dockerfile for a local development environment ├── apps │ ├── client -│ │ ├── libs/wasm/pkg - WebAssembly library package -│ │ ├── public - Static files -│ │ ├── src - React components and source code -│ │ └── [configuration files and README] │ ├── program -│ │ ├── core - Core logic for the RISC Zero zkVM -│ │ ├── host - Host logic for the RISC Zero zkVM -│ │ ├── methods - Guest programs to run on the RISC Zero zkVM │ ├── server -│ │ ├── src -│ │ │ ├── cli - CLI for interacting with the CRISP server -│ │ │ └── server - Server for interacting with the enclave contracts and the client │ └── wasm-crypto ├── contracts - Contracts for the CRISP protocol ├── deploy - Deployment scripts ├── docker-compose.yaml -└── scripts +└── scripts └── tasks - Scripts for tasks to be run inside the docker container ``` ## Docker Development -To start the development environment, run the following command: +There is a Dockerfile for easy local development which has all the tools you need preinstalled. To start the development environment, run the following command: ```sh -pnpm dev:setup -pnpm dev:start +pnpm dev:setup # build the devcontainer +pnpm dev:up # run the services ``` -To stop the development environment, run the following command: - -```sh -pnpm dev:stop -``` - -## Prerequisites +## Prerequisites for running without Docker Before getting started, make sure you have the following tools installed: diff --git a/examples/CRISP/apps/program/README.md b/examples/CRISP/apps/program/README.md index cabe4dcc7a..93be049b45 100644 --- a/examples/CRISP/apps/program/README.md +++ b/examples/CRISP/apps/program/README.md @@ -2,30 +2,45 @@ This module does the following: -- Listens for Enclave `events` from the blockchain -- Manages `risc0` computations -- Persist processed `events` +- Run a local webserver that accepts calls from the client +- Run computations using risc0 -This is the program component for our architecture here. +This is the program component for our overall CRISP architecture: ```mermaid graph TD - subgraph ec2_1["Docker swarm cluster"] - compute_engine["program"]--store completed--> cpdb[(events)] + subgraph frontend["FRONTEND"] + client + end + subgraph ec2_1["BACKEND"] server["server"] --> db db[(DB)] - client --"proofs/get_data"--> server + server --HTTP--> program + end + subgraph thirdparty["3rd PARTY"] + bonsai end - compute_engine ---> bonsai - compute_engine -."listen for events".-> evm - compute_engine -- "publishCiphertextOutput(proof)" ---> evm + client --"HTTP"--> server + program ---> bonsai bonsai["bonsai (risc0)"] - server -. "listen for events" ..-> evm - server --".publishInput()"--> evm - subgraph evm - esol1["Enclave.sol"] - csol1["CRISP.sol"] + + server --"publishInput()"--> evm + subgraph evm["EVM"] + esol1["Enclave Contracts"] + csol1["CRISP Contracts"] end + server -. "WebSocket listener" .-> evm ``` + +# Structure + +This package consists of the following components: + +- **`app`**: The webserver used to accept calls from the client +- **`client`**: A library to used externally in order to make calls to the program +- **`core`**: The FHE program we are trying to run as an universal module (runs in risc0 but also outside of risc0) +- **`host`**: The function that actually runs the FHE program in the risc0 VM +- **`methods/guest`**: The entry point that risc0 uses to load and run the `core` module + From 382d1781e0902cc041b18c0c1150c8c8a36457cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 26 May 2025 11:36:26 +0000 Subject: [PATCH 021/106] Fix some warnings (#443) * Reduce warnings * lint * lint --- packages/ciphernode/config/src/load_config.rs | 2 +- packages/ciphernode/config/src/paths_engine.rs | 2 +- packages/ciphernode/data/src/repository.rs | 2 +- packages/ciphernode/data/src/sled_store.rs | 3 +-- packages/ciphernode/data/src/snapshot.rs | 2 +- packages/ciphernode/enclave_core/src/nodes/nodes.rs | 3 +-- packages/ciphernode/enclave_core/src/nodes/start.rs | 2 +- packages/ciphernode/events/src/eventbus.rs | 4 ++-- packages/ciphernode/events/src/eventbus_factory.rs | 2 +- packages/enclave-sdk/src/indexer/indexer.rs | 4 +--- 10 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/ciphernode/config/src/load_config.rs b/packages/ciphernode/config/src/load_config.rs index 0ae45b7ec7..b4450d1ed6 100644 --- a/packages/ciphernode/config/src/load_config.rs +++ b/packages/ciphernode/config/src/load_config.rs @@ -1,4 +1,4 @@ -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use path_clean::clean; diff --git a/packages/ciphernode/config/src/paths_engine.rs b/packages/ciphernode/config/src/paths_engine.rs index 98857ee669..4d37a4b344 100644 --- a/packages/ciphernode/config/src/paths_engine.rs +++ b/packages/ciphernode/config/src/paths_engine.rs @@ -1,6 +1,6 @@ use path_clean::clean; use serde::{Deserialize, Serialize}; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; #[derive(Debug, Deserialize, Serialize)] pub struct PathsEngine { diff --git a/packages/ciphernode/data/src/repository.rs b/packages/ciphernode/data/src/repository.rs index 8910c73c16..9980b4a270 100644 --- a/packages/ciphernode/data/src/repository.rs +++ b/packages/ciphernode/data/src/repository.rs @@ -1,4 +1,4 @@ -use std::{marker::PhantomData, ops::Deref}; +use std::marker::PhantomData; use anyhow::Result; diff --git a/packages/ciphernode/data/src/sled_store.rs b/packages/ciphernode/data/src/sled_store.rs index 8905ed5eb3..4bf854efc5 100644 --- a/packages/ciphernode/data/src/sled_store.rs +++ b/packages/ciphernode/data/src/sled_store.rs @@ -2,8 +2,7 @@ use crate::{Get, Insert, InsertSync, Remove}; use actix::{Actor, ActorContext, Addr, Handler}; use anyhow::{Context, Result}; use events::{ - get_enclave_event_bus, BusError, EnclaveErrorType, EnclaveEvent, EventBus, EventBusConfig, - Subscribe, + get_enclave_event_bus, BusError, EnclaveErrorType, EnclaveEvent, EventBus, Subscribe, }; use once_cell::sync::Lazy; use sled::Db; diff --git a/packages/ciphernode/data/src/snapshot.rs b/packages/ciphernode/data/src/snapshot.rs index 7608949169..6b0f24cca8 100644 --- a/packages/ciphernode/data/src/snapshot.rs +++ b/packages/ciphernode/data/src/snapshot.rs @@ -2,7 +2,7 @@ use crate::Repository; use anyhow::Result; use async_trait::async_trait; use serde::{de::DeserializeOwned, Serialize}; -use tracing::{error, info, trace}; +use tracing::trace; /// This trait enables the self type to report their state snapshot pub trait Snapshot diff --git a/packages/ciphernode/enclave_core/src/nodes/nodes.rs b/packages/ciphernode/enclave_core/src/nodes/nodes.rs index 77ad7e52d9..54ff8c4bb5 100644 --- a/packages/ciphernode/enclave_core/src/nodes/nodes.rs +++ b/packages/ciphernode/enclave_core/src/nodes/nodes.rs @@ -1,7 +1,6 @@ use anyhow::*; -use reqwest::Client; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, env, process::Stdio, sync::Arc}; +use std::{collections::HashMap, process::Stdio, sync::Arc}; use tokio::{ process::{Child, Command}, sync::Mutex, diff --git a/packages/ciphernode/enclave_core/src/nodes/start.rs b/packages/ciphernode/enclave_core/src/nodes/start.rs index 52f5591789..794fe69feb 100644 --- a/packages/ciphernode/enclave_core/src/nodes/start.rs +++ b/packages/ciphernode/enclave_core/src/nodes/start.rs @@ -1,5 +1,5 @@ use anyhow::*; -use tracing::{error, instrument}; +use tracing::instrument; use super::client; diff --git a/packages/ciphernode/events/src/eventbus.rs b/packages/ciphernode/events/src/eventbus.rs index 2c09a825be..89aaedbdc5 100644 --- a/packages/ciphernode/events/src/eventbus.rs +++ b/packages/ciphernode/events/src/eventbus.rs @@ -1,7 +1,7 @@ use actix::prelude::*; use bloom::{BloomFilter, ASMS}; -use std::collections::{HashMap, HashSet}; -use std::fmt::{Debug, Display}; +use std::collections::HashMap; +use std::fmt::Display; use std::hash::Hash; use std::marker::PhantomData; diff --git a/packages/ciphernode/events/src/eventbus_factory.rs b/packages/ciphernode/events/src/eventbus_factory.rs index 001a6a6623..8a0fb65965 100644 --- a/packages/ciphernode/events/src/eventbus_factory.rs +++ b/packages/ciphernode/events/src/eventbus_factory.rs @@ -4,7 +4,7 @@ use once_cell::sync::Lazy; use std::any::Any; use std::any::TypeId; use std::collections::HashMap; -use std::sync::{Arc, Mutex}; +use std::sync::Mutex; use crate::EnclaveEvent; use crate::ErrorCollector; diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs index b15d2efd26..0951839ef2 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -11,9 +11,7 @@ use tokio::sync::RwLock; use tokio::task::JoinHandle; use crate::evm::{ - contracts::{ - EnclaveContract, EnclaveContractFactory, EnclaveRead, EnclaveReadOnlyProvider, ReadOnly, - }, + contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, events::{CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished}, listener::EventListener, }; From 6b0277ae71934cd07d0b5f783e7d87cd4b797490 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 27 May 2025 14:47:47 +0500 Subject: [PATCH 022/106] fix: Handle Connection Errors and Missing Deploy Block (#445) --- .../src/start/aggregator_start.rs | 2 ++ .../enclave_core/src/start/start.rs | 2 ++ .../evm/src/ciphernode_registry_sol.rs | 4 +++ packages/ciphernode/evm/src/enclave_sol.rs | 2 ++ .../ciphernode/evm/src/enclave_sol_reader.rs | 2 ++ packages/ciphernode/evm/src/event_reader.rs | 27 +++++++++++++++++++ packages/ciphernode/evm/src/helpers.rs | 27 ++++++++++++++++--- packages/ciphernode/evm/tests/evm_reader.rs | 13 ++++++--- 8 files changed, 72 insertions(+), 7 deletions(-) diff --git a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs b/packages/ciphernode/enclave_core/src/start/aggregator_start.rs index f69f21a2a3..59a07c3d30 100644 --- a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs +++ b/packages/ciphernode/enclave_core/src/start/aggregator_start.rs @@ -56,6 +56,7 @@ pub async fn execute( &chain.contracts.enclave.address(), &repositories.enclave_sol_reader(read_provider.get_chain_id()), chain.contracts.enclave.deploy_block(), + chain.rpc_url.clone(), ) .await?; RegistryFilterSol::attach( @@ -70,6 +71,7 @@ pub async fn execute( &chain.contracts.ciphernode_registry.address(), &repositories.ciphernode_registry_reader(read_provider.get_chain_id()), chain.contracts.ciphernode_registry.deploy_block(), + chain.rpc_url.clone(), ) .await?; } diff --git a/packages/ciphernode/enclave_core/src/start/start.rs b/packages/ciphernode/enclave_core/src/start/start.rs index 6a552ef7fb..67cab074fb 100644 --- a/packages/ciphernode/enclave_core/src/start/start.rs +++ b/packages/ciphernode/enclave_core/src/start/start.rs @@ -57,6 +57,7 @@ pub async fn execute( &chain.contracts.enclave.address(), &repositories.enclave_sol_reader(read_provider.get_chain_id()), chain.contracts.enclave.deploy_block(), + chain.rpc_url.clone(), ) .await?; CiphernodeRegistrySol::attach( @@ -65,6 +66,7 @@ pub async fn execute( &chain.contracts.ciphernode_registry.address(), &repositories.ciphernode_registry_reader(read_provider.get_chain_id()), chain.contracts.ciphernode_registry.deploy_block(), + chain.rpc_url.clone(), ) .await?; } diff --git a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs index 16b494604c..cbf885782e 100644 --- a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs +++ b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs @@ -120,6 +120,7 @@ impl CiphernodeRegistrySolReader { contract_address: &str, repository: &Repository, start_block: Option, + rpc_url: String, ) -> Result>> { let addr = EvmEventReader::attach( provider, @@ -128,6 +129,7 @@ impl CiphernodeRegistrySolReader { start_block, &bus.clone().into(), repository, + rpc_url, ) .await?; @@ -146,6 +148,7 @@ impl CiphernodeRegistrySol { contract_address: &str, repository: &Repository, start_block: Option, + rpc_url: String, ) -> Result<()> { CiphernodeRegistrySolReader::attach( bus, @@ -153,6 +156,7 @@ impl CiphernodeRegistrySol { contract_address, repository, start_block, + rpc_url, ) .await?; // TODO: Writer if needed diff --git a/packages/ciphernode/evm/src/enclave_sol.rs b/packages/ciphernode/evm/src/enclave_sol.rs index 5ff322467d..176a8cf994 100644 --- a/packages/ciphernode/evm/src/enclave_sol.rs +++ b/packages/ciphernode/evm/src/enclave_sol.rs @@ -19,6 +19,7 @@ impl EnclaveSol { contract_address: &str, repository: &Repository, start_block: Option, + rpc_url: String, ) -> Result<()> { EnclaveSolReader::attach( bus, @@ -26,6 +27,7 @@ impl EnclaveSol { contract_address, repository, start_block, + rpc_url, ) .await?; EnclaveSolWriter::attach(bus, write_provider, contract_address).await?; diff --git a/packages/ciphernode/evm/src/enclave_sol_reader.rs b/packages/ciphernode/evm/src/enclave_sol_reader.rs index 6e64651639..c2e18be8f0 100644 --- a/packages/ciphernode/evm/src/enclave_sol_reader.rs +++ b/packages/ciphernode/evm/src/enclave_sol_reader.rs @@ -93,6 +93,7 @@ impl EnclaveSolReader { contract_address: &str, repository: &Repository, start_block: Option, + rpc_url: String, ) -> Result>> { let addr = EvmEventReader::attach( provider, @@ -101,6 +102,7 @@ impl EnclaveSolReader { start_block, &bus.clone(), repository, + rpc_url, ) .await?; diff --git a/packages/ciphernode/evm/src/event_reader.rs b/packages/ciphernode/evm/src/event_reader.rs index 86526fa29e..9d64fda84d 100644 --- a/packages/ciphernode/evm/src/event_reader.rs +++ b/packages/ciphernode/evm/src/event_reader.rs @@ -46,6 +46,7 @@ where start_block: Option, bus: Addr>, state: Persistable, + rpc_url: String, } #[derive(Default, serde::Serialize, serde::Deserialize, Clone)] @@ -77,6 +78,8 @@ where bus: Addr>, /// The auto persistable state of the event reader state: Persistable, + /// The RPC URL for the provider + rpc_url: String, } impl EvmEventReader @@ -95,6 +98,7 @@ where start_block: params.start_block, bus: params.bus, state: params.state, + rpc_url: params.rpc_url, } } @@ -105,6 +109,7 @@ where start_block: Option, bus: &Addr>, repository: &Repository, + rpc_url: String, ) -> Result> { let sync_state = repository .clone() @@ -118,6 +123,7 @@ where start_block, bus: bus.clone(), state: sync_state, + rpc_url, }; let addr = EvmEventReader::new(params).start(); @@ -149,6 +155,7 @@ where let contract_address = self.contract_address; let start_block = self.start_block; + let rpc_url = self.rpc_url.clone(); ctx.spawn( async move { stream_from_evm( @@ -159,6 +166,7 @@ where shutdown, start_block, &bus, + rpc_url, ) .await } @@ -176,10 +184,25 @@ async fn stream_from_evm, T: Transport + Clone>( mut shutdown: oneshot::Receiver<()>, start_block: Option, bus: &Addr>, + rpc_url: String, ) { let chain_id = provider.get_chain_id(); let provider = provider.get_provider(); + if start_block.unwrap_or(0) == 0 && !is_local_node(&rpc_url) { + error!( + "Querying from block 0 on a non-local node ({}) without a specific start_block is not allowed.", + rpc_url + ); + bus.err( + EnclaveErrorType::Evm, + anyhow!( + "Misconfiguration: Attempted to query historical events from genesis on a non-local node. Please specify a `start_block` for contract address {contract_address} on chain {chain_id} using rpc {rpc_url}" + ) + ); + return; + } + let historical_filter = Filter::new() .address(contract_address.clone()) .from_block(start_block.unwrap_or(0)); @@ -252,6 +275,10 @@ async fn stream_from_evm, T: Transport + Clone>( info!("Exiting stream loop"); } +fn is_local_node(rpc_url: &str) -> bool { + rpc_url.contains("localhost") || rpc_url.contains("127.0.0.1") +} + impl Handler for EvmEventReader where P: Provider + Clone + 'static, diff --git a/packages/ciphernode/evm/src/helpers.rs b/packages/ciphernode/evm/src/helpers.rs index 5b6d9574c3..22a0b4c878 100644 --- a/packages/ciphernode/evm/src/helpers.rs +++ b/packages/ciphernode/evm/src/helpers.rs @@ -27,7 +27,7 @@ use base64::{engine::general_purpose::STANDARD, Engine}; use config::{RpcAuth, RPC}; use crypto::Cipher; use data::Repository; -use std::{env, marker::PhantomData, sync::Arc}; +use std::{env, io, marker::PhantomData, sync::Arc}; use zeroize::Zeroizing; pub trait AuthConversions { fn to_header_value(&self) -> Option; @@ -79,7 +79,10 @@ where T: Transport + Clone, { pub async fn new(provider: P) -> Result { - let chain_id = provider.get_chain_id().await?; + let chain_id = provider + .get_chain_id() + .await + .map_err(|e| handle_conn_refused(e.into()))?; Ok(Self { provider: Arc::new(provider), chain_id, @@ -127,7 +130,8 @@ impl ProviderConfig { async fn create_ws_provider(&self) -> Result> { Ok(ProviderBuilder::new() .on_ws(self.create_ws_connect()?) - .await? + .await + .map_err(|e| handle_conn_refused(e.into()))? .boxed()) } @@ -158,7 +162,7 @@ impl ProviderConfig { .wallet(wallet) .on_ws(self.create_ws_connect()?) .await - .context("Failed to create WS signer provider")?; + .map_err(|e| handle_conn_refused(e.into()))?; WithChainId::new(provider).await } @@ -228,6 +232,21 @@ pub async fn get_signer_from_repository( Ok(Arc::new(signer)) } +fn handle_conn_refused(err: anyhow::Error) -> anyhow::Error { + if err.chain().any(|cause| { + cause + .downcast_ref::() + .is_some_and(|ioe| ioe.kind() == io::ErrorKind::ConnectionRefused) + }) { + err.context( + "Failed to connect to RPC: connection refused. \ +Please ensure your local node is running and that the RPC URL is correct.", + ) + } else { + err + } +} + #[cfg(test)] mod test { use super::*; diff --git a/packages/ciphernode/evm/tests/evm_reader.rs b/packages/ciphernode/evm/tests/evm_reader.rs index 2e1e7a3863..4255bdffc6 100644 --- a/packages/ciphernode/evm/tests/evm_reader.rs +++ b/packages/ciphernode/evm/tests/evm_reader.rs @@ -46,9 +46,10 @@ async fn evm_reader() -> Result<()> { // Create a WS provider // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; + let rpc_url = anvil.ws_endpoint(); // Get RPC URL let provider = WithChainId::new( ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) + .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; @@ -63,6 +64,7 @@ async fn evm_reader() -> Result<()> { None, &bus, &repository, + rpc_url.clone(), // Pass RPC URL ) .await?; @@ -106,9 +108,10 @@ async fn ensure_historical_events() -> Result<()> { // Create a WS provider // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; + let rpc_url = anvil.ws_endpoint(); // Get RPC URL let provider = WithChainId::new( ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) + .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; @@ -135,6 +138,7 @@ async fn ensure_historical_events() -> Result<()> { None, &bus, &repository, + rpc_url.clone(), // Pass RPC URL ) .await?; @@ -175,9 +179,10 @@ async fn ensure_resume_after_shutdown() -> Result<()> { // Create a WS provider // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; + let rpc_url = anvil.ws_endpoint(); // Get RPC URL let provider = WithChainId::new( ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) + .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; @@ -219,6 +224,7 @@ async fn ensure_resume_after_shutdown() -> Result<()> { None, &bus, &repository, + rpc_url.clone(), // Pass RPC URL ) .await?; @@ -255,6 +261,7 @@ async fn ensure_resume_after_shutdown() -> Result<()> { None, &bus, &repository, + rpc_url.clone(), // Pass RPC URL ) .await?; From b1250c0a0773ef8f7acbea22ff296c55add170c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 27 May 2025 23:08:49 +0000 Subject: [PATCH 023/106] Refactor server (#444) * Merge enclave-sdk updates * Add modify method * Fix linting warnings * Add repo * Tidy up repos * Add to codebase without implementing * --wip-- [skip ci] * --wip-- [skip ci] * Refactor to use indexer * Remove blockchain from mod.rs * Remove unused import * Extract repositories and fix bugs --- .../CRISP/apps/server/src/cli/commands.rs | 6 +- .../server/src/server/blockchain/events.rs | 92 ----- .../server/src/server/blockchain/handlers.rs | 207 ----------- .../server/src/server/blockchain/listener.rs | 162 --------- .../apps/server/src/server/blockchain/mod.rs | 4 - .../apps/server/src/server/blockchain/sync.rs | 320 ------------------ .../CRISP/apps/server/src/server/database.rs | 79 +++-- .../CRISP/apps/server/src/server/indexer.rs | 219 ++++++++++++ examples/CRISP/apps/server/src/server/mod.rs | 20 +- .../CRISP/apps/server/src/server/models.rs | 12 +- examples/CRISP/apps/server/src/server/repo.rs | 234 +++++++++++++ .../apps/server/src/server/routes/rounds.rs | 17 +- .../apps/server/src/server/routes/state.rs | 44 +-- .../apps/server/src/server/routes/voting.rs | 79 ++--- examples/CRISP/scripts/tasks/dev.sh | 1 + examples/CRISP/scripts/tasks/dev_cipher.sh | 4 + .../src/start/aggregator_start.rs | 2 +- packages/enclave-sdk/src/evm/contracts.rs | 10 +- packages/enclave-sdk/src/evm/listener.rs | 15 +- packages/enclave-sdk/src/indexer/indexer.rs | 215 ++++++++---- packages/enclave-sdk/src/indexer/mod.rs | 2 + packages/enclave-sdk/src/indexer/models.rs | 4 +- packages/enclave-sdk/src/indexer/repo.rs | 79 +++++ .../enclave-sdk/tests/fixtures/emit_logs.sol | 5 + packages/enclave-sdk/tests/helpers.rs | 56 +++ packages/enclave-sdk/tests/indexer.rs | 33 +- packages/enclave-sdk/tests/listener.rs | 139 +++++++- 27 files changed, 1056 insertions(+), 1004 deletions(-) delete mode 100644 examples/CRISP/apps/server/src/server/blockchain/events.rs delete mode 100644 examples/CRISP/apps/server/src/server/blockchain/handlers.rs delete mode 100644 examples/CRISP/apps/server/src/server/blockchain/listener.rs delete mode 100644 examples/CRISP/apps/server/src/server/blockchain/mod.rs delete mode 100644 examples/CRISP/apps/server/src/server/blockchain/sync.rs create mode 100644 examples/CRISP/apps/server/src/server/indexer.rs create mode 100644 examples/CRISP/apps/server/src/server/repo.rs create mode 100644 packages/enclave-sdk/src/indexer/repo.rs create mode 100644 packages/enclave-sdk/tests/helpers.rs diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index 9fe603540a..ac3205f49e 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -8,7 +8,7 @@ use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; use crisp::server::config::CONFIG as SERVER_CONFIG; // TODO: unify configuration use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite, ReadOnly}; use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, @@ -124,7 +124,7 @@ pub async fn activate_e3_round() -> Result<(), Box Result<()> { - let event_clone = self.clone(); - tokio::spawn(async move { - if let Err(e) = handle_e3(event_clone).await { - eprintln!("Error handling E3 request: {:?}", e); - } - }); - - Ok(()) - } -} - -impl ContractEvent for InputPublished { - fn process(&self, _log: Log) -> Result<()> { - let event_clone = self.clone(); - tokio::spawn(async move { - if let Err(e) = handle_input_published(event_clone).await { - eprintln!("Error handling input published: {:?}", e); - } - }); - - Ok(()) - } -} - -impl ContractEvent for CiphertextOutputPublished { - fn process(&self, _log: Log) -> Result<()> { - let event_clone = self.clone(); - tokio::spawn(async move { - if let Err(e) = handle_ciphertext_output_published(event_clone).await { - eprintln!("Error handling ciphertext output published: {:?}", e); - } - }); - - Ok(()) - } -} - -impl ContractEvent for PlaintextOutputPublished { - fn process(&self, _log: Log) -> Result<()> { - let event_clone = self.clone(); - - tokio::spawn(async move { - if let Err(e) = handle_plaintext_output_published(event_clone).await { - eprintln!("Error handling public key published: {:?}", e); - } - }); - - Ok(()) - } -} - -impl ContractEvent for CommitteePublished { - fn process(&self, _log: Log) -> Result<()> { - let event_clone = self.clone(); - tokio::spawn(async move { - if let Err(e) = handle_committee_published(event_clone).await { - eprintln!("Error handling committee published: {:?}", e); - } - }); - - Ok(()) - } -} diff --git a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs b/examples/CRISP/apps/server/src/server/blockchain/handlers.rs deleted file mode 100644 index 07584dbd23..0000000000 --- a/examples/CRISP/apps/server/src/server/blockchain/handlers.rs +++ /dev/null @@ -1,207 +0,0 @@ -use super::events::{ - CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, - PlaintextOutputPublished, -}; -use crate::server::{ - config::CONFIG, - database::{db_insert, generate_emoji, get_e3, update_e3_status}, - models::{CurrentRound, E3}, -}; -use chrono::Utc; -use compute_provider::FHEInputs; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; -use log::info; -use program_client::run_compute; -use std::error::Error; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use tokio::time::{sleep_until, Instant}; - -type Result = std::result::Result>; - -pub async fn handle_e3(e3_activated: E3Activated) -> Result<()> { - let e3_id = e3_activated.e3Id.to::(); - info!("Handling E3 request with id {}", e3_id); - - // Fetch E3 from the contract - let contract = EnclaveContract::new( - &CONFIG.http_rpc_url, - &CONFIG.private_key, - &CONFIG.enclave_address, - ) - .await?; - - let e3 = contract.get_e3(e3_activated.e3Id).await?; - info!("Fetched E3 from the contract."); - info!("E3: {:?}", e3); - - let start_time = Utc::now().timestamp() as u64; - let expiration = e3_activated.expiration.to::(); - - let e3_obj = E3 { - // Identifiers - id: e3_id, - chain_id: CONFIG.chain_id, // Hardcoded for testing - enclave_address: CONFIG.enclave_address.clone(), - - // Status-related - status: "Active".to_string(), - has_voted: vec![], - vote_count: 0, - votes_option_1: 0, - votes_option_2: 0, - - // Timing-related - start_time, - block_start: e3.requestBlock.to::(), - duration: e3.duration.to::(), - expiration, - - // Parameters - e3_params: e3.e3ProgramParams.to_vec(), - committee_public_key: e3_activated.committeePublicKey.to_vec(), - - // Outputs - ciphertext_output: vec![], - plaintext_output: vec![], - - // Ciphertext Inputs - ciphertext_inputs: vec![], - - // Emojis - emojis: generate_emoji(), - }; - - // Save E3 to the database - let key = format!("e3:{}", e3_id); - db_insert(&key, &e3_obj).await?; - - // Set Current Round - let current_round = CurrentRound { id: e3_id }; - db_insert("e3:current_round", ¤t_round).await?; - - let expiration = Instant::now() - + (UNIX_EPOCH + Duration::from_secs(expiration)) - .duration_since(SystemTime::now()) - .unwrap_or_else(|_| Duration::ZERO); - - info!("Expiration: {:?}", expiration); - - // Sleep till the E3 expires (instantly if in the past) - sleep_until(expiration).await; - - // Get All Encrypted Votes - let (mut e3, _) = get_e3(e3_id).await.unwrap(); - update_e3_status(e3_id, "Expired".to_string()).await?; - - if e3.vote_count > 0 { - info!("E3 FROM DB"); - info!("Vote Count: {:?}", e3.vote_count); - - let fhe_inputs = FHEInputs { - params: e3.e3_params, - ciphertexts: e3.ciphertext_inputs, - }; - info!("Starting computation for E3: {}", e3_id); - update_e3_status(e3_id, "Computing".to_string()).await?; - - let (risc0_output, ciphertext) = - run_compute(fhe_inputs.params, fhe_inputs.ciphertexts).await?; - - info!("Computation completed for E3: {}", e3_id); - info!("RISC0 Output: {:?}", risc0_output); - update_e3_status(e3_id, "PublishingCiphertext".to_string()).await?; - - // Params will be encoded on chain to create the journal - let tx = contract - .publish_ciphertext_output(e3_activated.e3Id, ciphertext.into(), risc0_output.into()) - .await?; - - info!( - "CiphertextOutputPublished event published with tx: {:?}", - tx.transaction_hash - ); - } else { - info!("E3 has no votes to decrypt. Setting status to Finished."); - e3.status = "Finished".to_string(); - - db_insert(&key, &e3).await?; - } - info!("E3 request handled successfully."); - Ok(()) -} - -pub async fn handle_input_published(input: InputPublished) -> Result<()> { - info!("Handling VoteCast event..."); - - let e3_id = input.e3Id.to::(); - let (mut e3, key) = get_e3(e3_id).await?; - - e3.ciphertext_inputs - .push((input.data.to_vec(), input.index.to::())); - e3.vote_count += 1; - - db_insert(&key, &e3).await?; - - info!("Saved Input with Hash: {:?}", input.inputHash); - Ok(()) -} - -pub async fn handle_ciphertext_output_published( - ciphertext_output: CiphertextOutputPublished, -) -> Result<()> { - info!("Handling CiphertextOutputPublished event..."); - - let e3_id = ciphertext_output.e3Id.to::(); - let (mut e3, key) = get_e3(e3_id).await?; - - e3.ciphertext_output = ciphertext_output.ciphertextOutput.to_vec(); - e3.status = "CiphertextPublished".to_string(); - - db_insert(&key, &e3).await?; - - info!("CiphertextOutputPublished event handled."); - Ok(()) -} - -pub async fn handle_plaintext_output_published( - plaintext_output: PlaintextOutputPublished, -) -> Result<()> { - info!("Handling PlaintextOutputPublished event..."); - let e3_id = plaintext_output.e3Id.to::(); - let (mut e3, key) = get_e3(e3_id).await?; - - let decoded: Vec = bincode::deserialize(&plaintext_output.plaintextOutput.to_vec())?; - e3.plaintext_output = plaintext_output.plaintextOutput.to_vec(); - e3.votes_option_2 = decoded[0]; - e3.votes_option_1 = e3.vote_count - e3.votes_option_2; - e3.status = "Finished".to_string(); - - info!("Vote Count: {:?}", e3.vote_count); - info!("Votes Option 1: {:?}", e3.votes_option_1); - info!("Votes Option 2: {:?}", e3.votes_option_2); - - db_insert(&key, &e3).await?; - - info!("PlaintextOutputPublished event handled."); - Ok(()) -} - -pub async fn handle_committee_published(committee_published: CommitteePublished) -> Result<()> { - info!( - "Handling CommitteePublished event for E3: {}", - committee_published.e3Id - ); - - let contract = EnclaveContract::new( - &CONFIG.http_rpc_url, - &CONFIG.private_key, - &CONFIG.enclave_address, - ) - .await?; - - let tx = contract - .activate(committee_published.e3Id, committee_published.publicKey) - .await?; - info!("E3 activated with tx: {:?}", tx.transaction_hash); - Ok(()) -} diff --git a/examples/CRISP/apps/server/src/server/blockchain/listener.rs b/examples/CRISP/apps/server/src/server/blockchain/listener.rs deleted file mode 100644 index f1ec1881d3..0000000000 --- a/examples/CRISP/apps/server/src/server/blockchain/listener.rs +++ /dev/null @@ -1,162 +0,0 @@ -use alloy::{ - primitives::{Address, B256}, - providers::{Provider, ProviderBuilder, RootProvider}, - rpc::types::{BlockNumberOrTag, Filter, Log}, - sol_types::SolEvent, - transports::BoxTransport, -}; -use eyre::eyre; -use eyre::Result; -use futures::stream::StreamExt; -use log::{error, info}; -use std::collections::HashMap; -use std::sync::Arc; -use std::time::Duration; -use tokio::time::sleep; - -use super::events::{ - CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, - PlaintextOutputPublished, -}; - -pub trait ContractEvent: Send + Sync + 'static { - fn process(&self, log: Log) -> Result<()>; -} - -pub struct EventListener { - provider: Arc>, - filter: Filter, - handlers: HashMap Result> + Send + Sync>>, -} - -impl EventListener { - pub fn new(provider: Arc>, filter: Filter) -> Self { - Self { - provider, - filter, - handlers: HashMap::new(), - } - } - - pub fn add_event_handler(&mut self) - where - E: SolEvent + ContractEvent + 'static, - { - let signature = E::SIGNATURE_HASH; - let handler = Arc::new(move |log: Log| -> Result> { - let event = log.log_decode::()?.inner.data; - Ok(Box::new(event)) - }); - - self.handlers.insert(signature, handler); - } - - pub async fn listen(&self) -> Result<()> { - let mut stream = self - .provider - .subscribe_logs(&self.filter) - .await? - .into_stream(); - while let Some(log) = stream.next().await { - if let Some(topic0) = log.topic0() { - if let Some(decoder) = self.handlers.get(topic0) { - match decoder(log.clone()) { - Ok(event) => { - event.process(log)?; - } - Err(e) => { - println!("Error decoding event 0x{:x}: {:?}", topic0, e); - } - } - } - } - } - - Ok(()) - } -} - -pub struct EnclaveContract { - provider: Arc>, -} - -impl EnclaveContract { - pub async fn new(rpc_url: &str) -> Result { - let provider = ProviderBuilder::new().on_builtin(rpc_url).await?; - Ok(Self { - provider: Arc::new(provider), - }) - } - - pub fn add_listener(&self, contract_address: Address) -> EventListener { - let filter = Filter::new() - .address(contract_address) - .from_block(BlockNumberOrTag::Latest); - - EventListener::new(self.provider.clone(), filter) - } -} - -pub async fn start_listener( - rpc_url: &str, - enclave_address: &str, - registry_address: &str, -) -> Result<()> { - let enclave_address: Address = enclave_address - .parse() - .map_err(|_| eyre!("Failed to parse enclave_address: {}", enclave_address))?; - let registry_address: Address = registry_address - .parse() - .map_err(|_| eyre!("Failed to parse registry_address: {}", registry_address))?; - - loop { - match run_listener(rpc_url, enclave_address, registry_address).await { - Ok(_) => { - info!("Listener finished successfully. Checking for reconnection..."); - } - Err(e) => { - error!( - "Error occurred in listener: {}. Reconnecting after delay...", - e - ); - } - } - sleep(Duration::from_secs(5)).await; - } -} - -// Separate function to encapsulate listener logic -async fn run_listener( - rpc_url: &str, - enclave_address: Address, - registry_address: Address, -) -> Result<()> { - let manager = EnclaveContract::new(rpc_url).await?; - - let mut enclave_listener = manager.add_listener(enclave_address); - enclave_listener.add_event_handler::(); - enclave_listener.add_event_handler::(); - enclave_listener.add_event_handler::(); - enclave_listener.add_event_handler::(); - - let mut registry_listener = manager.add_listener(registry_address); - registry_listener.add_event_handler::(); - - let enclave_handle = tokio::spawn(async move { - match enclave_listener.listen().await { - Ok(_) => info!("Enclave listener finished"), - Err(e) => error!("Error in enclave listener: {}", e), - } - }); - - let registry_handle = tokio::spawn(async move { - match registry_listener.listen().await { - Ok(_) => info!("Registry listener finished"), - Err(e) => error!("Error in registry listener: {}", e), - } - }); - - tokio::try_join!(enclave_handle, registry_handle)?; - - Ok(()) -} diff --git a/examples/CRISP/apps/server/src/server/blockchain/mod.rs b/examples/CRISP/apps/server/src/server/blockchain/mod.rs deleted file mode 100644 index a2cce8ccb0..0000000000 --- a/examples/CRISP/apps/server/src/server/blockchain/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod events; -pub mod handlers; -pub mod listener; -pub mod sync; diff --git a/examples/CRISP/apps/server/src/server/blockchain/sync.rs b/examples/CRISP/apps/server/src/server/blockchain/sync.rs deleted file mode 100644 index 363e0a0d12..0000000000 --- a/examples/CRISP/apps/server/src/server/blockchain/sync.rs +++ /dev/null @@ -1,320 +0,0 @@ -use super::events::InputPublished; -use crate::server::{ - config::CONFIG, - database::{db_get, db_insert, generate_emoji, get_e3, update_e3_status}, - models::{CurrentRound, E3}, -}; -use alloy::{ - primitives::{Address, Bytes, FixedBytes, U256}, - providers::Provider, - rpc::types::{BlockNumberOrTag, Filter, Log}, - sol_types::SolEvent, -}; -use compute_provider::FHEInputs; -use enclave_sdk::evm::contracts::{ - EnclaveContract, EnclaveRead, EnclaveWrite, ReadWrite, E3 as ContractE3, -}; -use enclave_sdk::indexer::DataStore; -use futures::future::join_all; -use log::{error, info, warn}; -use program_client::run_compute; -use std::{ - collections::HashMap, - error::Error, - str::FromStr, - sync::Arc, - time::{Duration, SystemTime, UNIX_EPOCH}, -}; -use tokio::time::{sleep_until, Instant}; - -/// Type alias for results with a boxed error. -type Result = std::result::Result>; -pub async fn sync_server() -> Result<()> { - info!("Starting server synchronization..."); - - let contract = Arc::new( - EnclaveContract::new( - &CONFIG.http_rpc_url, - &CONFIG.private_key, - &CONFIG.enclave_address, - ) - .await?, - ); - - // Retrieve the current round from the database. - let current_round = match db_get::("e3:current_round").await? { - Some(round) => round, - None => { - info!("No current round found in DB. Exiting sync process. Will compute next round."); - return Ok(()); - } - }; - info!("Current round: {}", current_round.id); - - // Fetch the latest E3 from the database and the contract. - let (latest_db_e3, _) = get_e3(current_round.id).await?; - let contract_e3_id = contract.get_e3_id().await?.to::(); - if contract_e3_id == 0 { - warn!("No E3 IDs found in the contract."); - return Ok(()); - } - let latest_contract_e3_id = contract_e3_id - 1; - - // Check if synchronization is needed. - if latest_db_e3.status == "Finished" && latest_db_e3.id == latest_contract_e3_id { - info!("Database is up to date with the contract. No sync needed."); - return Ok(()); - } - - // Identify the last finished E3 in the database. - let last_finished_e3_id = find_last_finished_e3_id(latest_db_e3.id).await?; - info!("Last finished E3 ID: {:?}", last_finished_e3_id); - - // Determine the range of E3 IDs to synchronize. - let start_sync_id = last_finished_e3_id.map_or(0, |id| id + 1); - let sync_ids: Vec = (start_sync_id..=latest_contract_e3_id).collect(); - info!("Syncing E3s: {:?}", sync_ids); - - // Determine the starting block for fetching events. - let from_block = contract - .get_e3(U256::from(start_sync_id)) - .await? - .requestBlock - .to::(); - info!("From block: {}", from_block); - - // Fetch relevant events from the blockchain. - let events = Arc::new(fetch_events(contract.clone(), from_block).await?); - - // Synchronize each E3 concurrently. - join_all(sync_ids.into_iter().map(|e3_id| { - let contract = contract.clone(); - let events = events.clone(); - async move { - if let Err(e) = sync_e3(U256::from(e3_id), contract, events).await { - error!("Failed to sync E3 {}: {:?}", e3_id, e); - } - } - })) - .await; - - // Update the current round in the database. - let new_current_round = CurrentRound { - id: latest_contract_e3_id, - }; - db_insert("e3:current_round", &new_current_round).await?; - - info!("Server synchronization completed."); - Ok(()) -} - -/// Finds the last finished E3 ID in the database. -async fn find_last_finished_e3_id(latest_db_id: u64) -> Result> { - for id in (0..=latest_db_id).rev() { - let (e3, _) = match get_e3(id).await { - Ok(e3) => e3, - Err(_) => continue, - }; - if e3.status == "Finished" { - return Ok(Some(id)); - } - } - Ok(None) -} - -/// Fetches events from the blockchain starting from a specific block. -async fn fetch_events( - contract: Arc>, - from_block: u64, -) -> Result>> { - let filter = Filter::new() - .from_block(BlockNumberOrTag::Number(from_block)) - .to_block(BlockNumberOrTag::Latest) - .address(Address::from_str(&CONFIG.enclave_address)?) - .event(InputPublished::SIGNATURE); - - let logs = contract.provider.get_logs(&filter).await.map_err(|e| { - error!("Error fetching logs: {:?}", e); - e - })?; - - let mut events_by_e3_id = HashMap::new(); - for log in logs { - let input = log.log_decode::()?.data().clone(); - events_by_e3_id - .entry(input.e3Id) - .or_insert_with(Vec::new) - .push(log); - } - - Ok(events_by_e3_id) -} - -/// Synchronizes a single E3. -async fn sync_e3( - e3_id: U256, - contract: Arc>, - published_events: Arc>>, -) -> Result<()> { - let events_clone = published_events.clone(); - let contract_clone = contract.clone(); - let contract_e3 = contract.get_e3(e3_id).await?; - - // Exit early if the E3 is not yet activated. - if contract_e3.committeePublicKey == FixedBytes::<32>::default() { - info!("E3 {} not yet activated", e3_id); - return Ok(()); - } - - let expiration = calculate_expiration(&contract_e3.expiration)?; - let now = Instant::now(); - - if contract_e3.ciphertextOutput == FixedBytes::<32>::default() { - if now >= expiration { - info!("E3 {} expired, computing and publishing ciphertext.", e3_id); - tokio::spawn(async move { - if let Err(e) = - compute_and_publish_ciphertext(e3_id, contract_clone, events_clone).await - { - error!("Error computing and publishing ciphertext: {:?}", e); - } - }); - } else { - info!("E3 {} still active, waiting until expiration", e3_id); - sleep_until(expiration).await; - // After sleeping, re-fetch events - let events = Arc::new( - fetch_events(contract.clone(), contract_e3.requestBlock.to::()).await?, - ); - - tokio::spawn(async move { - if let Err(e) = compute_and_publish_ciphertext(e3_id, contract_clone, events).await - { - error!("Error computing and publishing ciphertext: {:?}", e); - } - }); - } - return Ok(()); - } - - if contract_e3.plaintextOutput == Bytes::default() { - info!("E3 {} waiting for plaintext output", e3_id); - return Ok(()); - } - - // Sync with the database. - let vote_count = published_events - .get(&e3_id) - .map_or(0, |logs| logs.len() as u64); - sync_e3_with_db(e3_id, &contract_e3, vote_count).await?; - - Ok(()) -} - -/// Calculates the expiration time based on the contract's expiration field. -fn calculate_expiration(expiration_secs: &U256) -> Result { - let expiration_duration = UNIX_EPOCH + Duration::from_secs(expiration_secs.to::()); - let duration_since_now = expiration_duration - .duration_since(SystemTime::now()) - .unwrap_or_else(|_| Duration::ZERO); - Ok(Instant::now() + duration_since_now) -} - -/// Computes and publishes the ciphertext output. -async fn compute_and_publish_ciphertext( - e3_id: U256, - contract: Arc>, - events: Arc>>, -) -> Result<()> { - let ciphertext_inputs = events - .get(&e3_id) - .map(|logs| { - logs.iter() - .map(|log| { - let input = log.log_decode::().unwrap().data().clone(); - (input.data.to_vec(), input.index.to::()) - }) - .collect::>() - }) - .unwrap_or_default(); - - if ciphertext_inputs.is_empty() { - info!("No ciphertext inputs found for E3 {}", e3_id); - update_e3_status(e3_id.to::(), "Finished".to_string()).await?; - return Ok(()); - } - - // Update vote count - let mut db_e3 = get_e3(e3_id.to::()).await?.0; - db_e3.vote_count = ciphertext_inputs.len() as u64; - db_insert(&format!("e3:{}", e3_id.to::()), &db_e3).await?; - - let contract_e3 = contract.get_e3(e3_id).await?; - let fhe_inputs = FHEInputs { - params: contract_e3.e3ProgramParams.to_vec(), - ciphertexts: ciphertext_inputs, - }; - - let (risc0_output, ciphertext) = run_compute(fhe_inputs.params, fhe_inputs.ciphertexts).await?; - - // Params will be encoded on chain to create the journal - let tx = contract - .publish_ciphertext_output(e3_id, ciphertext.into(), risc0_output.into()) - .await?; - - info!( - "Ciphertext published for round {}. TxHash: {:?}", - e3_id, tx.transaction_hash - ); - - Ok(()) -} - -/// Synchronizes the E3 data with the database. -async fn sync_e3_with_db(e3_id: U256, contract_e3: &ContractE3, vote_count: u64) -> Result<()> { - let (mut db_e3, key) = match get_e3(e3_id.to::()).await { - Ok(e3) => e3, - Err(_) => { - let new_e3 = E3 { - id: e3_id.to::(), - chain_id: CONFIG.chain_id, - enclave_address: CONFIG.enclave_address.clone(), - status: "Finished".to_string(), - has_voted: vec![], - vote_count, - votes_option_1: 0, - votes_option_2: 0, - start_time: contract_e3.startWindow[0].to::(), - block_start: contract_e3.requestBlock.to::(), - duration: contract_e3.duration.to::(), - expiration: contract_e3.expiration.to::(), - e3_params: contract_e3.e3ProgramParams.to_vec(), - committee_public_key: contract_e3.committeePublicKey.to_vec(), - ciphertext_output: contract_e3.ciphertextOutput.to_vec(), - plaintext_output: contract_e3.plaintextOutput.to_vec(), - ciphertext_inputs: vec![], - emojis: generate_emoji(), - }; - (new_e3, format!("e3:{}", e3_id.to::())) - } - }; - - db_e3.plaintext_output = contract_e3.plaintextOutput.to_vec(); - db_e3.status = "Finished".to_string(); - - // Decode plaintext output to obtain vote counts. - let decoded: Vec = bincode::deserialize(&db_e3.plaintext_output).unwrap_or(vec![0, 0]); - - if decoded.len() >= 2 { - db_e3.votes_option_2 = decoded[0]; - db_e3.votes_option_1 = decoded[1]; - db_e3.vote_count = db_e3.votes_option_1 + db_e3.votes_option_2; - } else { - warn!("Unexpected plaintext output format for E3 {}", e3_id); - } - - db_insert(&key, &db_e3).await?; - info!("E3 {} synced with DB", e3_id); - - Ok(()) -} diff --git a/examples/CRISP/apps/server/src/server/database.rs b/examples/CRISP/apps/server/src/server/database.rs index b493cbb612..c6ddf2d154 100644 --- a/examples/CRISP/apps/server/src/server/database.rs +++ b/examples/CRISP/apps/server/src/server/database.rs @@ -1,6 +1,9 @@ -use super::models::E3; +use super::{ + models::E3, + repo::{CrispE3Repository, CurrentRoundRepository}, +}; use async_trait::async_trait; -use enclave_sdk::indexer::DataStore; +use enclave_sdk::indexer::{DataStore, SharedStore}; use log::error; use once_cell::sync::Lazy; use rand::Rng; @@ -8,7 +11,6 @@ use serde::{de::DeserializeOwned, Serialize}; use sled::Db; use std::{error::Error, str, sync::Arc}; use thiserror::Error; -use tokio::sync::Mutex; use tokio::sync::RwLock; #[derive(Error, Debug)] @@ -54,11 +56,30 @@ impl DataStore for SledDB { Ok(None) } } + + async fn modify(&mut self, key: &str, mut f: F) -> Result, Self::Error> + where + T: Serialize + DeserializeOwned + Send + Sync, + F: FnMut(Option) -> Option + Send, + { + // Edit in place + let result = self.db.update_and_fetch(key, |old_bytes| { + let current_value = old_bytes.and_then(|bytes| serde_json::from_slice(bytes).ok()); + let new_value = f(current_value); + new_value.and_then(|val| serde_json::to_vec(&val).ok()) + })?; + + // Deserialize the final result + result + .map(|bytes| serde_json::from_slice(&bytes)) + .transpose() + .map_err(|e| e.into()) + } } -static GLOBAL_DB: Lazy> = Lazy::new(|| { +pub static GLOBAL_DB: Lazy>> = Lazy::new(|| { let pathdb = std::env::current_dir().unwrap().join("database/server"); - RwLock::new(SledDB::new(pathdb.to_str().unwrap()).unwrap()) + Arc::new(RwLock::new(SledDB::new(pathdb.to_str().unwrap()).unwrap())) }); pub async fn db_insert( @@ -70,32 +91,44 @@ pub async fn db_insert( Ok(()) } -pub async fn db_get( - key: &str, -) -> Result, DatabaseError> { - let db = GLOBAL_DB.read().await; - db.get::(key).await +// pub async fn db_get( +// key: &str, +// ) -> Result, DatabaseError> { +// let db = GLOBAL_DB.read().await; +// db.get::(key).await +// } + +// pub async fn get_e3(e3_id: u64) -> Result<(E3, String), Box> { +// let key = format!("e3:{}", e3_id); +// match db_get::(&key).await? { +// Some(e3) => Ok((e3, key)), +// None => { +// error!("E3 state not found for key: {}", key); +// Err("E3 state not found".into()) +// } +// } +// } + +// XXX: ok this is silly but will be fixed when we don't use static DB +async fn get_shared_store() -> SharedStore { + let store = SharedStore::new(Arc::new(RwLock::new(GLOBAL_DB.read().await.clone()))); + store } -pub async fn get_e3(e3_id: u64) -> Result<(E3, String), Box> { - let key = format!("e3:{}", e3_id); - match db_get::(&key).await? { - Some(e3) => Ok((e3, key)), - None => { - error!("E3 state not found for key: {}", key); - Err("E3 state not found".into()) - } - } +pub async fn get_e3_repo(e3_id: u64) -> CrispE3Repository { + CrispE3Repository::new(get_shared_store().await, e3_id) +} + +pub async fn get_current_round_repo() -> CurrentRoundRepository { + CurrentRoundRepository::new(get_shared_store().await) } pub async fn update_e3_status( e3_id: u64, status: String, ) -> Result<(), Box> { - let key = format!("e3:{}", e3_id); - let mut e3 = db_get::(&key).await?.unwrap(); - e3.status = status; - db_insert(&key, &e3).await?; + let mut repo = get_e3_repo(e3_id).await; + repo.update_status(&status).await?; Ok(()) } diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs new file mode 100644 index 0000000000..0e6dc35cde --- /dev/null +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -0,0 +1,219 @@ +use crate::server::{ + models::CurrentRound, + repo::{CrispE3Repository, CurrentRoundRepository}, +}; +use compute_provider::FHEInputs; +use enclave_sdk::{ + evm::{ + contracts::{EnclaveContract, EnclaveRead, EnclaveWrite, ReadOnly, ReadWrite}, + events::{ + CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, + PlaintextOutputPublished, + }, + listener::EventListener, + }, + indexer::{DataStore, EnclaveIndexer}, +}; +use log::info; +use program_client::run_compute; +use std::error::Error; +use std::sync::Arc; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use tokio::time::{sleep_until, Instant}; + +type Result = std::result::Result>; + +pub async fn register_e3_activated( + mut indexer: EnclaveIndexer, + contract: Arc>, +) -> Result> { + // E3Activated + indexer + .add_event_handler(move |event: E3Activated, store| { + let e3_id = event.e3Id.to::(); + let mut repo = CrispE3Repository::new(store.clone(), e3_id); + let mut current_round_repo = CurrentRoundRepository::new(store); + let expiration = event.expiration.to::(); + let contract = contract.clone(); + info!("Handling E3 request with id {}", e3_id); + async move { + repo.initialize_round().await?; + + current_round_repo + .set_current_round(CurrentRound { id: e3_id }) + .await?; + + // Calculate expiration time to sleep until + let expiration = Instant::now() + + (UNIX_EPOCH + Duration::from_secs(expiration)) + .duration_since(SystemTime::now()) + .unwrap_or_else(|_| Duration::ZERO); + + sleep_until(expiration).await; + + let e3 = repo.get_e3().await?; + repo.update_status("Expired").await?; + + if repo.get_vote_count().await? > 0 { + let fhe_inputs = FHEInputs { + params: e3.e3_params, + ciphertexts: e3.ciphertext_inputs, + }; + + info!("Starting computation for E3: {}", e3_id); + repo.update_status("Computing").await?; + + let (risc0_output, ciphertext) = + run_compute(fhe_inputs.params, fhe_inputs.ciphertexts) + .await + .map_err(|e| eyre::eyre!("Error running compute: {e}"))?; + + info!("Computation completed for E3: {}", e3_id); + info!("RISC0 Output: {:?}", risc0_output); + + repo.update_status("PublishingCiphertext").await?; + + let tx = contract + .clone() + .publish_ciphertext_output( + event.e3Id, + ciphertext.into(), + risc0_output.into(), + ) + .await?; + + info!( + "CiphertextOutputPublished event published with tx: {:?}", + tx.transaction_hash + ); + } else { + info!("E3 has no votes to decrypt. Setting status to Finished."); + repo.update_status("Finished").await?; + } + info!("E3 request handled successfully."); + + Ok(()) + } + }) + .await; + Ok(indexer) +} + +pub async fn register_ciphertext_output_published( + mut indexer: EnclaveIndexer, +) -> Result> { + // CiphertextOutputPublished + indexer + .add_event_handler(move |event: CiphertextOutputPublished, store| { + let e3_id = event.e3Id.to::(); + let mut repo = CrispE3Repository::new(store, e3_id); + async move { + repo.update_status("CiphertextPublished").await?; + Ok(()) + } + }) + .await; + Ok(indexer) +} + +pub async fn register_plaintext_output_published( + mut indexer: EnclaveIndexer, +) -> Result> { + // PlaintextOutputPublished + indexer + .add_event_handler(move |event: PlaintextOutputPublished, store| { + let e3_id = event.e3Id.to::(); + let mut repo = CrispE3Repository::new(store, e3_id); + async move { + info!("CRISP: handling 'PlaintextOutputPublished'"); + // TODO: explain this logic as it is confusing + let decoded: Vec = bincode::deserialize(&event.plaintextOutput.to_vec())?; + let option_2 = decoded[0]; + let total_votes = repo.get_vote_count().await?; + let option_1 = total_votes - option_2; + + info!("Vote Count: {:?}", total_votes); + info!("Votes Option 1: {:?}", option_1); + info!("Votes Option 2: {:?}", option_2); + + repo.set_votes(option_1, option_2).await?; + repo.update_status("Finished").await?; + Ok(()) + } + }) + .await; + Ok(indexer) +} + +pub async fn register_committee_published( + mut listener: EventListener, + contract: Arc>, +) -> Result { + // CommitteePublished + listener + .add_event_handler(move |event: CommitteePublished| { + let contract = contract.clone(); + async move { + // We need to do this to ensure this is idempotent. + // TODO: conserve bandwidth and check for E3AlreadyActivated error instead of + // making two calls to contract + let e3 = contract.get_e3(event.e3Id).await?; + if u64::try_from(e3.expiration)? > 0 { + info!("E3 already activated '{}'", event.e3Id); + return Ok(()); + } + + // If not activated activate + let tx = contract.activate(event.e3Id, event.publicKey).await?; + info!("E3 activated with tx: {:?}", tx.transaction_hash); + Ok(()) + } + }) + .await; + Ok(listener) +} + +pub async fn setup_indexer( + ws_url: &str, + contract_address: &str, + registry_filter_address: &str, + store: impl DataStore, + private_key: &str, +) -> Result<(EnclaveIndexer, EventListener)> { + let indexer = EnclaveIndexer::new(ws_url, contract_address, store).await?; + let contract = Arc::new( + EnclaveContract::::new(&ws_url, &private_key, &contract_address).await?, + ); + let indexer = register_e3_activated(indexer, contract.clone()).await?; + let indexer = register_ciphertext_output_published(indexer).await?; + let indexer = register_plaintext_output_published(indexer).await?; + + let registry_listener = + EventListener::create_contract_listener(&ws_url, registry_filter_address).await?; + let listener = register_committee_published(registry_listener, contract).await?; + Ok((indexer, listener)) +} + +pub async fn start_indexer( + ws_url: &str, + contract_address: &str, + registry_filter_address: &str, + store: impl DataStore, + private_key: &str, +) -> Result<()> { + let (indexer, listener) = setup_indexer( + ws_url, + contract_address, + registry_filter_address, + store, + private_key, + ) + .await?; + indexer.start()?; + tokio::spawn(async move { + if let Err(e) = listener.listen().await { + eprintln!("Error: {}", e); + } + }); + Ok(()) +} diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index 70505a9d99..ccb51d0f0f 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -1,13 +1,13 @@ -pub mod blockchain; pub mod config; mod database; +mod indexer; mod models; +mod repo; mod routes; use actix_cors::Cors; -use actix_web::{middleware::Logger, web, App, HttpServer}; - -use blockchain::listener::start_listener; +use actix_web::{middleware::Logger, App, HttpServer}; +use indexer::start_indexer; use crate::logger::init_logger; use config::CONFIG; @@ -16,23 +16,21 @@ use config::CONFIG; pub async fn start() -> Result<(), Box> { init_logger(); + // New indexer tokio::spawn(async { - if let Err(e) = blockchain::sync::sync_server().await { - eprintln!("Sync server failed: {:?}", e); - } - }); - - tokio::spawn(async { - if let Err(e) = start_listener( + if let Err(e) = start_indexer( &CONFIG.ws_rpc_url, &CONFIG.enclave_address, &CONFIG.ciphernode_registry_address, + database::GLOBAL_DB.read().await.clone(), + &CONFIG.private_key, ) .await { eprintln!("Listener failed: {:?}", e); } }); + let bind_addr = "0.0.0.0:4000"; let server = HttpServer::new(|| { let cors = Cors::default() diff --git a/examples/CRISP/apps/server/src/server/models.rs b/examples/CRISP/apps/server/src/server/models.rs index f4e44a85dd..10367c5f0d 100644 --- a/examples/CRISP/apps/server/src/server/models.rs +++ b/examples/CRISP/apps/server/src/server/models.rs @@ -1,6 +1,4 @@ -use crate::server::database::SledDB; use serde::{Deserialize, Serialize}; -use tokio::sync::RwLock; #[derive(Debug, Deserialize, Serialize)] pub struct JsonResponse { @@ -132,6 +130,16 @@ pub struct E3 { pub emojis: [String; 2], } +#[derive(Debug, Deserialize, Serialize)] +pub struct E3Crisp { + pub emojis: [String; 2], + pub has_voted: Vec, + pub start_time: u64, + pub status: String, + pub votes_option_1: u64, + pub votes_option_2: u64, +} + impl From for WebResultRequest { fn from(e3: E3) -> Self { WebResultRequest { diff --git a/examples/CRISP/apps/server/src/server/repo.rs b/examples/CRISP/apps/server/src/server/repo.rs new file mode 100644 index 0000000000..6bfcefda11 --- /dev/null +++ b/examples/CRISP/apps/server/src/server/repo.rs @@ -0,0 +1,234 @@ +use super::{ + database::generate_emoji, + models::{CurrentRound, E3Crisp, E3StateLite, WebResultRequest}, +}; +use chrono::Utc; +use enclave_sdk::indexer::{models::E3 as EnclaveE3, DataStore, E3Repository, SharedStore}; +use eyre::Result; +use log::info; + +pub struct CurrentRoundRepository { + store: SharedStore, +} + +impl CurrentRoundRepository { + pub fn new(store: SharedStore) -> Self { + Self { store } + } + + pub async fn set_current_round(&mut self, value: CurrentRound) -> Result<()> { + let key = self.current_round_key(); + self.store + .insert(&key, &value) + .await + .map_err(|_| eyre::eyre!("Could not set current_round for '{key}'"))?; + Ok(()) + } + + pub async fn get_current_round(&self) -> Result> { + let key = self.current_round_key(); + let round = self + .store + .get::(&key) + .await + .map_err(|_| eyre::eyre!("Could get e3 at '{key}'"))?; + Ok(round) + } + + pub async fn get_current_round_id(&self) -> Result { + let round = self + .get_current_round() + .await? + .ok_or(eyre::eyre!("No current round has been saved"))?; + + Ok(round.id) + } + + fn current_round_key(&self) -> String { + format!("_e3:current_round") + } +} + +pub struct CrispE3Repository { + store: SharedStore, + e3_id: u64, +} + +impl CrispE3Repository { + pub fn new(store: SharedStore, e3_id: u64) -> Self { + Self { store, e3_id } + } + + async fn set_crisp(&mut self, value: E3Crisp) -> Result<()> { + let key = self.crisp_key(); + self.store + .insert(&key, &value) + .await + .map_err(|_| eyre::eyre!("Could not store crisp at '{key}'"))?; + Ok(()) + } + + async fn get_crisp(&self) -> Result { + let key = self.crisp_key(); + let e3_crisp = self + .store + .get::(&key) + .await + .map_err(|e| eyre::eyre!("Could get crisp at '{key}' due to error: {e}"))? + .ok_or(eyre::eyre!("No data found at {key}"))?; + Ok(e3_crisp) + } + + pub async fn initialize_round(&mut self) -> Result<()> { + let start_time = Utc::now().timestamp() as u64; + + self.set_crisp(E3Crisp { + has_voted: vec![], + start_time, + status: "Active".to_string(), + votes_option_1: 0, + votes_option_2: 0, + emojis: generate_emoji(), + }) + .await + } + + fn get_e3_repo(&self) -> E3Repository { + E3Repository::new(self.store.clone(), self.e3_id) + } + + pub async fn get_e3(&self) -> Result { + let e3 = self.get_e3_repo().get_e3().await?; + Ok(e3) + } + + pub async fn get_vote_count(&self) -> Result { + let e3 = self.get_e3().await?; + Ok(u64::try_from(e3.ciphertext_inputs.len())?) + } + + pub async fn update_status(&mut self, value: &str) -> Result<()> { + let key = self.crisp_key(); + + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.status = value.to_string(); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not update status for '{key}'"))?; + Ok(()) + } + + pub async fn set_votes(&mut self, option_1: u64, option_2: u64) -> Result<()> { + info!("set_votes(option_1:{} option_2:{})", option_1, option_2); + let key = self.crisp_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.votes_option_1 = option_1; + e.votes_option_2 = option_2; + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not append ciphertext_input for '{key}'"))?; + Ok(()) + } + + pub async fn get_ciphertext_output(&self) -> Result> { + let e3 = self.get_e3().await?; + Ok(e3.ciphertext_output) + } + + pub async fn get_committee_public_key(&self) -> Result> { + let e3 = self.get_e3().await?; + Ok(e3.committee_public_key) + } + + pub async fn get_web_result_request(&self) -> Result { + let e3 = self.get_e3().await?; + let e3_crisp = self.get_crisp().await?; + Ok(WebResultRequest { + round_id: e3.id, + option_1_tally: e3_crisp.votes_option_1, + option_2_tally: e3_crisp.votes_option_2, + total_votes: e3_crisp.votes_option_1 + e3_crisp.votes_option_2, + option_1_emoji: e3_crisp.emojis[0].clone(), + option_2_emoji: e3_crisp.emojis[1].clone(), + end_time: e3.expiration, + }) + } + + pub async fn get_e3_state_lite(&self) -> Result { + let e3 = self.get_e3().await?; + let e3_crisp = self.get_crisp().await?; + Ok(E3StateLite { + emojis: e3_crisp.emojis, + expiration: e3.expiration, + id: self.e3_id, + status: e3_crisp.status, + chain_id: e3.chain_id, + duration: e3.duration, + vote_count: u64::try_from(e3.ciphertext_inputs.len())?, + start_time: e3_crisp.start_time, + start_block: e3.request_block, + enclave_address: e3.enclave_address, + committee_public_key: e3.committee_public_key, + }) + } + + pub async fn set_ciphertext_output(&mut self, data: Vec) -> Result<()> { + self.get_e3_repo().set_ciphertext_output(data).await?; + Ok(()) + } + + pub async fn has_voted(&self, address: String) -> Result { + let e3_crisp = self.get_crisp().await?; + Ok(e3_crisp.has_voted.contains(&address)) + } + + pub async fn insert_voter_address(&mut self, address: String) -> Result<()> { + let key = self.crisp_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.has_voted.push(address.clone()); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not insert address on '{key}'"))?; + Ok(()) + } + + pub async fn remove_voter_address(&mut self, address: &str) -> Result<()> { + let key = self.crisp_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.has_voted = e + .has_voted + .into_iter() + .filter(|item| item != address) + .collect(); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not remove address {address}"))?; + Ok(()) + } + + pub async fn is_finished(&self) -> Result { + let e3 = self.get_crisp().await?; + Ok(e3.status == "Finished") + } + + fn crisp_key(&self) -> String { + let e3_id = self.e3_id; + format!("_e3:crisp:{e3_id}") + } +} diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 52e54bbc02..8061ac5117 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -1,14 +1,13 @@ use crate::server::config::CONFIG; -use crate::server::database::{db_get, get_e3}; +use crate::server::database::{get_current_round_repo, get_e3_repo}; use crate::server::models::{ - CTRequest, ComputeProviderParams, CronRequestE3, CurrentRound, JsonResponse, PKRequest, + CTRequest, ComputeProviderParams, CronRequestE3, JsonResponse, PKRequest, }; use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; -use enclave_sdk::indexer::DataStore; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { @@ -53,7 +52,8 @@ async fn request_new_round(data: web::Json) -> impl Responder { /// /// * A JSON response containing the current round async fn get_current_round() -> impl Responder { - match db_get::("e3:current_round").await { + let repo = get_current_round_repo().await; + match repo.get_current_round().await { Ok(Some(current_round)) => HttpResponse::Ok().json(current_round), Ok(None) => HttpResponse::NotFound().json(JsonResponse { response: "No current round found".to_string(), @@ -75,10 +75,9 @@ async fn get_current_round() -> impl Responder { /// * A JSON response containing the ciphertext async fn get_ciphertext(data: web::Json) -> impl Responder { let mut incoming = data.into_inner(); + let repo = get_e3_repo(incoming.round_id).await; - let (state_data, _) = get_e3(incoming.round_id).await.unwrap(); - - incoming.ct_bytes = state_data.ciphertext_output; + incoming.ct_bytes = repo.get_ciphertext_output().await.unwrap(); HttpResponse::Ok().json(incoming) } @@ -95,9 +94,9 @@ async fn get_ciphertext(data: web::Json) -> impl Responder { async fn get_public_key(data: web::Json) -> impl Responder { let mut incoming = data.into_inner(); - let (state_data, _) = get_e3(incoming.round_id).await.unwrap(); + let repo = get_e3_repo(incoming.round_id).await; - incoming.pk_bytes = state_data.committee_public_key; + incoming.pk_bytes = repo.get_committee_public_key().await.unwrap(); HttpResponse::Ok().json(incoming) } diff --git a/examples/CRISP/apps/server/src/server/routes/state.rs b/examples/CRISP/apps/server/src/server/routes/state.rs index a75b12ee1e..764012297d 100644 --- a/examples/CRISP/apps/server/src/server/routes/state.rs +++ b/examples/CRISP/apps/server/src/server/routes/state.rs @@ -1,9 +1,7 @@ -use crate::server::database::{db_get, get_e3}; -use crate::server::models::{CurrentRound, E3StateLite, GetRoundRequest, WebResultRequest}; +use crate::server::database::{get_current_round_repo, get_e3_repo}; +use crate::server::models::GetRoundRequest; use actix_web::{web, HttpResponse, Responder}; -use enclave_sdk::evm::contracts::{EnclaveRead, EnclaveWrite}; -use enclave_sdk::indexer::DataStore; -use log::info; +use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { config.service( @@ -24,14 +22,11 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { /// async fn get_round_result(data: web::Json) -> impl Responder { let incoming = data.into_inner(); - - match get_e3(incoming.round_id).await { - Ok((state, _)) => { - let response: WebResultRequest = state.into(); - HttpResponse::Ok().json(response) - } + let repo = get_e3_repo(incoming.round_id).await; + match repo.get_web_result_request().await { + Ok(response) => HttpResponse::Ok().json(response), Err(e) => { - info!("Error getting E3 state: {:?}", e); + error!("Error getting E3 state: {:?}", e); HttpResponse::InternalServerError().body("Failed to get E3 state") } } @@ -43,8 +38,9 @@ async fn get_round_result(data: web::Json) -> impl Responder { /// /// * A JSON response containing the results for all rounds async fn get_all_round_results() -> impl Responder { - let round_count = match db_get::("e3:current_round").await { - Ok(count) => count.unwrap().id, + let repo = get_current_round_repo().await; + let round_count = match repo.get_current_round_id().await { + Ok(count) => count, Err(e) => { info!("Error retrieving round count: {:?}", e); return HttpResponse::InternalServerError().body("Failed to retrieve round count"); @@ -52,12 +48,11 @@ async fn get_all_round_results() -> impl Responder { }; let mut states = Vec::new(); + // FIXME: This assumes ids are ordered for i in 0..round_count + 1 { - match get_e3(i).await { - Ok((state, _key)) => { - let web_result: WebResultRequest = state.into(); - states.push(web_result); - } + let repo = get_e3_repo(i).await; + match repo.get_web_result_request().await { + Ok(w) => states.push(w), Err(e) => { info!("Error retrieving state for round {}: {:?}", i, e); continue; @@ -78,12 +73,9 @@ async fn get_all_round_results() -> impl Responder { /// async fn get_round_state_lite(data: web::Json) -> impl Responder { let incoming = data.into_inner(); - - match get_e3(incoming.round_id as u64).await { - Ok((state, _)) => { - let state_lite: E3StateLite = state.into(); - HttpResponse::Ok().json(state_lite) - } - Err(_e) => HttpResponse::InternalServerError().body("Failed to get E3 state"), + let repo = get_e3_repo(incoming.round_id).await; + match repo.get_e3_state_lite().await { + Ok(state_lite) => HttpResponse::Ok().json(state_lite), + Err(_) => HttpResponse::InternalServerError().body("Failed to get E3 state"), } } diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index 0f13e039a7..b7456f808f 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -1,17 +1,16 @@ use crate::server::{ config::CONFIG, - database::{db_get, db_insert, get_e3}, - models::{EncryptedVote, VoteResponse, VoteResponseStatus, E3}, + database::get_e3_repo, + models::{EncryptedVote, VoteResponse, VoteResponseStatus}, }; use actix_web::{web, HttpResponse, Responder}; use alloy::{ dyn_abi::DynSolValue, primitives::{Bytes, U256}, }; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; -use enclave_sdk::indexer::DataStore; +use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveWrite}; use eyre::Error; -use log::info; +use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { config.service( @@ -30,13 +29,30 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { /// * A JSON response indicating the success or failure of the operation async fn broadcast_encrypted_vote(data: web::Json) -> impl Responder { let vote = data.into_inner(); + let mut repo = get_e3_repo(vote.round_id).await; // Validate and update vote status - let (mut state_data, key) = match validate_and_update_vote_status(&vote).await { - Ok(result) => result, - Err(response) => return response, + let has_voted = match repo.has_voted(vote.address.clone()).await { + Ok(voted) => voted, + Err(e) => { + log::error!("Database error checking vote status: {:?}", e); + return HttpResponse::InternalServerError().json("Internal server error"); + } }; + if has_voted { + return HttpResponse::Ok().json(VoteResponse { + status: VoteResponseStatus::UserAlreadyVoted, + tx_hash: None, + message: Some("User Has Already Voted".to_string()), + }); + } + + if let Err(e) = repo.insert_voter_address(vote.address.clone()).await { + log::error!("Database error inserting voter: {:?}", e); + return HttpResponse::InternalServerError().json("Internal server error"); + } + // Prepare vote data for blockchain let e3_id = U256::from(vote.round_id); let params_value = DynSolValue::Tuple(vec![ @@ -61,38 +77,10 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon tx_hash: Some(hash.transaction_hash.to_string()), message: Some("Vote Successful".to_string()), }), - Err(e) => handle_vote_error(e, &mut state_data, &key, &vote.address).await, + Err(e) => handle_vote_error(e, vote.round_id, &vote.address).await, } } -/// Validate and update the vote status -/// -/// # Arguments -/// -/// * `vote` - The vote data to be validated and updated -/// -/// # Returns -/// -/// * A tuple containing the state data and the key -async fn validate_and_update_vote_status( - vote: &EncryptedVote, -) -> Result<(E3, String), HttpResponse> { - let (mut state_data, key) = get_e3(vote.round_id).await.unwrap(); - - if state_data.has_voted.contains(&vote.address) { - return Err(HttpResponse::Ok().json(VoteResponse { - status: VoteResponseStatus::UserAlreadyVoted, - tx_hash: None, - message: Some("User Has Already Voted".to_string()), - })); - } - - state_data.has_voted.push(vote.address.clone()); - db_insert(&key, &state_data).await.unwrap(); - - Ok((state_data, key.to_string())) -} - /// Handle the vote error /// /// # Arguments @@ -101,19 +89,16 @@ async fn validate_and_update_vote_status( /// * `state_data` - The state data to be rolled back /// * `key` - The key for the state data /// * `address` - The address for the vote -async fn handle_vote_error( - e: Error, - state_data: &mut E3, - key: &str, - address: &str, -) -> HttpResponse { +async fn handle_vote_error(e: Error, e3_id: u64, address: &str) -> HttpResponse { info!("Error while sending vote transaction: {:?}", e); // Rollback the vote - if let Some(pos) = state_data.has_voted.iter().position(|x| x == address) { - state_data.has_voted.remove(pos); - db_insert(key, state_data).await.unwrap(); - } + let mut repo = get_e3_repo(e3_id).await; + + match repo.remove_voter_address(address).await { + Ok(_) => (), + Err(err) => error!("Error rolling back the vote: {err}"), + }; HttpResponse::Ok().json(VoteResponse { status: VoteResponseStatus::FailedBroadcast, diff --git a/examples/CRISP/scripts/tasks/dev.sh b/examples/CRISP/scripts/tasks/dev.sh index d6ea53d614..3c22a72aca 100755 --- a/examples/CRISP/scripts/tasks/dev.sh +++ b/examples/CRISP/scripts/tasks/dev.sh @@ -33,6 +33,7 @@ trap cleanup INT TERM (cd /app && pnpm install --frozen-lockfile) + concurrently \ -ks first \ --names "ANVIL,DEPLOY,NODES" \ diff --git a/examples/CRISP/scripts/tasks/dev_cipher.sh b/examples/CRISP/scripts/tasks/dev_cipher.sh index 4207ec8f1d..42ae4f6ab9 100755 --- a/examples/CRISP/scripts/tasks/dev_cipher.sh +++ b/examples/CRISP/scripts/tasks/dev_cipher.sh @@ -2,6 +2,9 @@ set -euo pipefail +# nuke past installations as we are adding these nodes to the contract +rm -rf /app/examples/CRISP/.enclave/* + PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" enclave wallet set --name ag --private-key "$PRIVATE_KEY" @@ -17,6 +20,7 @@ CN3=$(cat enclave.config.yaml | yq '.nodes.cn3.address') cd /app + # Add ciphernodes using variables from config.sh pnpm ciphernode:add --ciphernode-address "$CN1" --network "localhost" pnpm ciphernode:add --ciphernode-address "$CN2" --network "localhost" diff --git a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs b/packages/ciphernode/enclave_core/src/start/aggregator_start.rs index 59a07c3d30..679d7888e3 100644 --- a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs +++ b/packages/ciphernode/enclave_core/src/start/aggregator_start.rs @@ -1,4 +1,4 @@ -use actix::{Actor, Addr}; +use actix::Addr; use aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; use anyhow::Result; use config::AppConfig; diff --git a/packages/enclave-sdk/src/evm/contracts.rs b/packages/enclave-sdk/src/evm/contracts.rs index 7fe050be0d..f1ab6d4936 100644 --- a/packages/enclave-sdk/src/evm/contracts.rs +++ b/packages/enclave-sdk/src/evm/contracts.rs @@ -151,15 +151,23 @@ impl EnclaveContract { ) -> Result> { EnclaveContractFactory::create_write(http_rpc_url, contract_address, private_key).await } + + pub fn get_provider(&self) -> Arc { + self.provider.clone() + } } impl EnclaveContract { - pub async fn create_read( + pub async fn read_only( http_rpc_url: &str, contract_address: &str, ) -> Result> { EnclaveContractFactory::create_read(http_rpc_url, contract_address).await } + + pub fn get_provider(&self) -> Arc { + self.provider.clone() + } } /// Type alias for read-only provider diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/enclave-sdk/src/evm/listener.rs index 6a16c3ef36..dfca0cc4b1 100644 --- a/packages/enclave-sdk/src/evm/listener.rs +++ b/packages/enclave-sdk/src/evm/listener.rs @@ -63,14 +63,19 @@ impl EventListener { .subscribe_logs(&self.filter) .await? .into_stream(); - while let Some(log) = stream.next().await { if let Some(topic0) = log.topic0() { - if let Some(handlers) = self.handlers.clone().read().await.get(topic0) { + let topic_val = *topic0; + if let Some(handlers) = self.handlers.read().await.get(topic0) { for handler in handlers { - if let Err(e) = handler(&log).await { - eprintln!("Error processing event 0x{:x}: {:?}", topic0, e); - } + let log_clone = log.clone(); + let fut = handler(&log_clone); + tokio::spawn(async move { + // Spawn the future so that the handlers are processed concurrently + if let Err(e) = fut.await { + eprintln!("Error processing event 0x{:x}: {:?}", topic_val, e); + } + }); } } } diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs index 0951839ef2..9629be6e61 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -1,21 +1,27 @@ use super::models::E3; +use crate::{ + evm::{ + contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, + events::{ + CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished, + }, + listener::EventListener, + }, + indexer::E3Repository, +}; use alloy::primitives::Uint; use alloy::providers::Provider; +use alloy::sol_types::SolEvent; use async_trait::async_trait; use eyre::eyre; use eyre::Result; use serde::{de::DeserializeOwned, Serialize}; use std::{collections::HashMap, sync::Arc}; +use std::{fmt::Display, future::Future}; use thiserror::Error; use tokio::sync::RwLock; use tokio::task::JoinHandle; -use crate::evm::{ - contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, - events::{CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished}, - listener::EventListener, -}; - type E3Id = u64; #[derive(Error, Debug)] @@ -29,7 +35,7 @@ pub enum IndexerError { /// Trait for injectable DataStore. Note the implementor must manage interior mutability #[async_trait] pub trait DataStore: Send + Sync + 'static { - type Error; + type Error: Display; async fn insert( &mut self, key: &str, @@ -39,6 +45,10 @@ pub trait DataStore: Send + Sync + 'static { &self, key: &str, ) -> Result, Self::Error>; + async fn modify(&mut self, key: &str, f: F) -> Result, Self::Error> + where + T: Serialize + DeserializeOwned + Send + Sync, + F: FnMut(Option) -> Option + Send; } pub struct InMemoryStore { @@ -77,19 +87,87 @@ impl DataStore for InMemoryStore { .map(|bytes| bincode::deserialize(bytes)) .transpose()?) } + + async fn modify(&mut self, key: &str, mut f: F) -> Result, Self::Error> + where + T: Serialize + DeserializeOwned + Send + Sync, + F: FnMut(Option) -> Option + Send, + { + let current = self + .data + .get(key) + .and_then(|bytes| bincode::deserialize(bytes).ok()); + + match f(current) { + Some(new_value) => { + self.data + .insert(key.to_string(), bincode::serialize(&new_value)?); + Ok(Some(new_value)) + } + None => { + self.data.remove(key); + Ok(None) + } + } + } +} + +pub struct SharedStore { + inner: Arc>, +} + +impl Clone for SharedStore { + fn clone(&self) -> Self { + SharedStore { + inner: Arc::clone(&self.inner), + } + } +} + +impl SharedStore { + pub fn new(inner: Arc>) -> SharedStore { + Self { inner } + } +} + +#[async_trait] +impl DataStore for SharedStore { + type Error = S::Error; + async fn insert( + &mut self, + key: &str, + value: &T, + ) -> Result<(), Self::Error> { + self.inner.write().await.insert(key, value).await + } + + async fn get( + &self, + key: &str, + ) -> Result, Self::Error> { + self.inner.read().await.get(key).await + } + + async fn modify(&mut self, key: &str, f: F) -> Result, Self::Error> + where + T: Serialize + DeserializeOwned + Send + Sync, + F: FnMut(Option) -> Option + Send, + { + self.inner.write().await.modify(key, f).await + } } #[derive(Clone)] -pub struct EnclaveIndexer { +pub struct EnclaveIndexer { listener: EventListener, contract: EnclaveContract, - store: Arc>, + store: Arc>, contract_address: String, chain_id: u64, } -impl EnclaveIndexer { - pub async fn new(ws_url: &str, contract_address: &str, store: Store) -> Result { +impl EnclaveIndexer { + pub async fn new(ws_url: &str, contract_address: &str, store: S) -> Result { let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; let chain_id = contract.provider.get_chain_id().await?; @@ -104,49 +182,69 @@ impl EnclaveIndexer { Ok(instance) } - async fn capture_e3_activated(&mut self) -> Result<()> { + pub async fn add_event_handler(&mut self, handler: F) + where + E: SolEvent + Send + Clone + 'static, + F: Fn(E, SharedStore) -> Fut + Send + Sync + 'static, + Fut: Future> + Send + 'static, + { + let store = SharedStore::new(self.store.clone()); + let handler = Arc::new(handler); + self.listener + .add_event_handler(move |e: E| { + let handler = Arc::clone(&handler); + let store = store.clone(); + async move { handler(e, store).await } + }) + .await; + } + + async fn register_e3_activated(&mut self) -> Result<()> { let db = self.store.clone(); let contract = self.contract.clone(); let chain_id = self.chain_id; let enclave_address = self.contract_address.clone(); self.listener .add_event_handler(move |e: E3Activated| { - let db = db.clone(); + let db = SharedStore::new(db.clone()); let enclave_address = enclave_address.clone(); let contract = contract.clone(); + async move { println!("E3Activated:{:?}", e); let e3_id = u64_try_from(e.e3Id)?; let e3 = contract.get_e3(e.e3Id).await?; + let duration = u64_try_from(e3.duration)?; + let expiration = u64_try_from(e.expiration)?; + let seed = e3.seed.to_be_bytes(); + let request_block = u64_try_from(e3.requestBlock)?; + let start_window = [ + u64_try_from(e3.startWindow[0])?, + u64_try_from(e3.startWindow[1])?, + ]; + // NOTE: we are only saving protocol specific info + // here and not CRISP specific info so E3 corresponds to the solidity E3 let e3_obj = E3 { chain_id, ciphertext_inputs: vec![], ciphertext_output: vec![], committee_public_key: e.committeePublicKey.to_vec(), - duration: u64_try_from(e3.duration)?, + duration, e3_params: e3.e3ProgramParams.to_vec(), enclave_address, encryption_scheme_id: e3.encryptionSchemeId.to_vec(), - expiration: u64_try_from(e.expiration)?, + expiration, id: e3_id, plaintext_output: vec![], - request_block: u64_try_from(e3.requestBlock)?, - seed: u64_try_from(e3.seed)?, // TODO: make this into a bytes32 - start_window: [ - u64_try_from(e3.startWindow[0])?, - u64_try_from(e3.startWindow[1])?, - ], + request_block, + seed, + start_window, threshold: e3.threshold, }; - let key = format!("e3:{}", e3_id); - - db.write() - .await - .insert(&key, &e3_obj) - .await - .map_err(|_| IndexerError::Serialization(e3_id))?; + let mut repo = E3Repository::new(db, e3_id); + repo.set_e3(e3_obj).await?; Ok(()) } }) @@ -154,24 +252,18 @@ impl EnclaveIndexer { Ok(()) } - async fn capture_input_published(&mut self) -> Result<()> { + async fn register_input_published(&mut self) -> Result<()> { let store = self.store.clone(); self.listener .add_event_handler(move |e: InputPublished| { - let store = store.clone(); + let store = SharedStore::new(store.clone()); async move { println!("InputPublished:{:?}", e); let e3_id = u64_try_from(e.e3Id)?; - let (mut e3, key) = get_e3(store.clone(), e3_id).await?; - e3.ciphertext_inputs - .push((e.data.to_vec(), e.index.to::())); - store - .write() - .await - .insert(&key, &e3) - .await - .map_err(|_| IndexerError::Serialization(e3_id))?; + let mut repo = E3Repository::new(store, e3_id); + repo.insert_ciphertext_input(e.data.to_vec(), e.index.to::()) + .await?; Ok(()) } }) @@ -179,23 +271,18 @@ impl EnclaveIndexer { Ok(()) } - async fn capture_ciphertext_output_published(&mut self) -> Result<()> { + async fn register_ciphertext_output_published(&mut self) -> Result<()> { let store = self.store.clone(); self.listener .add_event_handler(move |e: CiphertextOutputPublished| { - let store = store.clone(); + let store = SharedStore::new(store.clone()); async move { println!("CiphertextOutputPublished:{:?}", e); let e3_id = u64_try_from(e.e3Id)?; - let (mut e3, key) = get_e3(store.clone(), e3_id).await?; - e3.ciphertext_output = e.ciphertextOutput.to_vec(); - store - .write() - .await - .insert(&key, &e3) - .await - .map_err(|_| IndexerError::Serialization(e3_id))?; + let mut repo = E3Repository::new(store, e3_id); + repo.set_ciphertext_output(e.ciphertextOutput.to_vec()) + .await?; Ok(()) } @@ -204,23 +291,17 @@ impl EnclaveIndexer { Ok(()) } - async fn capture_plaintext_output_published(&mut self) -> Result<()> { + async fn register_plaintext_output_published(&mut self) -> Result<()> { let store = self.store.clone(); self.listener .add_event_handler(move |e: PlaintextOutputPublished| { - let store = store.clone(); + let store = SharedStore::new(store.clone()); async move { println!("PlaintextOutputPublished:{:?}", e); let e3_id = u64_try_from(e.e3Id)?; - let (mut e3, key) = get_e3(store.clone(), e3_id).await?; - e3.plaintext_output = e.plaintextOutput.to_vec(); - - store - .write() - .await - .insert(&key, &e3) - .await - .map_err(|_| IndexerError::Serialization(e3_id))?; + let mut repo = E3Repository::new(store, e3_id); + repo.set_plaintext_output(e.plaintextOutput.to_vec()) + .await?; Ok(()) } @@ -230,10 +311,10 @@ impl EnclaveIndexer { } async fn setup_listeners(&mut self) -> Result<()> { - self.capture_e3_activated().await?; - self.capture_input_published().await?; - self.capture_ciphertext_output_published().await?; - self.capture_plaintext_output_published().await?; + self.register_e3_activated().await?; + self.register_input_published().await?; + self.register_ciphertext_output_published().await?; + self.register_plaintext_output_published().await?; Ok(()) } @@ -255,13 +336,17 @@ impl EnclaveIndexer { pub fn get_listener(&self) -> EventListener { self.listener.clone() } + + pub fn get_store(&self) -> SharedStore { + SharedStore::new(self.store.clone()) + } } pub async fn get_e3( store: Arc>, e3_id: u64, ) -> Result<(E3, String), IndexerError> { - let key = format!("e3:{}", e3_id); + let key = format!("_e3:{}", e3_id); match store .read() .await diff --git a/packages/enclave-sdk/src/indexer/mod.rs b/packages/enclave-sdk/src/indexer/mod.rs index ab6e7dec6a..4b6442415b 100644 --- a/packages/enclave-sdk/src/indexer/mod.rs +++ b/packages/enclave-sdk/src/indexer/mod.rs @@ -1,3 +1,5 @@ mod indexer; pub mod models; +mod repo; pub use indexer::*; +pub use repo::*; diff --git a/packages/enclave-sdk/src/indexer/models.rs b/packages/enclave-sdk/src/indexer/models.rs index e836676b60..16303a06de 100644 --- a/packages/enclave-sdk/src/indexer/models.rs +++ b/packages/enclave-sdk/src/indexer/models.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +// This correlates with the information from the contract +// with an addition of a chain_id #[derive(Debug, Deserialize, Serialize)] pub struct E3 { pub chain_id: u64, @@ -14,7 +16,7 @@ pub struct E3 { pub id: u64, pub plaintext_output: Vec, pub request_block: u64, - pub seed: u64, + pub seed: [u8; 32], pub start_window: [u64; 2], pub threshold: [u32; 2], } diff --git a/packages/enclave-sdk/src/indexer/repo.rs b/packages/enclave-sdk/src/indexer/repo.rs new file mode 100644 index 0000000000..5115dbbe0f --- /dev/null +++ b/packages/enclave-sdk/src/indexer/repo.rs @@ -0,0 +1,79 @@ +use super::{models::E3, DataStore, SharedStore}; +use eyre::Result; + +pub struct E3Repository { + store: SharedStore, + e3_id: u64, +} + +impl E3Repository { + pub fn new(store: SharedStore, e3_id: u64) -> Self { + Self { store, e3_id } + } + + pub async fn set_e3(&mut self, value: E3) -> Result<()> { + let key = self.e3_key(); + self.store + .insert(&key, &value) + .await + .map_err(|e| eyre::eyre!("Could not store E3 at '{key}' due to error: {e}"))?; + Ok(()) + } + + pub async fn get_e3(&self) -> Result { + let key = self.e3_key(); + let e3_crisp = self + .store + .get::(&key) + .await + .map_err(|e| eyre::eyre!("Could get crisp at '{key}' due to error: {e}"))? + .ok_or(eyre::eyre!("No data found at {key}"))?; + Ok(e3_crisp) + } + pub async fn insert_ciphertext_input(&mut self, data: Vec, index: u64) -> Result<()> { + let key = self.e3_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.ciphertext_inputs.push((data.clone(), index)); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not append ciphertext_input for '{key}'"))?; + + Ok(()) + } + pub async fn set_plaintext_output(&mut self, data: Vec) -> Result<()> { + let key = self.e3_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.plaintext_output = data.clone(); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not append ciphertext_input for '{key}'"))?; + Ok(()) + } + + pub async fn set_ciphertext_output(&mut self, data: Vec) -> Result<()> { + let key = self.e3_key(); + self.store + .modify(&key, |e3_obj: Option| { + e3_obj.map(|mut e| { + e.ciphertext_output = data.clone(); + e + }) + }) + .await + .map_err(|_| eyre::eyre!("Could not append ciphertext_input for '{key}'"))?; + Ok(()) + } + + fn e3_key(&self) -> String { + let e3_id = self.e3_id; + format!("_e3:{e3_id}") + } +} diff --git a/packages/enclave-sdk/tests/fixtures/emit_logs.sol b/packages/enclave-sdk/tests/fixtures/emit_logs.sol index b5a1c4e842..cc393012b0 100644 --- a/packages/enclave-sdk/tests/fixtures/emit_logs.sol +++ b/packages/enclave-sdk/tests/fixtures/emit_logs.sol @@ -2,6 +2,7 @@ pragma solidity >=0.4.24; contract EmitLogs { event ValueChanged(address indexed author, uint256 count, string value); + event PublishMessage(string value); string _value; @@ -20,4 +21,8 @@ contract EmitLogs { emit ValueChanged(msg.sender, count, value); _value = value; } + + function emitPublishMessage(string memory value) public { + emit PublishMessage(value); + } } diff --git a/packages/enclave-sdk/tests/helpers.rs b/packages/enclave-sdk/tests/helpers.rs new file mode 100644 index 0000000000..4aca799430 --- /dev/null +++ b/packages/enclave-sdk/tests/helpers.rs @@ -0,0 +1,56 @@ +use alloy::{ + node_bindings::{Anvil, AnvilInstance}, + providers::{ProviderBuilder, RootProvider, WsConnect}, + pubsub::PubSubFrontend, + sol, +}; +use eyre::Result; +use EmitLogs::EmitLogsInstance; +use Enclave::EnclaveInstance; + +sol!( + #[sol(rpc)] + Enclave, + "tests/fixtures/fake_enclave.json" +); + +sol!( + #[sol(rpc)] + EmitLogs, + "tests/fixtures/emit_logs.json" +); + +pub async fn setup_logs_contract() -> Result<( + EmitLogsInstance>, + String, + String, + AnvilInstance, +)> { + let (provider, endpoint, anvil) = setup_provider().await?; + let contract = EmitLogs::deploy(provider).await?; + let address = contract.address().to_string(); + Ok((contract, address, endpoint, anvil)) +} + +pub async fn setup_fake_enclave() -> Result<( + EnclaveInstance>, + String, + String, + AnvilInstance, +)> { + let (provider, endpoint, anvil) = setup_provider().await?; + let contract = Enclave::deploy(provider).await?; + let address = contract.address().to_string(); + Ok((contract, address, endpoint, anvil)) +} + +pub async fn setup_provider() -> Result<(RootProvider, String, AnvilInstance)> { + // Set anvil with fast blocktimes for testing + let anvil = Anvil::new().block_time_f64(0.01).try_spawn()?; + + let provider = ProviderBuilder::new() + .on_ws(WsConnect::new(anvil.ws_endpoint())) + .await?; + let endpoint = anvil.ws_endpoint(); + Ok((provider, endpoint, anvil)) +} diff --git a/packages/enclave-sdk/tests/indexer.rs b/packages/enclave-sdk/tests/indexer.rs index 646c992d20..39b16f88d0 100644 --- a/packages/enclave-sdk/tests/indexer.rs +++ b/packages/enclave-sdk/tests/indexer.rs @@ -1,14 +1,14 @@ -use std::time::Duration; - +mod helpers; use alloy::{ - node_bindings::Anvil, primitives::{Bytes, Uint}, - providers::{ProviderBuilder, WsConnect}, sol, }; -use enclave_sdk::indexer::{EnclaveIndexer, InMemoryStore}; +use enclave_sdk::indexer::{DataStore, EnclaveIndexer, InMemoryStore}; use eyre::Result; +use helpers::setup_fake_enclave; +use std::time::Duration; use tokio::time::sleep; +use Enclave::InputPublished; sol!( #[sol(rpc)] @@ -18,17 +18,21 @@ sol!( #[tokio::test] async fn test_indexer() -> Result<()> { - let anvil = Anvil::new().block_time(1).try_spawn()?; + let (contract, address, endpoint, _anvil) = setup_fake_enclave().await?; - let provider = ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) - .await?; + let mut indexer = EnclaveIndexer::new(&endpoint, &address, InMemoryStore::new()).await?; - let contract = Enclave::deploy(provider).await?; - let address = contract.address().to_string(); - let endpoint = anvil.ws_endpoint(); + indexer + .add_event_handler(move |_: InputPublished, mut store| async move { + store + .modify("input_count", |counter: Option| { + Some(counter.map_or(1, |c| c + 1)) + }) + .await?; - let indexer = EnclaveIndexer::new(&endpoint, &address, InMemoryStore::new()).await?; + Ok(()) + }) + .await; // Start tracking state indexer.start()?; @@ -112,5 +116,8 @@ async fn test_indexer() -> Result<()> { assert_eq!(e3.ciphertext_output, ciphertext_output); + let store = indexer.get_store(); + let val = store.get::("input_count").await?.unwrap(); + assert_eq!(val, 3); Ok(()) } diff --git a/packages/enclave-sdk/tests/listener.rs b/packages/enclave-sdk/tests/listener.rs index e5068d8dda..dac65d28c5 100644 --- a/packages/enclave-sdk/tests/listener.rs +++ b/packages/enclave-sdk/tests/listener.rs @@ -1,10 +1,10 @@ -use alloy::{ - node_bindings::Anvil, - providers::{ProviderBuilder, WsConnect}, - sol, -}; +mod helpers; +use alloy::sol; use enclave_sdk::evm::listener::EventListener; use eyre::Result; +use helpers::setup_logs_contract; +use std::time::Duration; +use tokio::time::sleep; sol!( #[sol(rpc)] @@ -14,16 +14,11 @@ sol!( #[tokio::test] async fn test_event_listener() -> Result<()> { - let anvil = Anvil::new().block_time(1).try_spawn()?; + let (contract, _, _, anvil) = setup_logs_contract().await?; + let (tx, mut rx) = tokio::sync::mpsc::channel::(10); let (tx_addr, mut rx_addr) = tokio::sync::mpsc::channel::(10); - let provider = ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) - .await?; - - let contract = EmitLogs::deploy(provider).await?; - let mut event_listener = EventListener::create_contract_listener( &anvil.ws_endpoint(), &contract.address().to_string(), @@ -58,6 +53,7 @@ async fn test_event_listener() -> Result<()> { .await? .watch() .await?; + contract .setValue("world!".to_string()) .send() @@ -78,3 +74,122 @@ async fn test_event_listener() -> Result<()> { ); Ok(()) } +use std::time::{SystemTime, UNIX_EPOCH}; + +fn time_diff(past_timestamp: u128) -> Result { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); + let time_diff = current_time.saturating_sub(past_timestamp); + let time_diff_string = format!("{}ms", time_diff); + Ok(time_diff_string) +} + +fn process_message_with_timestamp(input: &str) -> Result<(String, String)> { + let parts: Vec<&str> = input.splitn(2, ':').collect(); + let message = parts[0].to_string(); + let timestamp_str = parts[1].trim(); + let past_timestamp: u128 = timestamp_str.parse()?; + let time_diff_string = time_diff(past_timestamp)?; + Ok((message, time_diff_string)) +} + +#[tokio::test] +async fn test_overlapping_listener_handlers() -> Result<()> { + // Here we are going to test that listeners can have overlapping async handlers. + // We want to ensure that long running handlers can run async whilest other handlers respond to + // events without disruption + // It is important that for this test we have Anvil blocktimes set to process fast so we can + // ensure order is maintained + let (contract, _, _, anvil) = setup_logs_contract().await?; + let (tx, mut rx) = tokio::sync::mpsc::channel::(10); + let mut event_listener = EventListener::create_contract_listener( + &anvil.ws_endpoint(), + &contract.address().to_string(), + ) + .await?; + + let tx1 = tx.clone(); + event_listener + .add_event_handler(move |event: EmitLogs::PublishMessage| { + let tx = tx1.clone(); + async move { + let (msg, time_diff) = process_message_with_timestamp(&event.value)?; + println!("PublishMessage '{}' ({} since sent)", msg, time_diff); + let tx = tx.clone(); + let _ = tx.try_send("waiting".to_string()); + // Wait 200ms before publishing the message to simulate long running handlers + sleep(Duration::from_millis(200)).await; + println!("Sending message: '{msg}'"); + let _ = tx.try_send(msg); + Ok(()) + } + }) + .await; + + event_listener + .add_event_handler(move |event: EmitLogs::ValueChanged| { + let tx = tx.clone(); + + async move { + let (msg, time_diff) = process_message_with_timestamp(&event.value)?; + println!("ValueChanged '{}' ({} since sent)", msg, time_diff); + let _ = tx.clone().try_send(msg); + Ok(()) + } + }) + .await; + + tokio::spawn(async move { event_listener.listen().await.unwrap() }); + + // For clarity the events should be returned + // roughly in this order: + // 0ms : one + // 0ms : waiting + // 100ms : two + // 200ms : three + // 300ms : four + + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); + contract + .setValue(format!("one:{now}")) + .send() + .await? + .watch() + .await?; + + // Will delay 200ms + contract + .emitPublishMessage(format!("three:{now}")) + .send() + .await? + .watch() + .await?; + + sleep(Duration::from_millis(100)).await; + + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); + + contract + .setValue(format!("two:{now}")) + .send() + .await? + .watch() + .await?; + + sleep(Duration::from_millis(300)).await; + + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); + contract + .setValue(format!("four:{now}")) + .send() + .await? + .watch() + .await?; + + assert_eq!(rx.recv().await.unwrap(), "one"); + assert_eq!(rx.recv().await.unwrap(), "waiting"); + assert_eq!(rx.recv().await.unwrap(), "two"); + assert_eq!(rx.recv().await.unwrap(), "three"); + assert_eq!(rx.recv().await.unwrap(), "four"); + + Ok(()) +} From a24fda447cab61903f6f5ec3c7878dfbe55fd7c0 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 28 May 2025 15:33:10 +0500 Subject: [PATCH 024/106] Add comments explaining ciphertext decoding (#449) --- examples/CRISP/apps/server/src/server/indexer.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs index 0e6dc35cde..b253504a3f 100644 --- a/examples/CRISP/apps/server/src/server/indexer.rs +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -126,10 +126,23 @@ pub async fn register_plaintext_output_published( let mut repo = CrispE3Repository::new(store, e3_id); async move { info!("CRISP: handling 'PlaintextOutputPublished'"); - // TODO: explain this logic as it is confusing + + // The plaintextOutput from the event contains the result of the FHE computation. + // The computation sums the encrypted votes: '0' for Option 1, '1' for Option 2. + // Thus, the decrypted sum directly represents the number of votes for Option 2. + // The output is expected to be a bincode-serialized Vec. let decoded: Vec = bincode::deserialize(&event.plaintextOutput.to_vec())?; + + // decoded[0] is the sum of all encrypted votes (0s and 1s). + // Since Option 1 votes are encrypted as '0' and Option 2 votes as '1', + // this sum is equivalent to the count of votes for Option 2. let option_2 = decoded[0]; + + // Retrieve the total number of votes that were cast and recorded for this round. let total_votes = repo.get_vote_count().await?; + + // The number of votes for Option 1 can be derived by subtracting + // the Option 2 votes (the sum from the FHE output) from the total votes. let option_1 = total_votes - option_2; info!("Vote Count: {:?}", total_votes); From 3d00b96a9e6830d747e64fb0be578e1b1d7f1ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 28 May 2025 11:06:35 +0000 Subject: [PATCH 025/106] Sort out server listeners and ensure that database is not static (#448) * Refactor start logic * make listen private * Refactor start logic to be clearer * Remove static database * Fix error * Remove unwrap() * Tidy up error handling --- .../CRISP/apps/server/src/server/app_data.rs | 27 ++++++++ .../CRISP/apps/server/src/server/database.rs | 65 +----------------- .../CRISP/apps/server/src/server/indexer.rs | 68 ++++++++----------- examples/CRISP/apps/server/src/server/mod.rs | 43 ++++++++---- .../apps/server/src/server/routes/rounds.rs | 41 ++++++----- .../apps/server/src/server/routes/state.rs | 27 ++++---- .../apps/server/src/server/routes/voting.rs | 38 ++++++++--- packages/enclave-sdk/src/evm/contracts.rs | 9 +++ packages/enclave-sdk/src/evm/listener.rs | 9 ++- packages/enclave-sdk/src/indexer/indexer.rs | 50 +++++--------- packages/enclave-sdk/src/indexer/mod.rs | 2 + packages/enclave-sdk/src/indexer/traits.rs | 24 +++++++ packages/enclave-sdk/tests/indexer.rs | 5 +- packages/enclave-sdk/tests/listener.rs | 4 +- 14 files changed, 219 insertions(+), 193 deletions(-) create mode 100644 examples/CRISP/apps/server/src/server/app_data.rs create mode 100644 packages/enclave-sdk/src/indexer/traits.rs diff --git a/examples/CRISP/apps/server/src/server/app_data.rs b/examples/CRISP/apps/server/src/server/app_data.rs new file mode 100644 index 0000000000..d60ffc6225 --- /dev/null +++ b/examples/CRISP/apps/server/src/server/app_data.rs @@ -0,0 +1,27 @@ +use std::sync::Arc; + +use enclave_sdk::indexer::SharedStore; +use tokio::sync::RwLock; + +use super::{ + database::SledDB, + repo::{CrispE3Repository, CurrentRoundRepository}, +}; + +pub struct AppData { + db: SharedStore, +} + +impl AppData { + pub fn new(db: SharedStore) -> Self { + Self { db } + } + + pub fn e3(&self, e3_id: u64) -> CrispE3Repository { + CrispE3Repository::new(self.db.clone(), e3_id) + } + + pub fn current_round(&self) -> CurrentRoundRepository { + CurrentRoundRepository::new(self.db.clone()) + } +} diff --git a/examples/CRISP/apps/server/src/server/database.rs b/examples/CRISP/apps/server/src/server/database.rs index c6ddf2d154..cbac6642e8 100644 --- a/examples/CRISP/apps/server/src/server/database.rs +++ b/examples/CRISP/apps/server/src/server/database.rs @@ -1,17 +1,11 @@ -use super::{ - models::E3, - repo::{CrispE3Repository, CurrentRoundRepository}, -}; use async_trait::async_trait; -use enclave_sdk::indexer::{DataStore, SharedStore}; +use enclave_sdk::indexer::DataStore; use log::error; -use once_cell::sync::Lazy; use rand::Rng; use serde::{de::DeserializeOwned, Serialize}; use sled::Db; -use std::{error::Error, str, sync::Arc}; +use std::str; use thiserror::Error; -use tokio::sync::RwLock; #[derive(Error, Debug)] pub enum DatabaseError { @@ -77,61 +71,6 @@ impl DataStore for SledDB { } } -pub static GLOBAL_DB: Lazy>> = Lazy::new(|| { - let pathdb = std::env::current_dir().unwrap().join("database/server"); - Arc::new(RwLock::new(SledDB::new(pathdb.to_str().unwrap()).unwrap())) -}); - -pub async fn db_insert( - key: &str, - value: &T, -) -> Result<(), DatabaseError> { - let mut db = GLOBAL_DB.write().await; - db.insert(key, value).await?; - Ok(()) -} - -// pub async fn db_get( -// key: &str, -// ) -> Result, DatabaseError> { -// let db = GLOBAL_DB.read().await; -// db.get::(key).await -// } - -// pub async fn get_e3(e3_id: u64) -> Result<(E3, String), Box> { -// let key = format!("e3:{}", e3_id); -// match db_get::(&key).await? { -// Some(e3) => Ok((e3, key)), -// None => { -// error!("E3 state not found for key: {}", key); -// Err("E3 state not found".into()) -// } -// } -// } - -// XXX: ok this is silly but will be fixed when we don't use static DB -async fn get_shared_store() -> SharedStore { - let store = SharedStore::new(Arc::new(RwLock::new(GLOBAL_DB.read().await.clone()))); - store -} - -pub async fn get_e3_repo(e3_id: u64) -> CrispE3Repository { - CrispE3Repository::new(get_shared_store().await, e3_id) -} - -pub async fn get_current_round_repo() -> CurrentRoundRepository { - CurrentRoundRepository::new(get_shared_store().await) -} - -pub async fn update_e3_status( - e3_id: u64, - status: String, -) -> Result<(), Box> { - let mut repo = get_e3_repo(e3_id).await; - repo.update_status(&status).await?; - Ok(()) -} - pub fn generate_emoji() -> [String; 2] { let emojis = [ "🍇", "🍈", "🍉", "🍊", "🍋", "🍌", "🍍", "🥭", "🍎", "🍏", "🍐", "🍑", "🍒", "🍓", "🫐", diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs index b253504a3f..68f3a4cd16 100644 --- a/examples/CRISP/apps/server/src/server/indexer.rs +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -5,10 +5,11 @@ use crate::server::{ use compute_provider::FHEInputs; use enclave_sdk::{ evm::{ - contracts::{EnclaveContract, EnclaveRead, EnclaveWrite, ReadOnly, ReadWrite}, + contracts::{ + EnclaveContract, EnclaveContractFactory, EnclaveRead, EnclaveWrite, ReadWrite, + }, events::{ - CiphertextOutputPublished, CommitteePublished, E3Activated, InputPublished, - PlaintextOutputPublished, + CiphertextOutputPublished, CommitteePublished, E3Activated, PlaintextOutputPublished, }, listener::EventListener, }, @@ -25,8 +26,9 @@ type Result = std::result::Result>; pub async fn register_e3_activated( mut indexer: EnclaveIndexer, - contract: Arc>, + contract: EnclaveContract, ) -> Result> { + let contract = Arc::new(contract); // E3Activated indexer .add_event_handler(move |event: E3Activated, store| { @@ -160,7 +162,7 @@ pub async fn register_plaintext_output_published( pub async fn register_committee_published( mut listener: EventListener, - contract: Arc>, + contract: EnclaveContract, ) -> Result { // CommitteePublished listener @@ -186,47 +188,35 @@ pub async fn register_committee_published( Ok(listener) } -pub async fn setup_indexer( +pub async fn start_indexer( ws_url: &str, contract_address: &str, registry_filter_address: &str, store: impl DataStore, private_key: &str, -) -> Result<(EnclaveIndexer, EventListener)> { - let indexer = EnclaveIndexer::new(ws_url, contract_address, store).await?; - let contract = Arc::new( - EnclaveContract::::new(&ws_url, &private_key, &contract_address).await?, - ); - let indexer = register_e3_activated(indexer, contract.clone()).await?; - let indexer = register_ciphertext_output_published(indexer).await?; - let indexer = register_plaintext_output_published(indexer).await?; +) -> Result<()> { + let readonly_contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; - let registry_listener = + let readwrite_contract = + EnclaveContractFactory::create_write(ws_url, contract_address, private_key).await?; + + let enclave_contract_listener = + EventListener::create_contract_listener(ws_url, contract_address).await?; + + // CRISP indexer + let crisp_indexer = + EnclaveIndexer::new(enclave_contract_listener, readonly_contract, store).await?; + let crisp_indexer = register_e3_activated(crisp_indexer, readwrite_contract.clone()).await?; + let crisp_indexer = register_ciphertext_output_published(crisp_indexer).await?; + let crisp_indexer = register_plaintext_output_published(crisp_indexer).await?; + crisp_indexer.start(); + + // Registry Listener + let registry_contract_listener = EventListener::create_contract_listener(&ws_url, registry_filter_address).await?; - let listener = register_committee_published(registry_listener, contract).await?; - Ok((indexer, listener)) -} + let registry_listener = + register_committee_published(registry_contract_listener, readwrite_contract).await?; + registry_listener.start(); -pub async fn start_indexer( - ws_url: &str, - contract_address: &str, - registry_filter_address: &str, - store: impl DataStore, - private_key: &str, -) -> Result<()> { - let (indexer, listener) = setup_indexer( - ws_url, - contract_address, - registry_filter_address, - store, - private_key, - ) - .await?; - indexer.start()?; - tokio::spawn(async move { - if let Err(e) = listener.listen().await { - eprintln!("Error: {}", e); - } - }); Ok(()) } diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index ccb51d0f0f..77b0deb658 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -1,3 +1,4 @@ +mod app_data; pub mod config; mod database; mod indexer; @@ -5,9 +6,16 @@ mod models; mod repo; mod routes; +use std::sync::Arc; + use actix_cors::Cors; -use actix_web::{middleware::Logger, App, HttpServer}; +use actix_web::{middleware::Logger, web, App, HttpServer}; +use app_data::AppData; +use database::SledDB; +use enclave_sdk::indexer::SharedStore; +use eyre::OptionExt; use indexer::start_indexer; +use tokio::sync::RwLock; use crate::logger::init_logger; use config::CONFIG; @@ -16,23 +24,31 @@ use config::CONFIG; pub async fn start() -> Result<(), Box> { init_logger(); + let pathdb = std::env::current_dir()?.join("database/server"); + let pathdb = pathdb.to_str().ok_or_eyre("Path could not be determined")?; + let db = SharedStore::new(Arc::new(RwLock::new(SledDB::new(pathdb)?))); + // New indexer - tokio::spawn(async { - if let Err(e) = start_indexer( - &CONFIG.ws_rpc_url, - &CONFIG.enclave_address, - &CONFIG.ciphernode_registry_address, - database::GLOBAL_DB.read().await.clone(), - &CONFIG.private_key, - ) - .await - { - eprintln!("Listener failed: {:?}", e); + tokio::spawn({ + let db = db.clone(); + async move { + if let Err(e) = start_indexer( + &CONFIG.ws_rpc_url, + &CONFIG.enclave_address, + &CONFIG.ciphernode_registry_address, + db.clone(), + &CONFIG.private_key, + ) + .await + { + eprintln!("Listener failed: {:?}", e); + } } }); let bind_addr = "0.0.0.0:4000"; - let server = HttpServer::new(|| { + let db_clone = db.clone(); + let server = HttpServer::new(move || { let cors = Cors::default() .allow_any_origin() .allowed_methods(vec!["GET", "POST", "OPTIONS"]) @@ -43,6 +59,7 @@ pub async fn start() -> Result<(), Box> { App::new() .wrap(cors) .wrap(Logger::new(r#"%a "%r" %s %b %T"#)) + .app_data(web::Data::new(AppData::new(db_clone.clone()))) .configure(routes::setup_routes) }) .bind(bind_addr)?; diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index 8061ac5117..e9024255ec 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -1,5 +1,5 @@ +use crate::server::app_data::AppData; use crate::server::config::CONFIG; -use crate::server::database::{get_current_round_repo, get_e3_repo}; use crate::server::models::{ CTRequest, ComputeProviderParams, CronRequestE3, JsonResponse, PKRequest, }; @@ -51,9 +51,8 @@ async fn request_new_round(data: web::Json) -> impl Responder { /// # Returns /// /// * A JSON response containing the current round -async fn get_current_round() -> impl Responder { - let repo = get_current_round_repo().await; - match repo.get_current_round().await { +async fn get_current_round(store: web::Data) -> impl Responder { + match store.current_round().get_current_round().await { Ok(Some(current_round)) => HttpResponse::Ok().json(current_round), Ok(None) => HttpResponse::NotFound().json(JsonResponse { response: "No current round found".to_string(), @@ -73,13 +72,18 @@ async fn get_current_round() -> impl Responder { /// # Returns /// /// * A JSON response containing the ciphertext -async fn get_ciphertext(data: web::Json) -> impl Responder { +async fn get_ciphertext(data: web::Json, store: web::Data) -> impl Responder { let mut incoming = data.into_inner(); - let repo = get_e3_repo(incoming.round_id).await; - incoming.ct_bytes = repo.get_ciphertext_output().await.unwrap(); - - HttpResponse::Ok().json(incoming) + match store.e3(incoming.round_id).get_ciphertext_output().await { + Ok(ct_bytes) => { + incoming.ct_bytes = ct_bytes; + HttpResponse::Ok().json(incoming) + } + Err(e) => HttpResponse::InternalServerError().json(JsonResponse { + response: format!("Failed to retrieve ciphertext output: {}", e), + }), + } } /// Get the public key for a given round @@ -91,14 +95,18 @@ async fn get_ciphertext(data: web::Json) -> impl Responder { /// # Returns /// /// * A JSON response containing the public key -async fn get_public_key(data: web::Json) -> impl Responder { +async fn get_public_key(data: web::Json, store: web::Data) -> impl Responder { let mut incoming = data.into_inner(); - let repo = get_e3_repo(incoming.round_id).await; - - incoming.pk_bytes = repo.get_committee_public_key().await.unwrap(); - - HttpResponse::Ok().json(incoming) + match store.e3(incoming.round_id).get_committee_public_key().await { + Ok(pk_bytes) => { + incoming.pk_bytes = pk_bytes; + HttpResponse::Ok().json(incoming) + } + Err(e) => HttpResponse::InternalServerError().json(JsonResponse { + response: format!("Failed to retrieve public key: {}", e), + }), + } } /// Initialize a new CRISP round @@ -152,8 +160,7 @@ pub async fn initialize_crisp_round() -> Result<(), Box) -> impl Responder { +async fn get_round_result( + data: web::Json, + store: web::Data, +) -> impl Responder { let incoming = data.into_inner(); - let repo = get_e3_repo(incoming.round_id).await; - match repo.get_web_result_request().await { + match store.e3(incoming.round_id).get_web_result_request().await { Ok(response) => HttpResponse::Ok().json(response), Err(e) => { error!("Error getting E3 state: {:?}", e); @@ -37,9 +39,8 @@ async fn get_round_result(data: web::Json) -> impl Responder { /// # Returns /// /// * A JSON response containing the results for all rounds -async fn get_all_round_results() -> impl Responder { - let repo = get_current_round_repo().await; - let round_count = match repo.get_current_round_id().await { +async fn get_all_round_results(store: web::Data) -> impl Responder { + let round_count = match store.current_round().get_current_round_id().await { Ok(count) => count, Err(e) => { info!("Error retrieving round count: {:?}", e); @@ -48,10 +49,10 @@ async fn get_all_round_results() -> impl Responder { }; let mut states = Vec::new(); + // FIXME: This assumes ids are ordered for i in 0..round_count + 1 { - let repo = get_e3_repo(i).await; - match repo.get_web_result_request().await { + match store.e3(i).get_web_result_request().await { Ok(w) => states.push(w), Err(e) => { info!("Error retrieving state for round {}: {:?}", i, e); @@ -71,10 +72,12 @@ async fn get_all_round_results() -> impl Responder { /// /// # Returns /// -async fn get_round_state_lite(data: web::Json) -> impl Responder { +async fn get_round_state_lite( + data: web::Json, + store: web::Data, +) -> impl Responder { let incoming = data.into_inner(); - let repo = get_e3_repo(incoming.round_id).await; - match repo.get_e3_state_lite().await { + match store.e3(incoming.round_id).get_e3_state_lite().await { Ok(state_lite) => HttpResponse::Ok().json(state_lite), Err(_) => HttpResponse::InternalServerError().body("Failed to get E3 state"), } diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index b7456f808f..84eee2d0fe 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -1,7 +1,9 @@ use crate::server::{ + app_data::AppData, config::CONFIG, - database::get_e3_repo, + database::SledDB, models::{EncryptedVote, VoteResponse, VoteResponseStatus}, + repo::CrispE3Repository, }; use actix_web::{web, HttpResponse, Responder}; use alloy::{ @@ -27,12 +29,18 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { /// # Returns /// /// * A JSON response indicating the success or failure of the operation -async fn broadcast_encrypted_vote(data: web::Json) -> impl Responder { +async fn broadcast_encrypted_vote( + data: web::Json, + store: web::Data, +) -> impl Responder { let vote = data.into_inner(); - let mut repo = get_e3_repo(vote.round_id).await; // Validate and update vote status - let has_voted = match repo.has_voted(vote.address.clone()).await { + let has_voted = match store + .e3(vote.round_id) + .has_voted(vote.address.clone()) + .await + { Ok(voted) => voted, Err(e) => { log::error!("Database error checking vote status: {:?}", e); @@ -48,6 +56,8 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon }); } + let mut repo = store.e3(vote.round_id); + if let Err(e) = repo.insert_voter_address(vote.address.clone()).await { log::error!("Database error inserting voter: {:?}", e); return HttpResponse::InternalServerError().json("Internal server error"); @@ -63,13 +73,19 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon let encoded_params = Bytes::from(params_value.abi_encode_params()); // Broadcast vote to blockchain - let contract = EnclaveContract::new( + let contract = match EnclaveContract::new( &CONFIG.http_rpc_url, &CONFIG.private_key, &CONFIG.enclave_address, ) .await - .unwrap(); + { + Ok(c) => c, + Err(e) => { + log::error!("Database error checking vote status: {:?}", e); + return HttpResponse::InternalServerError().json("Internal server error"); + } + }; match contract.publish_input(e3_id, encoded_params).await { Ok(hash) => HttpResponse::Ok().json(VoteResponse { @@ -77,7 +93,7 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon tx_hash: Some(hash.transaction_hash.to_string()), message: Some("Vote Successful".to_string()), }), - Err(e) => handle_vote_error(e, vote.round_id, &vote.address).await, + Err(e) => handle_vote_error(e, repo, &vote.address).await, } } @@ -89,12 +105,14 @@ async fn broadcast_encrypted_vote(data: web::Json) -> impl Respon /// * `state_data` - The state data to be rolled back /// * `key` - The key for the state data /// * `address` - The address for the vote -async fn handle_vote_error(e: Error, e3_id: u64, address: &str) -> HttpResponse { +async fn handle_vote_error( + e: Error, + mut repo: CrispE3Repository, + address: &str, +) -> HttpResponse { info!("Error while sending vote transaction: {:?}", e); // Rollback the vote - let mut repo = get_e3_repo(e3_id).await; - match repo.remove_voter_address(address).await { Ok(_) => (), Err(err) => error!("Error rolling back the vote: {err}"), diff --git a/packages/enclave-sdk/src/evm/contracts.rs b/packages/enclave-sdk/src/evm/contracts.rs index f1ab6d4936..89ac3425b3 100644 --- a/packages/enclave-sdk/src/evm/contracts.rs +++ b/packages/enclave-sdk/src/evm/contracts.rs @@ -130,6 +130,7 @@ impl ProviderType for ReadOnly { type Provider = EnclaveReadOnlyProvider; } /// Marker type for read-write provider +#[derive(Clone)] pub struct ReadWrite; impl ProviderType for ReadWrite { type Provider = EnclaveWriteProvider; @@ -155,6 +156,10 @@ impl EnclaveContract { pub fn get_provider(&self) -> Arc { self.provider.clone() } + + pub fn address(&self) -> &Address { + &self.contract_address + } } impl EnclaveContract { @@ -168,6 +173,10 @@ impl EnclaveContract { pub fn get_provider(&self) -> Arc { self.provider.clone() } + + pub fn address(&self) -> &Address { + &self.contract_address + } } /// Type alias for read-only provider diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/enclave-sdk/src/evm/listener.rs index dfca0cc4b1..ec668a6c2b 100644 --- a/packages/enclave-sdk/src/evm/listener.rs +++ b/packages/enclave-sdk/src/evm/listener.rs @@ -9,7 +9,7 @@ use eyre::Result; use futures::stream::StreamExt; use futures_util::future::FutureExt; use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc}; -use tokio::sync::RwLock; +use tokio::{sync::RwLock, task::JoinHandle}; type EventHandler = Box Pin> + Send>> + Send + Sync>; @@ -57,7 +57,7 @@ impl EventListener { .push(wrapped_handler); } - pub async fn listen(&self) -> Result<()> { + async fn listen(&self) -> Result<()> { let mut stream = self .provider .subscribe_logs(&self.filter) @@ -83,6 +83,11 @@ impl EventListener { Ok(()) } + pub fn start(&self) -> JoinHandle> { + let this = self.clone(); + tokio::spawn(async move { this.listen().await }) + } + pub async fn create_contract_listener(ws_url: &str, contract_address: &str) -> Result { let provider = Arc::new(ProviderBuilder::new().on_builtin(ws_url).await?); let address = contract_address.parse::
()?; diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/enclave-sdk/src/indexer/indexer.rs index 9629be6e61..2b7a0d71c1 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/enclave-sdk/src/indexer/indexer.rs @@ -1,4 +1,4 @@ -use super::models::E3; +use super::{models::E3, DataStore}; use crate::{ evm::{ contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, @@ -16,8 +16,8 @@ use async_trait::async_trait; use eyre::eyre; use eyre::Result; use serde::{de::DeserializeOwned, Serialize}; +use std::future::Future; use std::{collections::HashMap, sync::Arc}; -use std::{fmt::Display, future::Future}; use thiserror::Error; use tokio::sync::RwLock; use tokio::task::JoinHandle; @@ -32,25 +32,6 @@ pub enum IndexerError { Serialization(E3Id), } -/// Trait for injectable DataStore. Note the implementor must manage interior mutability -#[async_trait] -pub trait DataStore: Send + Sync + 'static { - type Error: Display; - async fn insert( - &mut self, - key: &str, - value: &T, - ) -> Result<(), Self::Error>; - async fn get( - &self, - key: &str, - ) -> Result, Self::Error>; - async fn modify(&mut self, key: &str, f: F) -> Result, Self::Error> - where - T: Serialize + DeserializeOwned + Send + Sync, - F: FnMut(Option) -> Option + Send; -} - pub struct InMemoryStore { data: HashMap>, } @@ -167,21 +148,30 @@ pub struct EnclaveIndexer { } impl EnclaveIndexer { - pub async fn new(ws_url: &str, contract_address: &str, store: S) -> Result { - let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; - let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; + pub async fn new( + listener: EventListener, + contract: EnclaveContract, + store: S, + ) -> Result { let chain_id = contract.provider.get_chain_id().await?; + let contract_address = contract.address().to_string(); let mut instance = Self { store: Arc::new(RwLock::new(store)), contract, listener, - contract_address: contract_address.to_string(), + contract_address, chain_id, }; instance.setup_listeners().await?; Ok(instance) } + pub async fn from_strings(ws_url: &str, contract_address: &str, store: S) -> Result { + let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; + let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; + EnclaveIndexer::new(listener, contract, store).await + } + pub async fn add_event_handler(&mut self, handler: F) where E: SolEvent + Send + Clone + 'static, @@ -318,14 +308,8 @@ impl EnclaveIndexer { Ok(()) } - pub fn start(&self) -> Result> { - let listener = self.listener.clone(); - let handle = tokio::spawn(async move { - if let Err(e) = listener.listen().await { - eprintln!("Error: {}", e); - } - }); - Ok(handle) + pub fn start(&self) -> JoinHandle> { + self.listener.start() } pub async fn get_e3(&self, e3_id: u64) -> Result { diff --git a/packages/enclave-sdk/src/indexer/mod.rs b/packages/enclave-sdk/src/indexer/mod.rs index 4b6442415b..ff86f2540e 100644 --- a/packages/enclave-sdk/src/indexer/mod.rs +++ b/packages/enclave-sdk/src/indexer/mod.rs @@ -1,5 +1,7 @@ mod indexer; pub mod models; mod repo; +mod traits; pub use indexer::*; pub use repo::*; +pub use traits::*; diff --git a/packages/enclave-sdk/src/indexer/traits.rs b/packages/enclave-sdk/src/indexer/traits.rs new file mode 100644 index 0000000000..0802134ac3 --- /dev/null +++ b/packages/enclave-sdk/src/indexer/traits.rs @@ -0,0 +1,24 @@ +use std::fmt::Display; + +use async_trait::async_trait; +use serde::{de::DeserializeOwned, Serialize}; +use tokio::task::JoinHandle; + +/// Trait for injectable DataStore. Note the implementor must manage interior mutability +#[async_trait] +pub trait DataStore: Send + Sync + 'static { + type Error: Display; + async fn insert( + &mut self, + key: &str, + value: &T, + ) -> Result<(), Self::Error>; + async fn get( + &self, + key: &str, + ) -> Result, Self::Error>; + async fn modify(&mut self, key: &str, f: F) -> Result, Self::Error> + where + T: Serialize + DeserializeOwned + Send + Sync, + F: FnMut(Option) -> Option + Send; +} diff --git a/packages/enclave-sdk/tests/indexer.rs b/packages/enclave-sdk/tests/indexer.rs index 39b16f88d0..97d3ccc7b2 100644 --- a/packages/enclave-sdk/tests/indexer.rs +++ b/packages/enclave-sdk/tests/indexer.rs @@ -20,7 +20,8 @@ sol!( async fn test_indexer() -> Result<()> { let (contract, address, endpoint, _anvil) = setup_fake_enclave().await?; - let mut indexer = EnclaveIndexer::new(&endpoint, &address, InMemoryStore::new()).await?; + let mut indexer = + EnclaveIndexer::from_strings(&endpoint, &address, InMemoryStore::new()).await?; indexer .add_event_handler(move |_: InputPublished, mut store| async move { @@ -35,7 +36,7 @@ async fn test_indexer() -> Result<()> { .await; // Start tracking state - indexer.start()?; + let _ = indexer.start(); // E3Activated let e3_id = 10; diff --git a/packages/enclave-sdk/tests/listener.rs b/packages/enclave-sdk/tests/listener.rs index dac65d28c5..2cac1e0fae 100644 --- a/packages/enclave-sdk/tests/listener.rs +++ b/packages/enclave-sdk/tests/listener.rs @@ -45,7 +45,7 @@ async fn test_event_listener() -> Result<()> { }) .await; - tokio::spawn(async move { event_listener.listen().await.unwrap() }); + event_listener.start(); contract .setValue("hello".to_string()) @@ -138,7 +138,7 @@ async fn test_overlapping_listener_handlers() -> Result<()> { }) .await; - tokio::spawn(async move { event_listener.listen().await.unwrap() }); + event_listener.start(); // For clarity the events should be returned // roughly in this order: From 7b4db725f61718ac52758835ec63cf25fb11bd72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 29 May 2025 10:21:05 +0000 Subject: [PATCH 026/106] Enclave init simply creates a blank hardhat project based on `./examples/basic` (#450) * Add hardhat project to basic * enclave init -> wizard (temp) * cli hello * Clone repo and run pnpm * Setup template * Add deprecation for wizard --- examples/basic/.gitignore | 17 ++ examples/basic/README.md | 13 ++ examples/basic/contracts/Lock.sol | 34 ++++ examples/basic/hardhat.config.ts | 8 + examples/basic/ignition/modules/Lock.ts | 20 ++ examples/basic/package.json | 25 +++ examples/basic/test/Lock.ts | 127 ++++++++++++ examples/basic/tsconfig.json | 11 ++ packages/ciphernode/Cargo.lock | 77 ++++++++ packages/ciphernode/Cargo.toml | 4 + packages/ciphernode/enclave/Cargo.toml | 1 + packages/ciphernode/enclave/src/cli.rs | 17 +- packages/ciphernode/enclave/src/init.rs | 78 +------- packages/ciphernode/enclave/src/main.rs | 1 + packages/ciphernode/enclave/src/wizard.rs | 79 ++++++++ packages/ciphernode/enclave_core/src/lib.rs | 2 +- .../enclave_core/src/{init => wizard}/mod.rs | 0 packages/ciphernode/init/Cargo.toml | 10 + packages/ciphernode/init/src/lib.rs | 180 ++++++++++++++++++ pnpm-lock.yaml | 150 +++++++++++++-- 20 files changed, 757 insertions(+), 97 deletions(-) create mode 100644 examples/basic/.gitignore create mode 100644 examples/basic/README.md create mode 100644 examples/basic/contracts/Lock.sol create mode 100644 examples/basic/hardhat.config.ts create mode 100644 examples/basic/ignition/modules/Lock.ts create mode 100644 examples/basic/package.json create mode 100644 examples/basic/test/Lock.ts create mode 100644 examples/basic/tsconfig.json create mode 100644 packages/ciphernode/enclave/src/wizard.rs rename packages/ciphernode/enclave_core/src/{init => wizard}/mod.rs (100%) create mode 100644 packages/ciphernode/init/Cargo.toml create mode 100644 packages/ciphernode/init/src/lib.rs diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore new file mode 100644 index 0000000000..e8c12ff4fe --- /dev/null +++ b/examples/basic/.gitignore @@ -0,0 +1,17 @@ +node_modules +.env + +# Hardhat files +/cache +/artifacts + +# TypeChain files +/typechain +/typechain-types + +# solidity-coverage files +/coverage +/coverage.json + +# Hardhat Ignition default folder for deployments against a local node +ignition/deployments/chain-31337 diff --git a/examples/basic/README.md b/examples/basic/README.md new file mode 100644 index 0000000000..17f8ed190d --- /dev/null +++ b/examples/basic/README.md @@ -0,0 +1,13 @@ +# Sample Hardhat Project + +This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a Hardhat Ignition module that deploys that contract. + +Try running some of the following tasks: + +```shell +npx hardhat help +npx hardhat test +REPORT_GAS=true npx hardhat test +npx hardhat node +npx hardhat ignition deploy ./ignition/modules/Lock.ts +``` diff --git a/examples/basic/contracts/Lock.sol b/examples/basic/contracts/Lock.sol new file mode 100644 index 0000000000..2f385f70ed --- /dev/null +++ b/examples/basic/contracts/Lock.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.28; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/examples/basic/hardhat.config.ts b/examples/basic/hardhat.config.ts new file mode 100644 index 0000000000..0e8962a6ef --- /dev/null +++ b/examples/basic/hardhat.config.ts @@ -0,0 +1,8 @@ +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; + +const config: HardhatUserConfig = { + solidity: "0.8.28", +}; + +export default config; diff --git a/examples/basic/ignition/modules/Lock.ts b/examples/basic/ignition/modules/Lock.ts new file mode 100644 index 0000000000..9ee4a2f1bb --- /dev/null +++ b/examples/basic/ignition/modules/Lock.ts @@ -0,0 +1,20 @@ +// This setup uses Hardhat Ignition to manage smart contract deployments. +// Learn more about it at https://hardhat.org/ignition + +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +const JAN_1ST_2030 = 1893456000; +const ONE_GWEI: bigint = 1_000_000_000n; + +const LockModule = buildModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime", JAN_1ST_2030); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); + + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); + + return { lock }; +}); + +export default LockModule; diff --git a/examples/basic/package.json b/examples/basic/package.json new file mode 100644 index 0000000000..e1608641f3 --- /dev/null +++ b/examples/basic/package.json @@ -0,0 +1,25 @@ +{ + "name": "hardhat-project", + "devDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-ignition": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=18.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.14.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.0", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": ">=4.5.0" + } +} diff --git a/examples/basic/test/Lock.ts b/examples/basic/test/Lock.ts new file mode 100644 index 0000000000..160dbfa163 --- /dev/null +++ b/examples/basic/test/Lock.ts @@ -0,0 +1,127 @@ +import { + time, + loadFixture, +} from "@nomicfoundation/hardhat-toolbox/network-helpers"; +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +import { expect } from "chai"; +import hre from "hardhat"; + +describe("Lock", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await hre.ethers.getSigners(); + + const Lock = await hre.ethers.getContractFactory("Lock"); + const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.unlockTime()).to.equal(unlockTime); + }); + + it("Should set the right owner", async function () { + const { lock, owner } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.owner()).to.equal(owner.address); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + expect(await hre.ethers.provider.getBalance(lock.target)).to.equal( + lockedAmount + ); + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const latestTime = await time.latest(); + const Lock = await hre.ethers.getContractFactory("Lock"); + await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( + "Unlock time should be in the future" + ); + }); + }); + + describe("Withdrawals", function () { + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + const { lock } = await loadFixture(deployOneYearLockFixture); + + await expect(lock.withdraw()).to.be.revertedWith( + "You can't withdraw yet" + ); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime, otherAccount } = await loadFixture( + deployOneYearLockFixture + ); + + // We can increase the time in Hardhat Network + await time.increaseTo(unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( + "You aren't the owner" + ); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + const { lock, unlockTime } = await loadFixture( + deployOneYearLockFixture + ); + + // Transactions are sent using the first signer by default + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).not.to.be.reverted; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()) + .to.emit(lock, "Withdrawal") + .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg + }); + }); + + describe("Transfers", function () { + it("Should transfer the funds to the owner", async function () { + const { lock, unlockTime, lockedAmount, owner } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).to.changeEtherBalances( + [owner, lock], + [lockedAmount, -lockedAmount] + ); + }); + }); + }); +}); diff --git a/examples/basic/tsconfig.json b/examples/basic/tsconfig.json new file mode 100644 index 0000000000..574e785c71 --- /dev/null +++ b/examples/basic/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 86e3117982..9e6e8d5aac 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1353,6 +1353,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "async-std" version = "1.13.1" @@ -2422,6 +2433,7 @@ dependencies = [ "config", "crypto", "dialoguer", + "enclave-init", "enclave_core", "events", "hex", @@ -2439,6 +2451,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enclave-init" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-recursion", + "git2", + "tokio", +] + [[package]] name = "enclave-sdk" version = "0.1.0" @@ -3061,6 +3083,21 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "git2" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +dependencies = [ + "bitflags 2.9.0", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + [[package]] name = "glob" version = "0.3.2" @@ -3899,6 +3936,20 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libgit2-sys" +version = "0.18.1+1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + [[package]] name = "libm" version = "0.2.14" @@ -4286,6 +4337,32 @@ dependencies = [ "libc", ] +[[package]] +name = "libssh2-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.6" diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 33209b252c..918e6ff68f 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -10,6 +10,7 @@ members = [ "events", "evm", "fhe", + "init", "keyshare", "logger", "net", @@ -31,6 +32,7 @@ data = { path = "./data" } e3_request = { path = "./e3_request" } enclave = { path = "./enclave" } enclave_core = { path = "./enclave_core" } +enclave-init = { path = "./init" } events = { path = "./events" } evm = { path = "./evm" } fhe = { path = "./fhe" } @@ -56,6 +58,7 @@ argon2 = "0.5.2" anyhow = "1.0.86" async-std = { version = "1.12", features = ["attributes"] } async-trait = "0.1" +async-recursion = "1.1.1" bincode = "1.3.3" bloom = "0.3.2" bs58 = "0.5.1" @@ -71,6 +74,7 @@ fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } figment = { version = "0.10.19", features = ["yaml", "test"] } futures = "0.3.30" futures-util = "0.3" +git2 = "0.20.2" hex = "0.4.3" lazy_static = "1.5.0" num = "0.4.3" diff --git a/packages/ciphernode/enclave/Cargo.toml b/packages/ciphernode/enclave/Cargo.toml index 1e47e8d4a6..9f6c3cb829 100644 --- a/packages/ciphernode/enclave/Cargo.toml +++ b/packages/ciphernode/enclave/Cargo.toml @@ -14,6 +14,7 @@ config = { workspace = true } crypto = { workspace = true } dialoguer = { workspace = true } enclave_core = { workspace = true } +enclave-init = { workspace = true } events = { workspace = true } hex = { workspace = true } opentelemetry = { workspace = true } diff --git a/packages/ciphernode/enclave/src/cli.rs b/packages/ciphernode/enclave/src/cli.rs index afc70f6730..31dc59bb99 100644 --- a/packages/ciphernode/enclave/src/cli.rs +++ b/packages/ciphernode/enclave/src/cli.rs @@ -1,11 +1,10 @@ use crate::helpers::telemetry::setup_tracing; -use crate::net; use crate::net::NetCommands; use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::start; use crate::wallet::WalletCommands; -use crate::{init, password, wallet}; +use crate::{init, net, password, wallet, wizard}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; use config::validation::ValidUrl; @@ -82,7 +81,8 @@ impl Cli { { // Existing init branch match self.command { - Commands::Init { + Commands::Init => init::execute().await?, + Commands::Wizard { rpc_url, eth_address, password, @@ -90,7 +90,7 @@ impl Cli { net_keypair, generate_net_keypair, } => { - init::execute( + wizard::execute( rpc_url, eth_address, password, @@ -130,6 +130,9 @@ impl Cli { Commands::Init { .. } => { bail!("Cannot run `enclave init` when a configuration exists."); } + Commands::Wizard { .. } => { + bail!("Cannot run `enclave wizard` when a configuration exists."); + } Commands::Nodes { command } => { nodes::execute(command, &config, self.verbose, self.config).await? } @@ -171,6 +174,9 @@ pub enum Commands { peers: Vec, }, + /// Initialize an enclave project + Init, + /// Password management commands Password { #[command(subcommand)] @@ -189,8 +195,9 @@ pub enum Commands { command: NetCommands, }, + #[command(hide = true)] /// Initialize your ciphernode by setting up a configuration - Init { + Wizard { /// An rpc url for enclave to connect to #[arg(long = "rpc-url")] rpc_url: Option, diff --git a/packages/ciphernode/enclave/src/init.rs b/packages/ciphernode/enclave/src/init.rs index cbdb6ae69c..cde34a1e5a 100644 --- a/packages/ciphernode/enclave/src/init.rs +++ b/packages/ciphernode/enclave/src/init.rs @@ -1,79 +1,5 @@ use anyhow::Result; -use dialoguer::{theme::ColorfulTheme, Input}; -use enclave_core::init; -use tracing::instrument; -use crate::net; -use crate::net::{NetCommands, NetKeypairCommands}; -use crate::password; -use crate::password::PasswordCommands; - -#[instrument(name = "app", skip_all)] -pub async fn execute( - rpc_url: Option, - eth_address: Option, - password: Option, - skip_eth: bool, - net_keypair: Option, - generate_net_keypair: bool, -) -> Result<()> { - let rpc_url = match rpc_url { - Some(url) => { - init::validate_rpc_url(&url)?; - url - } - None => Input::::new() - .with_prompt("Enter WebSocket devnet RPC URL") - .default("wss://ethereum-sepolia-rpc.publicnode.com".to_string()) - .validate_with(init::validate_rpc_url) - .interact_text()?, - }; - - let eth_address: Option = match eth_address { - Some(address) => { - init::validate_eth_address(&address)?; - Some(address) - } - None => { - if skip_eth { - None - } else { - Input::with_theme(&ColorfulTheme::default()) - .with_prompt("Enter your Ethereum address (press Enter to skip)") - .allow_empty(true) - .validate_with(init::validate_eth_address) - .interact() - .ok() - .map(|s| if s.is_empty() { None } else { Some(s) }) - .flatten() - } - } - }; - - let config = init::execute(rpc_url, eth_address).await?; - - password::execute(PasswordCommands::Set { password }, &config).await?; - - if generate_net_keypair { - net::execute( - NetCommands::Keypair { - command: NetKeypairCommands::Generate, - }, - &config, - ) - .await?; - } else { - net::execute( - NetCommands::Keypair { - command: NetKeypairCommands::Set { net_keypair }, - }, - &config, - ) - .await?; - } - - println!("Enclave configuration successfully created!"); - println!("You can start your node using `enclave start`"); - - Ok(()) +pub async fn execute() -> Result<()> { + enclave_init::execute().await } diff --git a/packages/ciphernode/enclave/src/main.rs b/packages/ciphernode/enclave/src/main.rs index 4ea408655b..f0af8c9ded 100644 --- a/packages/ciphernode/enclave/src/main.rs +++ b/packages/ciphernode/enclave/src/main.rs @@ -24,6 +24,7 @@ mod password_set; mod start; mod wallet; mod wallet_set; +mod wizard; const OWO: &str = r#" ___ ___ ___ ___ ___ diff --git a/packages/ciphernode/enclave/src/wizard.rs b/packages/ciphernode/enclave/src/wizard.rs new file mode 100644 index 0000000000..9e352579d5 --- /dev/null +++ b/packages/ciphernode/enclave/src/wizard.rs @@ -0,0 +1,79 @@ +use anyhow::Result; +use dialoguer::{theme::ColorfulTheme, Input}; +use enclave_core::wizard; +use tracing::instrument; + +use crate::net; +use crate::net::{NetCommands, NetKeypairCommands}; +use crate::password; +use crate::password::PasswordCommands; + +#[instrument(name = "app", skip_all)] +pub async fn execute( + rpc_url: Option, + eth_address: Option, + password: Option, + skip_eth: bool, + net_keypair: Option, + generate_net_keypair: bool, +) -> Result<()> { + let rpc_url = match rpc_url { + Some(url) => { + wizard::validate_rpc_url(&url)?; + url + } + None => Input::::new() + .with_prompt("Enter WebSocket devnet RPC URL") + .default("wss://ethereum-sepolia-rpc.publicnode.com".to_string()) + .validate_with(wizard::validate_rpc_url) + .interact_text()?, + }; + + let eth_address: Option = match eth_address { + Some(address) => { + wizard::validate_eth_address(&address)?; + Some(address) + } + None => { + if skip_eth { + None + } else { + Input::with_theme(&ColorfulTheme::default()) + .with_prompt("Enter your Ethereum address (press Enter to skip)") + .allow_empty(true) + .validate_with(wizard::validate_eth_address) + .interact() + .ok() + .map(|s| if s.is_empty() { None } else { Some(s) }) + .flatten() + } + } + }; + + let config = wizard::execute(rpc_url, eth_address).await?; + + password::execute(PasswordCommands::Set { password }, &config).await?; + + if generate_net_keypair { + net::execute( + NetCommands::Keypair { + command: NetKeypairCommands::Generate, + }, + &config, + ) + .await?; + } else { + net::execute( + NetCommands::Keypair { + command: NetKeypairCommands::Set { net_keypair }, + }, + &config, + ) + .await?; + } + + println!("Enclave configuration successfully created!"); + println!("You can start your node using `enclave start`"); + + Ok(()) +} diff --git a/packages/ciphernode/enclave_core/src/lib.rs b/packages/ciphernode/enclave_core/src/lib.rs index f596700e63..cf6229f249 100644 --- a/packages/ciphernode/enclave_core/src/lib.rs +++ b/packages/ciphernode/enclave_core/src/lib.rs @@ -1,7 +1,7 @@ pub mod helpers; -pub mod init; pub mod net; pub mod nodes; pub mod password; pub mod start; pub mod wallet; +pub mod wizard; diff --git a/packages/ciphernode/enclave_core/src/init/mod.rs b/packages/ciphernode/enclave_core/src/wizard/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/init/mod.rs rename to packages/ciphernode/enclave_core/src/wizard/mod.rs diff --git a/packages/ciphernode/init/Cargo.toml b/packages/ciphernode/init/Cargo.toml new file mode 100644 index 0000000000..9037b6a50e --- /dev/null +++ b/packages/ciphernode/init/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "enclave-init" +version.workspace = true +edition.workspace = true + +[dependencies] +anyhow.workspace = true +tokio.workspace = true +git2.workspace = true +async-recursion.workspace = true diff --git a/packages/ciphernode/init/src/lib.rs b/packages/ciphernode/init/src/lib.rs new file mode 100644 index 0000000000..244c99ea32 --- /dev/null +++ b/packages/ciphernode/init/src/lib.rs @@ -0,0 +1,180 @@ +use anyhow::{bail, Result}; +use async_recursion::async_recursion; +use git2::{FetchOptions, IndexAddOption, Repository, Signature}; +use std::env; +use std::path::Path; +use tokio::process::Command as TokioCommand; + +pub async fn execute() -> Result<()> { + let github_repo = "https://github.com/gnosisguild/enclave.git"; + let template_folder = "examples/basic"; + let branch = "ry/389-enclave-init-crisp"; + let temp_dir = "/tmp/enclave-basic-example"; + let cwd = env::current_dir()?; + check_empty_folder(&cwd)?; + clone_repo(github_repo, template_folder, branch, temp_dir).await?; + Pnpm::run(&["install"]).await?; + init_git_repo_if_needed(&cwd).await?; + Ok(()) +} + +pub struct Pnpm; + +impl Pnpm { + pub async fn is_available() -> bool { + TokioCommand::new("pnpm") + .arg("--version") + .output() + .await + .map(|output| output.status.success()) + .unwrap_or(false) + } + + pub async fn run(args: &[&str]) -> Result<()> { + let cwd = env::current_dir()?; + Self::run_in_dir(&cwd, args).await + } + + pub async fn run_in_dir>(dir: P, args: &[&str]) -> Result<()> { + if !Self::is_available().await { + bail!("pnpm is not installed or not available in PATH"); + } + + let status = TokioCommand::new("pnpm") + .args(args) + .current_dir(dir) + .status() + .await?; + + if status.success() { + Ok(()) + } else { + bail!("pnpm command failed with exit code: {:?}", status.code()); + } + } +} + +fn is_git_repository>(dir: P) -> bool { + Repository::open(dir.as_ref()).is_ok() +} + +async fn init_git_repo_if_needed>(dir: P) -> Result<()> { + let dir = dir.as_ref(); + + // Check if directory is already a git repository + if is_git_repository(dir) { + println!("Directory is already a git repository, skipping initialization."); + return Ok(()); + } + + println!("Initializing git repository..."); + + // Initialize new git repository + let repo = Repository::init(dir)?; + + // Get the repository index + let mut index = repo.index()?; + + // Add all files to the index + index.add_all(["*"].iter(), IndexAddOption::DEFAULT, None)?; + index.write()?; + + // Create the tree from the index + let tree_id = index.write_tree()?; + let tree = repo.find_tree(tree_id)?; + + // Create signature for the commit + let signature = Signature::now("Enclave Init", "developers@enclave.gg")?; + + // Create the initial commit + repo.commit( + Some("HEAD"), + &signature, + &signature, + "Initial commit", + &tree, + &[], + )?; + + println!("Git repository initialized with initial commit."); + Ok(()) +} + +pub fn check_empty_folder>(path: P) -> Result<()> { + let path = path.as_ref(); + + if !path.exists() { + bail!("Path '{}' does not exist", path.display()); + } + if !path.is_dir() { + bail!("Path '{}' is not a directory", path.display()); + } + + let mut entries = std::fs::read_dir(path) + .map_err(|e| anyhow::anyhow!("Failed to read directory '{}': {}", path.display(), e))?; + + if entries.next().is_some() { + bail!("Directory '{}' is not empty", path.display()); + } + + Ok(()) +} +async fn clone_repo( + github_repo: &str, + template_folder: &str, + branch: &str, + temp_dir: &str, +) -> Result<()> { + if Path::new(temp_dir).exists() { + tokio::fs::remove_dir_all(temp_dir).await?; + } + + println!("Cloning repository..."); + let mut fetch_options = FetchOptions::new(); + fetch_options.download_tags(git2::AutotagOption::None); + + let mut builder = git2::build::RepoBuilder::new(); + builder.fetch_options(fetch_options); + builder.branch(branch); + builder.clone(github_repo, Path::new(temp_dir))?; + + let source_path = Path::new(temp_dir).join(template_folder); + + if !source_path.exists() { + anyhow::bail!( + "Template folder '{}' not found in repository", + template_folder + ); + } + + // Get current working directory + let cwd = std::env::current_dir()?; + + // Copy contents using async filesystem operations + println!("Copying template contents to current directory..."); + copy_dir_contents_async(&source_path, &cwd).await?; + + // Clean up temporary directory + tokio::fs::remove_dir_all(temp_dir).await?; + + println!("Template copied successfully!"); + Ok(()) +} + +#[async_recursion] +async fn copy_dir_contents_async(src: &Path, dst: &Path) -> Result<()> { + let mut entries = tokio::fs::read_dir(src).await?; + + while let Some(entry) = entries.next_entry().await? { + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + + if src_path.is_dir() { + tokio::fs::create_dir_all(&dst_path).await?; + copy_dir_contents_async(&src_path, &dst_path).await?; + } else { + tokio::fs::copy(&src_path, &dst_path).await?; + } + } + Ok(()) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eda5e903cb..3ff9477186 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -267,6 +267,69 @@ importers: specifier: ^3.3.0 version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + examples/basic: + devDependencies: + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.0 + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.0 + version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers': + specifier: ^0.15.0 + version: 0.15.11(adcb435609ba3eedf4e14820144ed57f) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^5.0.0 + version: 5.0.0(34b660bf6f3b32c6dc1600e0ee083f08) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.0 + version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': + specifier: ^0.5.0 + version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.20 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.10 + '@types/node': + specifier: '>=18.0.0' + version: 22.7.5 + chai: + specifier: ^4.2.0 + version: 4.5.0 + ethers: + specifier: ^6.4.0 + version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: + specifier: ^2.14.0 + version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + ts-node: + specifier: '>=8.0.0' + version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + typechain: + specifier: ^8.3.0 + version: 8.3.2(typescript@5.8.2) + typescript: + specifier: '>=4.5.0' + version: 5.8.2 + packages/evm: dependencies: '@excubiae/contracts': @@ -10443,6 +10506,17 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@types/chai-as-promised': 7.1.8 + chai: 4.5.0 + chai-as-promised: 7.1.2(chai@4.5.0) + deep-eql: 4.1.4 + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + ordinal: 1.0.3 + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.0(supports-color@5.5.0) @@ -10461,6 +10535,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.0(supports-color@8.1.1) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) @@ -10474,13 +10557,21 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(adcb435609ba3eedf4e14820144ed57f)': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 10.1.0 hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -10520,6 +10611,27 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 + '@nomicfoundation/hardhat-toolbox@5.0.0(34b660bf6f3b32c6dc1600e0ee083f08)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(adcb435609ba3eedf4e14820144ed57f) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 22.7.5 + chai: 4.5.0 + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + typechain: 8.3.2(typescript@5.8.2) + typescript: 5.8.2 + '@nomicfoundation/hardhat-toolbox@5.0.0(b285d134f7bebf40fffb5d0c9e92a2e9)': dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10561,7 +10673,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -10576,7 +10688,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -11295,6 +11407,14 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.2) + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + fs-extra: 9.1.0 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.8.2) + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.7 @@ -11322,11 +11442,11 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/bn.js@5.1.6': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/chai-as-promised@7.1.8': dependencies: @@ -11336,7 +11456,7 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/d3-scale-chromatic@3.1.0': {} @@ -11358,7 +11478,7 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/fs-extra@11.0.4': dependencies: @@ -11368,7 +11488,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/hast@2.3.10': dependencies: @@ -11430,7 +11550,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/prettier@2.7.3': {} @@ -11457,7 +11577,7 @@ snapshots: '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/tinycolor2@1.4.6': {} @@ -12053,7 +12173,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13899,7 +14019,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -14357,7 +14477,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -14641,7 +14761,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17782,7 +17902,7 @@ snapshots: typechain@8.3.2(typescript@5.8.2): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 From e2d7f371095ec5ae2f10e9b9731cf63e8c27dd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 29 May 2025 11:24:52 +0000 Subject: [PATCH 027/106] Fix broken dockerfile (#451) --- packages/ciphernode/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 6d1358665f..d3affa3d96 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -32,6 +32,7 @@ COPY ./packages/ciphernode/e3_request/Cargo.toml ./e3_request/Cargo.toml COPY ./packages/ciphernode/enclave/Cargo.toml ./enclave/Cargo.toml COPY ./packages/ciphernode/enclave_core/Cargo.toml ./enclave_core/Cargo.toml COPY ./packages/ciphernode/enclave_core/build.rs ./enclave_core/build.rs +COPY ./packages/ciphernode/init/Cargo.toml ./init/Cargo.toml COPY ./packages/ciphernode/events/Cargo.toml ./events/Cargo.toml COPY ./packages/ciphernode/evm/Cargo.toml ./evm/Cargo.toml COPY ./packages/ciphernode/fhe/Cargo.toml ./fhe/Cargo.toml From 533beb8fbaa4d68c8eebe3e08b09783ef838dd9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 30 May 2025 15:56:39 +0000 Subject: [PATCH 028/106] Refactor enclave-sdk -> e3-sdk (#455) * delete the deleteme * Extract out packages * e3-sdk * e3-sdk is compiling and running cn tests * Crisp is compiling * Remove old command * Update dockerfile... hmm * Remove leading slash * Copy everything * Tidy up lint scripts * Tidy up linting scripts * Update cargo tomls * Only use evm:lint for evm ci * Do we need to build fixtures for lint to work? * Fix build script missing... --- .deleteme | 1 - .github/workflows/ci.yml | 2 +- .github/workflows/rust-ci.yml | 6 - examples/CRISP/apps/program/Cargo.lock | 345 +- examples/CRISP/apps/program/core/Cargo.toml | 2 +- examples/CRISP/apps/program/core/src/lib.rs | 2 +- .../apps/program/methods/guest/Cargo.lock | 1593 +++++- examples/CRISP/apps/server/Cargo.lock | 65 +- examples/CRISP/apps/server/Cargo.toml | 2 +- examples/CRISP/apps/server/Dockerfile | 36 +- .../CRISP/apps/server/src/cli/commands.rs | 4 +- .../CRISP/apps/server/src/server/app_data.rs | 2 +- .../CRISP/apps/server/src/server/database.rs | 2 +- .../CRISP/apps/server/src/server/indexer.rs | 4 +- examples/CRISP/apps/server/src/server/mod.rs | 2 +- examples/CRISP/apps/server/src/server/repo.rs | 2 +- .../apps/server/src/server/routes/rounds.rs | 4 +- .../apps/server/src/server/routes/voting.rs | 2 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 622 +-- examples/CRISP/apps/wasm-crypto/Cargo.toml | 2 +- examples/CRISP/apps/wasm-crypto/src/lib.rs | 2 +- package.json | 6 +- packages/ciphernode/Cargo.lock | 161 +- packages/ciphernode/Cargo.toml | 18 +- packages/ciphernode/Dockerfile | 49 +- packages/ciphernode/bfv-helpers/Cargo.toml | 10 + .../bfv-helpers/src/lib.rs} | 0 packages/ciphernode/evm-helpers/Cargo.toml | 12 + .../evm-helpers}/scripts/build_fixtures.sh | 0 .../evm-helpers/src}/contracts.rs | 0 .../evm-helpers/src}/events.rs | 0 .../evm-helpers/src/lib.rs} | 0 .../evm-helpers/src}/listener.rs | 0 .../evm-helpers}/tests/fixtures/.gitignore | 0 .../evm-helpers}/tests/fixtures/emit_logs.sol | 0 .../tests/fixtures/fake_enclave.sol | 0 .../evm-helpers}/tests/helpers.rs | 0 .../evm-helpers}/tests/listener.rs | 2 +- packages/ciphernode/fhe/Cargo.toml | 2 +- packages/ciphernode/fhe/src/fhe.rs | 2 +- packages/ciphernode/fhe/src/utils.rs | 2 +- packages/ciphernode/indexer/Cargo.toml | 14 + .../indexer/scripts/build_fixtures.sh | 22 + .../indexer/src}/indexer.rs | 17 +- .../mod.rs => ciphernode/indexer/src/lib.rs} | 0 .../indexer/src}/models.rs | 0 .../indexer/src}/repo.rs | 0 .../indexer/src}/traits.rs | 0 .../indexer/tests/fixtures/.gitignore | 2 + .../indexer/tests/fixtures/emit_logs.sol | 28 + .../indexer/tests/fixtures/fake_enclave.sol | 100 + packages/ciphernode/indexer/tests/helpers.rs | 56 + .../indexer}/tests/indexer.rs | 2 +- packages/ciphernode/scripts/build_fixtures.sh | 4 + packages/ciphernode/scripts/lint.sh | 5 + packages/ciphernode/scripts/test.sh | 2 +- packages/ciphernode/sdk/Cargo.toml | 9 + packages/ciphernode/sdk/src/lib.rs | 3 + packages/ciphernode/test_helpers/Cargo.toml | 2 +- .../test_helpers/src/bin/fake_encrypt.rs | 2 +- .../test_helpers/src/bin/pack_e3_params.rs | 2 +- packages/ciphernode/tests/Cargo.toml | 2 +- .../tests/test_aggregation_and_decryption.rs | 2 +- packages/enclave-sdk/Cargo.lock | 4312 ----------------- packages/enclave-sdk/Cargo.toml | 43 - packages/enclave-sdk/rust-toolchain.toml | 3 - packages/enclave-sdk/scripts/test.sh | 7 - packages/enclave-sdk/src/lib.rs | 7 - 68 files changed, 2483 insertions(+), 5129 deletions(-) delete mode 100644 .deleteme create mode 100644 packages/ciphernode/bfv-helpers/Cargo.toml rename packages/{enclave-sdk/src/bfv/mod.rs => ciphernode/bfv-helpers/src/lib.rs} (100%) create mode 100644 packages/ciphernode/evm-helpers/Cargo.toml rename packages/{enclave-sdk => ciphernode/evm-helpers}/scripts/build_fixtures.sh (100%) rename packages/{enclave-sdk/src/evm => ciphernode/evm-helpers/src}/contracts.rs (100%) rename packages/{enclave-sdk/src/evm => ciphernode/evm-helpers/src}/events.rs (100%) rename packages/{enclave-sdk/src/evm/mod.rs => ciphernode/evm-helpers/src/lib.rs} (100%) rename packages/{enclave-sdk/src/evm => ciphernode/evm-helpers/src}/listener.rs (100%) rename packages/{enclave-sdk => ciphernode/evm-helpers}/tests/fixtures/.gitignore (100%) rename packages/{enclave-sdk => ciphernode/evm-helpers}/tests/fixtures/emit_logs.sol (100%) rename packages/{enclave-sdk => ciphernode/evm-helpers}/tests/fixtures/fake_enclave.sol (100%) rename packages/{enclave-sdk => ciphernode/evm-helpers}/tests/helpers.rs (100%) rename packages/{enclave-sdk => ciphernode/evm-helpers}/tests/listener.rs (99%) create mode 100644 packages/ciphernode/indexer/Cargo.toml create mode 100755 packages/ciphernode/indexer/scripts/build_fixtures.sh rename packages/{enclave-sdk/src/indexer => ciphernode/indexer/src}/indexer.rs (97%) rename packages/{enclave-sdk/src/indexer/mod.rs => ciphernode/indexer/src/lib.rs} (100%) rename packages/{enclave-sdk/src/indexer => ciphernode/indexer/src}/models.rs (100%) rename packages/{enclave-sdk/src/indexer => ciphernode/indexer/src}/repo.rs (100%) rename packages/{enclave-sdk/src/indexer => ciphernode/indexer/src}/traits.rs (100%) create mode 100644 packages/ciphernode/indexer/tests/fixtures/.gitignore create mode 100644 packages/ciphernode/indexer/tests/fixtures/emit_logs.sol create mode 100644 packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol create mode 100644 packages/ciphernode/indexer/tests/helpers.rs rename packages/{enclave-sdk => ciphernode/indexer}/tests/indexer.rs (97%) create mode 100755 packages/ciphernode/scripts/build_fixtures.sh create mode 100755 packages/ciphernode/scripts/lint.sh create mode 100644 packages/ciphernode/sdk/Cargo.toml create mode 100644 packages/ciphernode/sdk/src/lib.rs delete mode 100644 packages/enclave-sdk/Cargo.lock delete mode 100644 packages/enclave-sdk/Cargo.toml delete mode 100644 packages/enclave-sdk/rust-toolchain.toml delete mode 100755 packages/enclave-sdk/scripts/test.sh delete mode 100644 packages/enclave-sdk/src/lib.rs diff --git a/.deleteme b/.deleteme deleted file mode 100644 index afcd3158e2..0000000000 --- a/.deleteme +++ /dev/null @@ -1 +0,0 @@ -This is a file to signify the start of the hacknet branch and should be deleted with the first PR diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a28db27c7..c71f3de08d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,7 +47,7 @@ jobs: run: "pnpm install" - name: "Lint the code" - run: "pnpm lint" + run: "pnpm evm:lint" - name: "Add lint summary" run: | diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index e01132fef9..93000410a9 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -49,12 +49,6 @@ jobs: - name: "Compile the contracts and generate the TypeChain bindings" run: "pnpm typechain" - - name: Checking code format sdk - run: pnpm sdk:lint - - - name: Run tests - run: "pnpm sdk:test" - - name: Checking code format ciphernode run: pnpm ciphernode:lint diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 622cb35e89..a9d258e498 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -207,6 +207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", + "getrandom 0.3.2", "once_cell", "version_check", "zerocopy", @@ -251,7 +252,11 @@ dependencies = [ "alloy-consensus 0.8.3", "alloy-core", "alloy-eips 0.8.3", + "alloy-genesis 0.8.3", + "alloy-provider 0.8.3", + "alloy-rpc-client 0.8.3", "alloy-serde 0.8.3", + "alloy-transport-http 0.8.3", ] [[package]] @@ -264,16 +269,16 @@ dependencies = [ "alloy-contract", "alloy-core", "alloy-eips 0.12.6", - "alloy-genesis", - "alloy-network", - "alloy-provider", - "alloy-rpc-client", + "alloy-genesis 0.12.6", + "alloy-network 0.12.6", + "alloy-provider 0.12.6", + "alloy-rpc-client 0.12.6", "alloy-rpc-types", "alloy-serde 0.12.6", - "alloy-signer", + "alloy-signer 0.12.6", "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", ] [[package]] @@ -299,6 +304,7 @@ dependencies = [ "alloy-serde 0.8.3", "alloy-trie", "auto_impl", + "c-kzg", "derive_more 1.0.0", "serde", ] @@ -326,6 +332,20 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "serde", +] + [[package]] name = "alloy-consensus-any" version = "0.12.6" @@ -349,13 +369,13 @@ dependencies = [ "alloy-consensus 0.12.6", "alloy-dyn-abi", "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", + "alloy-network 0.12.6", + "alloy-network-primitives 0.12.6", "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-eth", + "alloy-provider 0.12.6", + "alloy-rpc-types-eth 0.12.6", "alloy-sol-types", - "alloy-transport", + "alloy-transport 0.12.6", "futures", "futures-util", "thiserror 2.0.12", @@ -452,6 +472,7 @@ dependencies = [ "alloy-serde 0.8.3", "c-kzg", "derive_more 1.0.0", + "once_cell", "serde", "sha2", ] @@ -477,6 +498,18 @@ dependencies = [ "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde 0.8.3", + "alloy-trie", + "serde", +] + [[package]] name = "alloy-genesis" version = "0.12.6" @@ -502,6 +535,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "alloy-json-rpc" version = "0.12.6" @@ -516,6 +563,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-consensus-any 0.8.3", + "alloy-eips 0.8.3", + "alloy-json-rpc 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rpc-types-any 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-serde 0.8.3", + "alloy-signer 0.8.3", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "alloy-network" version = "0.12.6" @@ -523,15 +595,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" dependencies = [ "alloy-consensus 0.12.6", - "alloy-consensus-any", + "alloy-consensus-any 0.12.6", "alloy-eips 0.12.6", - "alloy-json-rpc", - "alloy-network-primitives", + "alloy-json-rpc 0.12.6", + "alloy-network-primitives 0.12.6", "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", + "alloy-rpc-types-any 0.12.6", + "alloy-rpc-types-eth 0.12.6", "alloy-serde 0.12.6", - "alloy-signer", + "alloy-signer 0.12.6", "alloy-sol-types", "async-trait", "auto_impl", @@ -542,6 +614,19 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-serde 0.8.3", + "serde", +] + [[package]] name = "alloy-network-primitives" version = "0.12.6" @@ -582,6 +667,43 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-json-rpc 0.8.3", + "alloy-network 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rpc-client 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-transport 0.8.3", + "alloy-transport-http 0.8.3", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru 0.12.5", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + [[package]] name = "alloy-provider" version = "0.12.6" @@ -591,22 +713,22 @@ dependencies = [ "alloy-chains", "alloy-consensus 0.12.6", "alloy-eips 0.12.6", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", + "alloy-json-rpc 0.12.6", + "alloy-network 0.12.6", + "alloy-network-primitives 0.12.6", "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", + "alloy-rpc-client 0.12.6", + "alloy-rpc-types-eth 0.12.6", "alloy-sol-types", - "alloy-transport", - "alloy-transport-http", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", "async-stream", "async-trait", "auto_impl", "dashmap", "futures", "futures-utils-wasm", - "lru", + "lru 0.13.0", "parking_lot", "pin-project", "reqwest", @@ -641,16 +763,39 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc 0.8.3", + "alloy-primitives", + "alloy-transport 0.8.3", + "alloy-transport-http 0.8.3", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + [[package]] name = "alloy-rpc-client" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" dependencies = [ - "alloy-json-rpc", + "alloy-json-rpc 0.12.6", "alloy-primitives", - "alloy-transport", - "alloy-transport-http", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", "async-stream", "futures", "pin-project", @@ -673,22 +818,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 0.12.6", "alloy-serde 0.12.6", "serde", ] +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-serde 0.8.3", +] + [[package]] name = "alloy-rpc-types-any" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", + "alloy-consensus-any 0.12.6", + "alloy-rpc-types-eth 0.12.6", "alloy-serde 0.12.6", ] +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-consensus-any 0.8.3", + "alloy-eips 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + [[package]] name = "alloy-rpc-types-eth" version = "0.12.6" @@ -696,9 +872,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" dependencies = [ "alloy-consensus 0.12.6", - "alloy-consensus-any", + "alloy-consensus-any 0.12.6", "alloy-eips 0.12.6", - "alloy-network-primitives", + "alloy-network-primitives 0.12.6", "alloy-primitives", "alloy-rlp", "alloy-serde 0.12.6", @@ -731,6 +907,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + [[package]] name = "alloy-signer" version = "0.12.6" @@ -753,9 +943,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" dependencies = [ "alloy-consensus 0.12.6", - "alloy-network", + "alloy-network 0.12.6", "alloy-primitives", - "alloy-signer", + "alloy-signer 0.12.6", "async-trait", "k256", "rand 0.8.5", @@ -836,13 +1026,33 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc 0.8.3", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + [[package]] name = "alloy-transport" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" dependencies = [ - "alloy-json-rpc", + "alloy-json-rpc 0.12.6", "base64", "derive_more 2.0.1", "futures", @@ -858,14 +1068,29 @@ dependencies = [ "wasmtimer", ] +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc 0.8.3", + "alloy-transport 0.8.3", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + [[package]] name = "alloy-transport-http" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" dependencies = [ - "alloy-json-rpc", - "alloy-transport", + "alloy-json-rpc 0.12.6", + "alloy-transport 0.12.6", "reqwest", "serde_json", "tower", @@ -2078,6 +2303,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", + "unicode-xid", ] [[package]] @@ -2179,6 +2405,15 @@ dependencies = [ "proc-macro-error", ] +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy 0.8.3", + "fhe", + "fhe-traits", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -2253,16 +2488,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy 0.8.3", - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "encoding_rs" version = "0.8.35" @@ -3398,6 +3623,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + [[package]] name = "lru" version = "0.13.0" @@ -4945,6 +5179,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -5850,7 +6095,7 @@ name = "voting-core" version = "0.1.0" dependencies = [ "compute-provider", - "enclave-sdk", + "e3-bfv-helpers", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index 89bb54ca97..07bcdefc41 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -7,4 +7,4 @@ edition = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } compute-provider = { path = "../../../../../packages/compute_provider" } -enclave-sdk = { path = "../../../../../packages/enclave-sdk", default-features = false, features = ["risc0"] } +e3-bfv-helpers = { path = "../../../../../packages/ciphernode/bfv-helpers" } diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index 0f91950e45..3227a6214f 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,5 +1,5 @@ use compute_provider::FHEInputs; -use enclave_sdk::bfv::decode_bfv_params_arc; +use e3_bfv_helpers::decode_bfv_params_arc; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 5282d7bd94..a5d3824b9e 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -9,6 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -38,7 +54,22 @@ dependencies = [ "alloy-consensus", "alloy-core", "alloy-eips", + "alloy-genesis", + "alloy-provider", + "alloy-rpc-client", "alloy-serde", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum", ] [[package]] @@ -53,10 +84,25 @@ dependencies = [ "alloy-serde", "alloy-trie", "auto_impl", + "c-kzg", "derive_more 1.0.0", "serde", ] +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-core" version = "0.8.25" @@ -64,6 +110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" dependencies = [ "alloy-dyn-abi", + "alloy-json-abi", "alloy-primitives", "alloy-rlp", "alloy-sol-types", @@ -81,6 +128,8 @@ dependencies = [ "alloy-sol-types", "const-hex", "itoa", + "serde", + "serde_json", "winnow 0.7.10", ] @@ -120,10 +169,23 @@ dependencies = [ "alloy-serde", "c-kzg", "derive_more 1.0.0", + "once_cell", "serde", "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + [[package]] name = "alloy-json-abi" version = "0.8.25" @@ -136,6 +198,58 @@ dependencies = [ "serde_json", ] +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-primitives" version = "0.8.25" @@ -163,6 +277,43 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + [[package]] name = "alloy-rlp" version = "0.3.12" @@ -185,6 +336,60 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + [[package]] name = "alloy-serde" version = "0.8.3" @@ -196,6 +401,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + [[package]] name = "alloy-sol-macro" version = "0.8.25" @@ -267,6 +486,41 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + [[package]] name = "alloy-trie" version = "0.7.9" @@ -689,6 +943,39 @@ dependencies = [ "serde", ] +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "auto_impl" version = "1.2.0" @@ -706,12 +993,33 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -825,6 +1133,12 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + [[package]] name = "byte-slice-cast" version = "1.2.2" @@ -877,6 +1191,7 @@ dependencies = [ "glob", "hex", "libc", + "once_cell", "serde", ] @@ -1031,6 +1346,20 @@ dependencies = [ "typenum", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.7.9" @@ -1079,6 +1408,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.98", + "unicode-xid", ] [[package]] @@ -1114,6 +1444,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -1132,6 +1473,15 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -1201,16 +1551,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "fhe", - "fhe-traits", -] - [[package]] name = "enum-ordinalize" version = "4.3.0" @@ -1244,7 +1584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1309,7 +1649,7 @@ dependencies = [ "rand", "rand_chacha", "serde", - "thiserror", + "thiserror 1.0.61", "zeroize", "zeroize_derive", ] @@ -1332,7 +1672,7 @@ dependencies = [ "rand", "rand_chacha", "sha2", - "thiserror", + "thiserror 1.0.61", "zeroize", ] @@ -1387,6 +1727,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1394,7 +1743,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1408,12 +1757,27 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "funty" version = "2.0.0" @@ -1421,32 +1785,133 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "generic-array" -version = "0.14.7" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "typenum", - "version_check", - "zeroize", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "getrandom" -version = "0.2.15" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "cfg-if", - "libc", - "wasi", + "futures-core", + "futures-sink", ] [[package]] -name = "glob" -version = "0.3.2" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "group" @@ -1481,6 +1946,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.2" @@ -1529,6 +2000,208 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower 0.4.13", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -1566,6 +2239,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + [[package]] name = "itertools" version = "0.10.5" @@ -1599,6 +2278,16 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.13.3" @@ -1670,7 +2359,7 @@ dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", "num-bigint", - "thiserror", + "thiserror 1.0.61", ] [[package]] @@ -1679,12 +2368,37 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + [[package]] name = "macro-string" version = "0.1.4" @@ -1742,18 +2456,61 @@ dependencies = [ "bitflags 2.5.0", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.59.0", +] + [[package]] name = "multimap" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndarray" version = "0.15.6" @@ -1874,13 +2631,35 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "nybbles" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ + "alloy-rlp", "const-hex", + "proptest", "serde", "smallvec", ] @@ -1894,6 +2673,15 @@ dependencies = [ "malloc_buf", ] +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -1901,20 +2689,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "parity-scale-codec" -version = "3.6.12" +name = "openssl" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] + "bitflags 2.5.0", + "cfg-if", + "foreign-types 0.3.2", + "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.98", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] name = "parity-scale-codec-derive" version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1926,12 +2758,41 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[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.10" @@ -1939,7 +2800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.61", "ucd-trie", ] @@ -1953,12 +2814,38 @@ dependencies = [ "indexmap", ] +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "pin-project-lite" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkcs8" version = "0.10.2" @@ -1969,6 +2856,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "postcard" version = "1.1.1" @@ -1981,6 +2874,15 @@ dependencies = [ "serde", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2219,6 +3121,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "regex" version = "1.10.6" @@ -2248,6 +3159,45 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +[[package]] +name = "reqwest" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -2487,6 +3437,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + [[package]] name = "rustc-hash" version = "2.1.1" @@ -2527,9 +3483,33 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "rusty-fork" version = "0.3.0" @@ -2548,6 +3528,32 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "sec1" version = "0.7.3" @@ -2562,6 +3568,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.11.0" @@ -2621,6 +3650,18 @@ dependencies = [ "serde", ] +[[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 = "sha2" version = "0.10.8" @@ -2668,6 +3709,15 @@ dependencies = [ "rand_core", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -2677,6 +3727,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -2703,12 +3763,40 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.98", +] + [[package]] name = "subtle" version = "2.5.0" @@ -2749,6 +3837,26 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "tap" version = "1.0.1" @@ -2764,7 +3872,7 @@ dependencies = [ "cfg-if", "fastrand", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2773,7 +3881,16 @@ version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.61", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -2787,6 +3904,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -2805,6 +3933,78 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[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-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml_datetime" version = "0.6.6" @@ -2822,6 +4022,47 @@ dependencies = [ "winnow 0.5.40", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.40" @@ -2864,6 +4105,12 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" @@ -2906,12 +4153,35 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[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" @@ -2923,7 +4193,7 @@ name = "voting-core" version = "0.1.0" dependencies = [ "compute-provider", - "enclave-sdk", + "e3-bfv-helpers", "fhe", "fhe-traits", ] @@ -2937,12 +4207,146 @@ dependencies = [ "libc", ] +[[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.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.98", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2952,6 +4356,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -3034,6 +4447,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "wyz" version = "0.5.1" @@ -3043,6 +4462,30 @@ dependencies = [ "tap", ] +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.34" @@ -3063,6 +4506,27 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -3082,3 +4546,36 @@ dependencies = [ "quote", "syn 2.0.98", ] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 43184c1098..6f0ff67d19 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -1706,7 +1706,7 @@ dependencies = [ "config", "dialoguer", "dotenvy", - "enclave-sdk", + "e3-sdk", "env_logger", "eyre", "fhe", @@ -1953,6 +1953,50 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + +[[package]] +name = "e3-evm-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "async-trait", + "eyre", + "futures", + "futures-util", + "tokio", +] + +[[package]] +name = "e3-indexer" +version = "0.1.0" +dependencies = [ + "alloy", + "async-trait", + "bincode", + "e3-evm-helpers", + "eyre", + "serde", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "e3-sdk" +version = "0.1.0" +dependencies = [ + "e3-bfv-helpers", + "e3-evm-helpers", + "e3-indexer", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -1992,25 +2036,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "async-trait", - "bincode", - "chrono", - "eyre", - "fhe", - "fhe-traits", - "futures", - "futures-util", - "serde", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "encode_unicode" version = "1.0.0" diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index 7e0657017b..fe41358540 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -38,7 +38,7 @@ sha2 = "0.10.8" # Local dependencies compute-provider = { path = "../../../../packages/compute_provider" } -enclave-sdk = { path = "../../../../packages/enclave-sdk" } +e3-sdk = { path = "../../../../packages/ciphernode/sdk" } program-client = { path = "../program/client" } # CLI and user interaction diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 85e3850eb3..cce13a4408 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -31,7 +31,8 @@ COPY examples/CRISP/apps/program/Cargo.toml examples/CRISP/apps/program/ COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/host/ COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ -COPY packages/enclave-sdk/Cargo.toml packages/enclave-sdk/ +COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/ +COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.lock packages/ciphernode/ COPY packages/compute_provider/Cargo.toml packages/compute_provider/ WORKDIR /app/examples/CRISP/apps/server @@ -52,13 +53,38 @@ COPY examples/CRISP/apps/program/Cargo.toml examples/CRISP/apps/program/ COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/host/ COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ -COPY packages/enclave-sdk/Cargo.toml packages/enclave-sdk/ + +# find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" +COPY packages/ciphernode/aggregator/Cargo.toml packages/ciphernode/aggregator/Cargo.toml +COPY packages/ciphernode/bfv-helpers/Cargo.toml packages/ciphernode/bfv-helpers/Cargo.toml +COPY packages/ciphernode/Cargo.lock packages/ciphernode/Cargo.lock +COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.toml +COPY packages/ciphernode/config/Cargo.toml packages/ciphernode/config/Cargo.toml +COPY packages/ciphernode/crypto/Cargo.toml packages/ciphernode/crypto/Cargo.toml +COPY packages/ciphernode/data/Cargo.toml packages/ciphernode/data/Cargo.toml +COPY packages/ciphernode/e3_request/Cargo.toml packages/ciphernode/e3_request/Cargo.toml +COPY packages/ciphernode/enclave/Cargo.toml packages/ciphernode/enclave/Cargo.toml +COPY packages/ciphernode/enclave_core/Cargo.toml packages/ciphernode/enclave_core/Cargo.toml +COPY packages/ciphernode/events/Cargo.toml packages/ciphernode/events/Cargo.toml +COPY packages/ciphernode/evm/Cargo.toml packages/ciphernode/evm/Cargo.toml +COPY packages/ciphernode/evm-helpers/Cargo.toml packages/ciphernode/evm-helpers/Cargo.toml +COPY packages/ciphernode/fhe/Cargo.toml packages/ciphernode/fhe/Cargo.toml +COPY packages/ciphernode/indexer/Cargo.toml packages/ciphernode/indexer/Cargo.toml +COPY packages/ciphernode/init/Cargo.toml packages/ciphernode/init/Cargo.toml +COPY packages/ciphernode/keyshare/Cargo.toml packages/ciphernode/keyshare/Cargo.toml +COPY packages/ciphernode/logger/Cargo.toml packages/ciphernode/logger/Cargo.toml +COPY packages/ciphernode/net/Cargo.toml packages/ciphernode/net/Cargo.toml +COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/Cargo.toml +COPY packages/ciphernode/sortition/Cargo.toml packages/ciphernode/sortition/Cargo.toml +COPY packages/ciphernode/test_helpers/Cargo.toml packages/ciphernode/test_helpers/Cargo.toml +COPY packages/ciphernode/tests/Cargo.toml packages/ciphernode/tests/Cargo.toml + COPY packages/compute_provider/Cargo.toml packages/compute_provider/ RUN set -eux; \ find \ examples/CRISP/apps/program \ - packages/enclave-sdk \ + packages/ciphernode \ packages/compute_provider \ -type f -name Cargo.toml ! -path '*/target/*' -print0 \ | while IFS= read -r -d '' manifest_path; do \ @@ -88,7 +114,7 @@ WORKDIR /app COPY examples/CRISP/apps/server/ examples/CRISP/apps/server/ COPY examples/CRISP/apps/program/ examples/CRISP/apps/program/ -COPY packages/enclave-sdk/ packages/enclave-sdk/ +COPY packages/ciphernode/ packages/ciphernode/ COPY packages/compute_provider/ packages/compute_provider/ WORKDIR /app/examples/CRISP/apps/server @@ -104,4 +130,4 @@ WORKDIR / COPY --from=builder /app/dist/server \ /usr/local/bin/server -ENTRYPOINT ["/usr/local/bin/server"] \ No newline at end of file +ENTRYPOINT ["/usr/local/bin/server"] diff --git a/examples/CRISP/apps/server/src/cli/commands.rs b/examples/CRISP/apps/server/src/cli/commands.rs index ac3205f49e..968544d558 100644 --- a/examples/CRISP/apps/server/src/cli/commands.rs +++ b/examples/CRISP/apps/server/src/cli/commands.rs @@ -7,8 +7,8 @@ use serde::{Deserialize, Serialize}; use super::{CLI_DB, CONFIG}; use alloy::primitives::{Address, Bytes, U256}; use crisp::server::config::CONFIG as SERVER_CONFIG; // TODO: unify configuration -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite, ReadOnly}; +use e3_sdk::bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite, ReadOnly}; use fhe_rs::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ DeserializeParametrized, FheDecoder, FheDecrypter, FheEncoder, FheEncrypter, diff --git a/examples/CRISP/apps/server/src/server/app_data.rs b/examples/CRISP/apps/server/src/server/app_data.rs index d60ffc6225..fbad55f8d0 100644 --- a/examples/CRISP/apps/server/src/server/app_data.rs +++ b/examples/CRISP/apps/server/src/server/app_data.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use enclave_sdk::indexer::SharedStore; +use e3_sdk::indexer::SharedStore; use tokio::sync::RwLock; use super::{ diff --git a/examples/CRISP/apps/server/src/server/database.rs b/examples/CRISP/apps/server/src/server/database.rs index cbac6642e8..38902067cf 100644 --- a/examples/CRISP/apps/server/src/server/database.rs +++ b/examples/CRISP/apps/server/src/server/database.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use enclave_sdk::indexer::DataStore; +use e3_sdk::indexer::DataStore; use log::error; use rand::Rng; use serde::{de::DeserializeOwned, Serialize}; diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs index 68f3a4cd16..759ed6d284 100644 --- a/examples/CRISP/apps/server/src/server/indexer.rs +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -3,8 +3,8 @@ use crate::server::{ repo::{CrispE3Repository, CurrentRoundRepository}, }; use compute_provider::FHEInputs; -use enclave_sdk::{ - evm::{ +use e3_sdk::{ + evm_helpers::{ contracts::{ EnclaveContract, EnclaveContractFactory, EnclaveRead, EnclaveWrite, ReadWrite, }, diff --git a/examples/CRISP/apps/server/src/server/mod.rs b/examples/CRISP/apps/server/src/server/mod.rs index 77b0deb658..083afb567f 100644 --- a/examples/CRISP/apps/server/src/server/mod.rs +++ b/examples/CRISP/apps/server/src/server/mod.rs @@ -12,7 +12,7 @@ use actix_cors::Cors; use actix_web::{middleware::Logger, web, App, HttpServer}; use app_data::AppData; use database::SledDB; -use enclave_sdk::indexer::SharedStore; +use e3_sdk::indexer::SharedStore; use eyre::OptionExt; use indexer::start_indexer; use tokio::sync::RwLock; diff --git a/examples/CRISP/apps/server/src/server/repo.rs b/examples/CRISP/apps/server/src/server/repo.rs index 6bfcefda11..e3de88a068 100644 --- a/examples/CRISP/apps/server/src/server/repo.rs +++ b/examples/CRISP/apps/server/src/server/repo.rs @@ -3,7 +3,7 @@ use super::{ models::{CurrentRound, E3Crisp, E3StateLite, WebResultRequest}, }; use chrono::Utc; -use enclave_sdk::indexer::{models::E3 as EnclaveE3, DataStore, E3Repository, SharedStore}; +use e3_sdk::indexer::{models::E3 as EnclaveE3, DataStore, E3Repository, SharedStore}; use eyre::Result; use log::info; diff --git a/examples/CRISP/apps/server/src/server/routes/rounds.rs b/examples/CRISP/apps/server/src/server/routes/rounds.rs index e9024255ec..0981f20b04 100644 --- a/examples/CRISP/apps/server/src/server/routes/rounds.rs +++ b/examples/CRISP/apps/server/src/server/routes/rounds.rs @@ -6,8 +6,8 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; +use e3_sdk::bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index 84eee2d0fe..b22da5608e 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -10,7 +10,7 @@ use alloy::{ dyn_abi::DynSolValue, primitives::{Bytes, U256}, }; -use enclave_sdk::evm::contracts::{EnclaveContract, EnclaveWrite}; +use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveWrite}; use eyre::Error; use log::{error, info}; diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 3a111fd065..0eaae144ca 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -73,21 +73,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ "alloy-consensus", - "alloy-contract", "alloy-core", "alloy-eips", - "alloy-network", - "alloy-node-bindings", + "alloy-genesis", "alloy-provider", - "alloy-pubsub", "alloy-rpc-client", - "alloy-rpc-types", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", + "alloy-serde", "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", ] [[package]] @@ -115,7 +107,6 @@ dependencies = [ "auto_impl", "c-kzg", "derive_more 1.0.0", - "k256", "serde", ] @@ -133,27 +124,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-contract" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror 2.0.12", -] - [[package]] name = "alloy-core" version = "0.8.25" @@ -163,6 +133,7 @@ dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-primitives", + "alloy-rlp", "alloy-sol-types", ] @@ -203,7 +174,6 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more 1.0.0", - "k256", "serde", ] @@ -301,23 +271,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-node-bindings" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" -dependencies = [ - "alloy-genesis", - "alloy-primitives", - "k256", - "rand", - "serde_json", - "tempfile", - "thiserror 2.0.12", - "tracing", - "url", -] - [[package]] name = "alloy-primitives" version = "0.8.25" @@ -357,18 +310,11 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-node-bindings", "alloy-primitives", - "alloy-pubsub", "alloy-rpc-client", - "alloy-rpc-types-anvil", "alloy-rpc-types-eth", - "alloy-signer", - "alloy-signer-local", "alloy-transport", "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", "async-stream", "async-trait", "auto_impl", @@ -389,25 +335,6 @@ dependencies = [ "wasmtimer", ] -[[package]] -name = "alloy-pubsub" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "bimap", - "futures", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", -] - [[package]] name = "alloy-rlp" version = "0.3.12" @@ -438,11 +365,8 @@ checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ "alloy-json-rpc", "alloy-primitives", - "alloy-pubsub", "alloy-transport", "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", "futures", "pin-project", "reqwest 0.12.5", @@ -456,31 +380,6 @@ dependencies = [ "wasmtimer", ] -[[package]] -name = "alloy-rpc-types" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-anvil" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - [[package]] name = "alloy-rpc-types-any" version = "0.8.3" @@ -492,22 +391,6 @@ dependencies = [ "alloy-serde", ] -[[package]] -name = "alloy-rpc-types-engine" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more 1.0.0", - "serde", - "strum 0.26.2", -] - [[package]] name = "alloy-rpc-types-eth" version = "0.8.3" @@ -553,22 +436,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "alloy-signer-local" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand", - "thiserror 2.0.12", -] - [[package]] name = "alloy-sol-macro" version = "0.8.25" @@ -589,7 +456,6 @@ version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" dependencies = [ - "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", @@ -608,14 +474,12 @@ version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" dependencies = [ - "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "macro-string", "proc-macro2", "quote", - "serde_json", "syn 2.0.101", "syn-solidity", ] @@ -678,43 +542,6 @@ dependencies = [ "url", ] -[[package]] -name = "alloy-transport-ipc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "alloy-transport-ws" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http 1.3.1", - "rustls 0.23.27", - "serde_json", - "tokio", - "tokio-tungstenite 0.24.0", - "tracing", - "ws_stream_wasm", -] - [[package]] name = "alloy-trie" version = "0.7.9" @@ -731,21 +558,6 @@ dependencies = [ "tracing", ] -[[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 = "anyhow" version = "1.0.98" @@ -1006,12 +818,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - [[package]] name = "bincode" version = "1.3.3" @@ -1208,12 +1014,7 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets 0.52.5", ] [[package]] @@ -1377,7 +1178,7 @@ dependencies = [ "bincode", "console", "console_log", - "enclave-sdk", + "e3-bfv-helpers", "ethers", "fhe", "fhe-math", @@ -1632,18 +1433,21 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - [[package]] name = "dunce" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -1692,25 +1496,6 @@ dependencies = [ "log", ] -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "async-trait", - "bincode", - "chrono", - "eyre", - "fhe", - "fhe-traits", - "futures", - "futures-util", - "serde", - "thiserror 1.0.58", - "tokio", -] - [[package]] name = "encode_unicode" version = "0.3.6" @@ -2017,7 +1802,7 @@ dependencies = [ "serde_json", "thiserror 1.0.58", "tokio", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite", "tracing", "tracing-futures", "url", @@ -2227,6 +2012,21 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[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" @@ -2664,9 +2464,25 @@ dependencies = [ "futures-util", "http 0.2.12", "hyper 0.14.28", - "rustls 0.21.10", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.5.2", + "hyper-util", + "native-tls", "tokio", - "tokio-rustls 0.24.1", + "tokio-native-tls", + "tower-service", ] [[package]] @@ -2689,30 +2505,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "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 = "idna" version = "0.5.0" @@ -2796,21 +2588,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "interprocess" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - [[package]] name = "ipnet" version = "2.9.0" @@ -3095,6 +2872,23 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndarray" version = "0.15.6" @@ -3248,7 +3042,9 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ + "alloy-rlp", "const-hex", + "proptest", "serde", "smallvec", ] @@ -3293,6 +3089,50 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "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.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3816,12 +3656,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - [[package]] name = "redox_syscall" version = "0.4.1" @@ -3894,21 +3728,21 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.10", - "rustls-pemfile", + "rustls", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", "system-configuration", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.25.4", + "webpki-roots", "winreg 0.50.0", ] @@ -3926,19 +3760,23 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.5.2", + "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", + "tokio-native-tls", "tower-service", "url", "wasm-bindgen", @@ -4105,31 +3943,26 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring 0.17.8", - "rustls-webpki 0.101.7", + "rustls-webpki", "sct", ] [[package]] -name = "rustls" -version = "0.23.27" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "once_cell", - "ring 0.17.8", - "rustls-pki-types", - "rustls-webpki 0.103.3", - "subtle", - "zeroize", + "base64 0.21.7", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", + "rustls-pki-types", ] [[package]] @@ -4151,17 +3984,6 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "rustls-webpki" -version = "0.103.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" -dependencies = [ - "ring 0.17.8", - "rustls-pki-types", - "untrusted 0.9.0", -] - [[package]] name = "rustversion" version = "1.0.15" @@ -4228,6 +4050,15 @@ dependencies = [ "syn 1.0.109", ] +[[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 = "schnellru" version = "0.2.4" @@ -4287,6 +4118,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.11.0" @@ -4421,15 +4275,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - [[package]] name = "signature" version = "2.2.0" @@ -4822,9 +4667,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", @@ -4842,22 +4685,22 @@ dependencies = [ ] [[package]] -name = "tokio-rustls" -version = "0.24.1" +name = "tokio-native-tls" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "rustls 0.21.10", + "native-tls", "tokio", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.23.27", + "rustls", "tokio", ] @@ -4881,27 +4724,11 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls 0.21.10", + "rustls", "tokio", - "tokio-rustls 0.24.1", - "tungstenite 0.20.1", - "webpki-roots 0.25.4", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" -dependencies = [ - "futures-util", - "log", - "rustls 0.23.27", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.2", - "tungstenite 0.24.0", - "webpki-roots 0.26.11", + "tokio-rustls", + "tungstenite", + "webpki-roots", ] [[package]] @@ -5086,33 +4913,13 @@ dependencies = [ "httparse", "log", "rand", - "rustls 0.21.10", + "rustls", "sha1", "thiserror 1.0.58", "url", "utf-8", ] -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.3.1", - "httparse", - "log", - "rand", - "rustls 0.23.27", - "rustls-pki-types", - "sha1", - "thiserror 1.0.58", - "utf-8", -] - [[package]] name = "typenum" version = "1.17.0" @@ -5221,6 +5028,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[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" @@ -5393,30 +5206,6 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "widestring" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" - [[package]] name = "winapi" version = "0.3.9" @@ -5448,65 +5237,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.48.0" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index a6252c5a79..a6f087024c 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -enclave-sdk = { path = "../../../../packages/enclave-sdk" } +e3-bfv-helpers = { path = "../../../../packages/ciphernode/bfv-helpers" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index 89f9ab0a76..03381757d5 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -2,7 +2,7 @@ mod greco; mod util; use console_log; -use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use e3_bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; use rand::thread_rng; diff --git a/package.json b/package.json index f7e4983c8a..f4e70241e3 100644 --- a/package.json +++ b/package.json @@ -11,20 +11,18 @@ "scripts": { "clean": "cd packages/evm && pnpm clean", "compile": "pnpm evm:compile && pnpm ciphernode:build", - "lint": "pnpm evm:lint && pnpm ciphernode:lint && pnpm sdk:lint", + "lint": "pnpm evm:lint && pnpm ciphernode:lint", "typechain": "pnpm evm:typechain", "test": "pnpm evm:test && pnpm ciphernode:test", "test:integration": "cd ./tests/integration && ./test.sh", "coverage": "pnpm evm:coverage", "prepare": "husky", "enclave": "cd packages/ciphernode && ./scripts/launch.sh", - "ciphernode:lint": "cd packages/ciphernode && cargo fmt -- --check", + "ciphernode:lint": "cd packages/ciphernode && ./scripts/lint.sh", "ciphernode:add": "cd packages/evm && pnpm ciphernode:add", "ciphernode:remove": "cd packages/evm && pnpm ciphernode:remove", "ciphernode:test": "cd packages/ciphernode && ./scripts/test.sh", "ciphernode:build": "cd packages/ciphernode && cargo build --release", - "sdk:test": "cd packages/enclave-sdk && ./scripts/test.sh", - "sdk:lint": "cd packages/enclave-sdk && cargo fmt -- --check", "preciphernode:build": "pnpm evm:compile", "committee:new": "cd packages/evm && pnpm committee:new", "committee:publish": "cd packages/evm && pnpm hardhat committee:publish", diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 9e6e8d5aac..842c345c44 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1000,21 +1000,6 @@ dependencies = [ "tracing", ] -[[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 = "anstream" version = "0.6.18" @@ -1764,12 +1749,7 @@ version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-link", ] [[package]] @@ -2343,6 +2323,50 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "fhe 0.1.0-beta.7", + "fhe-traits", +] + +[[package]] +name = "e3-evm-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "async-trait", + "eyre", + "futures", + "futures-util", + "tokio", +] + +[[package]] +name = "e3-indexer" +version = "0.1.0" +dependencies = [ + "alloy", + "async-trait", + "bincode", + "e3-evm-helpers", + "eyre", + "serde", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "e3-sdk" +version = "0.1.0" +dependencies = [ + "e3-bfv-helpers", + "e3-evm-helpers", + "e3-indexer", +] + [[package]] name = "e3_request" version = "0.1.0" @@ -2461,25 +2485,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "async-trait", - "bincode", - "chrono", - "eyre", - "fhe 0.1.0-beta.7", - "fhe-traits", - "futures", - "futures-util", - "serde", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "enclave_core" version = "0.1.0" @@ -2718,8 +2723,8 @@ dependencies = [ "bincode", "config", "data", + "e3-bfv-helpers", "e3_request", - "enclave-sdk", "events", "fhe 0.1.0-beta.7", "fhe-traits", @@ -3470,30 +3475,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.61.0", -] - -[[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 = "icu_collections" version = "1.5.0" @@ -6657,7 +6638,7 @@ dependencies = [ "actix", "bincode", "clap", - "enclave-sdk", + "e3-sdk", "events", "fhe 0.1.0", "fhe 0.1.0-beta.7", @@ -6682,8 +6663,8 @@ dependencies = [ "clap", "crypto", "data", + "e3-sdk", "e3_request", - "enclave-sdk", "events", "evm", "fhe 0.1.0", @@ -7463,7 +7444,7 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "windows-core 0.53.0", + "windows-core", "windows-targets 0.52.6", ] @@ -7477,41 +7458,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result 0.3.2", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "windows-link" version = "0.1.1" @@ -7525,7 +7471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result 0.3.2", - "windows-strings 0.3.1", + "windows-strings", "windows-targets 0.53.0", ] @@ -7556,15 +7502,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.48.0" diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 918e6ff68f..7572c6a290 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -1,19 +1,23 @@ [workspace] members = [ - "aggregator", + "aggregator", "config", "crypto", "data", + "bfv-helpers", + "evm-helpers", + "indexer", "e3_request", "enclave", "enclave_core", "events", - "evm", - "fhe", + "evm", + "fhe", "init", "keyshare", "logger", - "net", + "net", + "sdk", "sortition", "test_helpers", "tests", @@ -26,16 +30,20 @@ edition = "2021" [workspace.dependencies] aggregator = { path = "./aggregator" } +e3-bfv-helpers = { path = "./bfv-helpers" } config = { path = "./config" } crypto = { path = "./crypto" } data = { path = "./data" } e3_request = { path = "./e3_request" } +e3-sdk = { path = "./sdk" } enclave = { path = "./enclave" } enclave_core = { path = "./enclave_core" } enclave-init = { path = "./init" } events = { path = "./events" } evm = { path = "./evm" } +e3-evm-helpers = { path = "./evm-helpers" } fhe = { path = "./fhe" } +e3-indexer = { path = "./indexer" } keyshare = { path = "./keyshare" } logger = { path = "./logger" } net = { path = "./net" } @@ -67,6 +75,7 @@ clap = { version = "4.5.17", features = ["derive"] } compile-time = "0.2.0" dirs = "5.0.1" dialoguer = "0.11.0" +eyre = { version = "0.6.12" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git" } @@ -98,6 +107,7 @@ serde_yaml = "0.9.34" sha2 = "0.10.8" shellexpand = "3.1.0" tempfile = "3.14.0" +thiserror = { version = "1.0.58" } tokio = { version = "1.38", features = ["full"] } tracing = "0.1.37" tracing-opentelemetry = "0.30.0" diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index d3affa3d96..57e5481599 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -21,32 +21,35 @@ WORKDIR /build/packages/ciphernode COPY --from=evm-builder /build/packages/evm/artifacts ../evm/artifacts COPY --from=evm-builder /build/packages/evm/deployments ../evm/deployments -# Copy workpace Cargo.toml -COPY ./packages/ciphernode/Cargo.toml ./Cargo.toml -COPY ./packages/ciphernode/Cargo.lock ./Cargo.lock -COPY ./packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml -COPY ./packages/ciphernode/config/Cargo.toml ./config/Cargo.toml -COPY ./packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml -COPY ./packages/ciphernode/data/Cargo.toml ./data/Cargo.toml -COPY ./packages/ciphernode/e3_request/Cargo.toml ./e3_request/Cargo.toml -COPY ./packages/ciphernode/enclave/Cargo.toml ./enclave/Cargo.toml -COPY ./packages/ciphernode/enclave_core/Cargo.toml ./enclave_core/Cargo.toml + +# find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) packages/ciphernode/|COPY \1 ./|' +COPY packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml +COPY packages/ciphernode/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml +COPY packages/ciphernode/Cargo.lock ./Cargo.lock +COPY packages/ciphernode/Cargo.toml ./Cargo.toml +COPY packages/ciphernode/config/Cargo.toml ./config/Cargo.toml +COPY packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml +COPY packages/ciphernode/data/Cargo.toml ./data/Cargo.toml +COPY packages/ciphernode/e3_request/Cargo.toml ./e3_request/Cargo.toml +COPY packages/ciphernode/enclave/Cargo.toml ./enclave/Cargo.toml +COPY packages/ciphernode/enclave_core/Cargo.toml ./enclave_core/Cargo.toml +COPY packages/ciphernode/events/Cargo.toml ./events/Cargo.toml +COPY packages/ciphernode/evm/Cargo.toml ./evm/Cargo.toml +COPY packages/ciphernode/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml +COPY packages/ciphernode/fhe/Cargo.toml ./fhe/Cargo.toml +COPY packages/ciphernode/indexer/Cargo.toml ./indexer/Cargo.toml +COPY packages/ciphernode/init/Cargo.toml ./init/Cargo.toml +COPY packages/ciphernode/keyshare/Cargo.toml ./keyshare/Cargo.toml +COPY packages/ciphernode/logger/Cargo.toml ./logger/Cargo.toml +COPY packages/ciphernode/net/Cargo.toml ./net/Cargo.toml +COPY packages/ciphernode/sdk/Cargo.toml ./sdk/Cargo.toml +COPY packages/ciphernode/sortition/Cargo.toml ./sortition/Cargo.toml +COPY packages/ciphernode/test_helpers/Cargo.toml ./test_helpers/Cargo.toml +COPY packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml + COPY ./packages/ciphernode/enclave_core/build.rs ./enclave_core/build.rs -COPY ./packages/ciphernode/init/Cargo.toml ./init/Cargo.toml -COPY ./packages/ciphernode/events/Cargo.toml ./events/Cargo.toml -COPY ./packages/ciphernode/evm/Cargo.toml ./evm/Cargo.toml -COPY ./packages/ciphernode/fhe/Cargo.toml ./fhe/Cargo.toml -COPY ./packages/ciphernode/keyshare/Cargo.toml ./keyshare/Cargo.toml -COPY ./packages/ciphernode/logger/Cargo.toml ./logger/Cargo.toml -COPY ./packages/ciphernode/net/Cargo.toml ./net/Cargo.toml -COPY ./packages/ciphernode/sortition/Cargo.toml ./sortition/Cargo.toml -COPY ./packages/ciphernode/test_helpers/Cargo.toml ./test_helpers/Cargo.toml -COPY ./packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml COPY ./packages/ciphernode/rust-toolchain.toml . -# Copy enclave-sdk package -COPY ./packages/enclave-sdk ../enclave-sdk - RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ mkdir -p "$d/src" && \ diff --git a/packages/ciphernode/bfv-helpers/Cargo.toml b/packages/ciphernode/bfv-helpers/Cargo.toml new file mode 100644 index 0000000000..296d1ea397 --- /dev/null +++ b/packages/ciphernode/bfv-helpers/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "e3-bfv-helpers" +version.workspace = true +edition.workspace = true + +[dependencies] +alloy = { version = "0.8.3" , features = ["dyn-abi", "rlp", "serde"] } +fhe-traits.workspace = true +fhe_rs.workspace = true + diff --git a/packages/enclave-sdk/src/bfv/mod.rs b/packages/ciphernode/bfv-helpers/src/lib.rs similarity index 100% rename from packages/enclave-sdk/src/bfv/mod.rs rename to packages/ciphernode/bfv-helpers/src/lib.rs diff --git a/packages/ciphernode/evm-helpers/Cargo.toml b/packages/ciphernode/evm-helpers/Cargo.toml new file mode 100644 index 0000000000..0540c5a23d --- /dev/null +++ b/packages/ciphernode/evm-helpers/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "e3-evm-helpers" +version.workspace = true +edition.workspace = true + +[dependencies] +alloy.workspace = true +async-trait.workspace = true +eyre.workspace = true +futures.workspace = true +futures-util.workspace = true +tokio.workspace = true diff --git a/packages/enclave-sdk/scripts/build_fixtures.sh b/packages/ciphernode/evm-helpers/scripts/build_fixtures.sh similarity index 100% rename from packages/enclave-sdk/scripts/build_fixtures.sh rename to packages/ciphernode/evm-helpers/scripts/build_fixtures.sh diff --git a/packages/enclave-sdk/src/evm/contracts.rs b/packages/ciphernode/evm-helpers/src/contracts.rs similarity index 100% rename from packages/enclave-sdk/src/evm/contracts.rs rename to packages/ciphernode/evm-helpers/src/contracts.rs diff --git a/packages/enclave-sdk/src/evm/events.rs b/packages/ciphernode/evm-helpers/src/events.rs similarity index 100% rename from packages/enclave-sdk/src/evm/events.rs rename to packages/ciphernode/evm-helpers/src/events.rs diff --git a/packages/enclave-sdk/src/evm/mod.rs b/packages/ciphernode/evm-helpers/src/lib.rs similarity index 100% rename from packages/enclave-sdk/src/evm/mod.rs rename to packages/ciphernode/evm-helpers/src/lib.rs diff --git a/packages/enclave-sdk/src/evm/listener.rs b/packages/ciphernode/evm-helpers/src/listener.rs similarity index 100% rename from packages/enclave-sdk/src/evm/listener.rs rename to packages/ciphernode/evm-helpers/src/listener.rs diff --git a/packages/enclave-sdk/tests/fixtures/.gitignore b/packages/ciphernode/evm-helpers/tests/fixtures/.gitignore similarity index 100% rename from packages/enclave-sdk/tests/fixtures/.gitignore rename to packages/ciphernode/evm-helpers/tests/fixtures/.gitignore diff --git a/packages/enclave-sdk/tests/fixtures/emit_logs.sol b/packages/ciphernode/evm-helpers/tests/fixtures/emit_logs.sol similarity index 100% rename from packages/enclave-sdk/tests/fixtures/emit_logs.sol rename to packages/ciphernode/evm-helpers/tests/fixtures/emit_logs.sol diff --git a/packages/enclave-sdk/tests/fixtures/fake_enclave.sol b/packages/ciphernode/evm-helpers/tests/fixtures/fake_enclave.sol similarity index 100% rename from packages/enclave-sdk/tests/fixtures/fake_enclave.sol rename to packages/ciphernode/evm-helpers/tests/fixtures/fake_enclave.sol diff --git a/packages/enclave-sdk/tests/helpers.rs b/packages/ciphernode/evm-helpers/tests/helpers.rs similarity index 100% rename from packages/enclave-sdk/tests/helpers.rs rename to packages/ciphernode/evm-helpers/tests/helpers.rs diff --git a/packages/enclave-sdk/tests/listener.rs b/packages/ciphernode/evm-helpers/tests/listener.rs similarity index 99% rename from packages/enclave-sdk/tests/listener.rs rename to packages/ciphernode/evm-helpers/tests/listener.rs index 2cac1e0fae..b120232d19 100644 --- a/packages/enclave-sdk/tests/listener.rs +++ b/packages/ciphernode/evm-helpers/tests/listener.rs @@ -1,6 +1,6 @@ mod helpers; use alloy::sol; -use enclave_sdk::evm::listener::EventListener; +use e3_evm_helpers::listener::EventListener; use eyre::Result; use helpers::setup_logs_contract; use std::time::Duration; diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index 84ad02ee5f..bb4005742d 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -18,4 +18,4 @@ rand = { workspace = true } rand_chacha = { workspace = true } e3_request = { workspace = true } serde = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +e3-bfv-helpers = { workspace = true } diff --git a/packages/ciphernode/fhe/src/fhe.rs b/packages/ciphernode/fhe/src/fhe.rs index e981d3f265..7d5b8425dd 100644 --- a/packages/ciphernode/fhe/src/fhe.rs +++ b/packages/ciphernode/fhe/src/fhe.rs @@ -2,7 +2,7 @@ use super::set_up_crp; use anyhow::*; use async_trait::async_trait; use data::{FromSnapshotWithParams, Snapshot}; -use enclave_sdk::bfv::{build_bfv_params_arc, decode_bfv_params_arc}; +use e3_bfv_helpers::{build_bfv_params_arc, decode_bfv_params_arc}; use events::{OrderedSet, Seed}; use fhe_rs::{ bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}, diff --git a/packages/ciphernode/fhe/src/utils.rs b/packages/ciphernode/fhe/src/utils.rs index fcca593899..84b10ceab6 100644 --- a/packages/ciphernode/fhe/src/utils.rs +++ b/packages/ciphernode/fhe/src/utils.rs @@ -1,5 +1,5 @@ use super::SharedRng; -use enclave_sdk::bfv::build_bfv_params_arc; +use e3_bfv_helpers::build_bfv_params_arc; use fhe_rs::bfv::BfvParameters; use fhe_rs::mbfv::CommonRandomPoly; use fhe_traits::Serialize; diff --git a/packages/ciphernode/indexer/Cargo.toml b/packages/ciphernode/indexer/Cargo.toml new file mode 100644 index 0000000000..7a00553a2d --- /dev/null +++ b/packages/ciphernode/indexer/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "e3-indexer" +version.workspace = true +edition.workspace = true + +[dependencies] +alloy.workspace = true +async-trait.workspace = true +bincode.workspace = true +e3-evm-helpers.workspace = true +eyre.workspace = true +serde.workspace = true +thiserror.workspace = true +tokio.workspace = true diff --git a/packages/ciphernode/indexer/scripts/build_fixtures.sh b/packages/ciphernode/indexer/scripts/build_fixtures.sh new file mode 100755 index 0000000000..2e037393dd --- /dev/null +++ b/packages/ciphernode/indexer/scripts/build_fixtures.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -e + +echo "Building fixtures for all Solidity files..." + +# Folder containing the .sol files +SOLIDITY_DIR="tests/fixtures" + +# For each .sol file in the directory +for solidity_file in "$SOLIDITY_DIR"/*.sol; do + # Extract just the filename without path or extension + filename=$(basename "$solidity_file" .sol) + + echo "Processing $filename.sol..." + + # Create the JSON file with ABI and bytecode + echo "{\"abi\": $(solc --abi "$solidity_file" | tail -n 1), \"bin\": \"$(solc --bin "$solidity_file" | tail -n 1)\"}" | jq '.' > "$SOLIDITY_DIR/$filename.json" + + echo "Created $filename.json" +done + +echo "All fixtures built successfully." diff --git a/packages/enclave-sdk/src/indexer/indexer.rs b/packages/ciphernode/indexer/src/indexer.rs similarity index 97% rename from packages/enclave-sdk/src/indexer/indexer.rs rename to packages/ciphernode/indexer/src/indexer.rs index 2b7a0d71c1..17a26b805a 100644 --- a/packages/enclave-sdk/src/indexer/indexer.rs +++ b/packages/ciphernode/indexer/src/indexer.rs @@ -1,18 +1,15 @@ +use crate::E3Repository; + use super::{models::E3, DataStore}; -use crate::{ - evm::{ - contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, - events::{ - CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished, - }, - listener::EventListener, - }, - indexer::E3Repository, -}; use alloy::primitives::Uint; use alloy::providers::Provider; use alloy::sol_types::SolEvent; use async_trait::async_trait; +use e3_evm_helpers::{ + contracts::{EnclaveContract, EnclaveContractFactory, EnclaveRead, ReadOnly}, + events::{CiphertextOutputPublished, E3Activated, InputPublished, PlaintextOutputPublished}, + listener::EventListener, +}; use eyre::eyre; use eyre::Result; use serde::{de::DeserializeOwned, Serialize}; diff --git a/packages/enclave-sdk/src/indexer/mod.rs b/packages/ciphernode/indexer/src/lib.rs similarity index 100% rename from packages/enclave-sdk/src/indexer/mod.rs rename to packages/ciphernode/indexer/src/lib.rs diff --git a/packages/enclave-sdk/src/indexer/models.rs b/packages/ciphernode/indexer/src/models.rs similarity index 100% rename from packages/enclave-sdk/src/indexer/models.rs rename to packages/ciphernode/indexer/src/models.rs diff --git a/packages/enclave-sdk/src/indexer/repo.rs b/packages/ciphernode/indexer/src/repo.rs similarity index 100% rename from packages/enclave-sdk/src/indexer/repo.rs rename to packages/ciphernode/indexer/src/repo.rs diff --git a/packages/enclave-sdk/src/indexer/traits.rs b/packages/ciphernode/indexer/src/traits.rs similarity index 100% rename from packages/enclave-sdk/src/indexer/traits.rs rename to packages/ciphernode/indexer/src/traits.rs diff --git a/packages/ciphernode/indexer/tests/fixtures/.gitignore b/packages/ciphernode/indexer/tests/fixtures/.gitignore new file mode 100644 index 0000000000..8dd919b529 --- /dev/null +++ b/packages/ciphernode/indexer/tests/fixtures/.gitignore @@ -0,0 +1,2 @@ +# ignore .json +*.json diff --git a/packages/ciphernode/indexer/tests/fixtures/emit_logs.sol b/packages/ciphernode/indexer/tests/fixtures/emit_logs.sol new file mode 100644 index 0000000000..cc393012b0 --- /dev/null +++ b/packages/ciphernode/indexer/tests/fixtures/emit_logs.sol @@ -0,0 +1,28 @@ +pragma solidity >=0.4.24; + +contract EmitLogs { + event ValueChanged(address indexed author, uint256 count, string value); + event PublishMessage(string value); + + string _value; + + uint256 count = 0; + + constructor() { + _value = ""; + } + + function getValue() public view returns (string memory) { + return _value; + } + + function setValue(string memory value) public { + count++; + emit ValueChanged(msg.sender, count, value); + _value = value; + } + + function emitPublishMessage(string memory value) public { + emit PublishMessage(value); + } +} diff --git a/packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol b/packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol new file mode 100644 index 0000000000..469547e291 --- /dev/null +++ b/packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol @@ -0,0 +1,100 @@ +pragma solidity >=0.4.24; + +contract FakeEnclave { + event E3Activated( + uint256 e3Id, + uint256 expiration, + bytes committeePublicKey + ); + event InputPublished( + uint256 indexed e3Id, + bytes data, + uint256 inputHash, + uint256 index + ); + event CiphertextOutputPublished( + uint256 indexed e3Id, + bytes ciphertextOutput + ); + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); + event CommitteePublished(uint256 indexed e3Id, bytes publicKey); + + // Emit E3Activated event with passed test data + function emitE3Activated( + uint256 e3Id, + uint256 expiration, + bytes memory committeePublicKey + ) public { + emit E3Activated(e3Id, expiration, committeePublicKey); + } + + // Emit InputPublished event with passed test data + function emitInputPublished( + uint256 e3Id, + bytes memory data, + uint256 inputHash, + uint256 index + ) public { + emit InputPublished(e3Id, data, inputHash, index); + } + + // Emit CiphertextOutputPublished event with passed test data + function emitCiphertextOutputPublished( + uint256 e3Id, + bytes memory ciphertextOutput + ) public { + emit CiphertextOutputPublished(e3Id, ciphertextOutput); + } + + // Emit PlaintextOutputPublished event with passed test data + function emitPlaintextOutputPublished( + uint256 e3Id, + bytes memory plaintextOutput + ) public { + emit PlaintextOutputPublished(e3Id, plaintextOutput); + } + + // Emit CommitteePublished event with passed test data + function emitCommitteePublished( + uint256 e3Id, + bytes memory publicKey + ) public { + emit CommitteePublished(e3Id, publicKey); + } + + function getE3(uint256 _e3Id) external view returns (E3 memory e3) { + e3 = E3({ + seed: 123456789012, + threshold: [uint32(2), uint32(3)], + requestBlock: 18750000, + startWindow: [uint256(18750100), uint256(18750200)], + duration: 100, + expiration: block.timestamp + 1 days, + encryptionSchemeId: bytes32(keccak256("AES-256-GCM")), + e3Program: 0x7F3E4df648B8Cb96C1D343be976b91B97CaD5c21, + inputValidator: 0xA51D5E87c0C82dDEBfa4E7E515B2D8Eea8f3e4f2, + decryptionVerifier: 0x4B0D8c2E5f7a6c832f8b16d3aB0e7F5d9E9B24b1, + e3ProgramParams: abi.encode(42, "testParams"), + committeePublicKey: bytes32(keccak256("committee_public_key")), + ciphertextOutput: bytes32(keccak256("encrypted_data")), + plaintextOutput: abi.encode("decrypted_result") + }); + } +} + +struct E3 { + uint256 seed; + uint32[2] threshold; + uint256 requestBlock; + uint256[2] startWindow; + uint256 duration; + uint256 expiration; + bytes32 encryptionSchemeId; + address e3Program; + bytes e3ProgramParams; + address inputValidator; + address decryptionVerifier; + bytes32 committeePublicKey; + bytes32 ciphertextOutput; + bytes plaintextOutput; +} diff --git a/packages/ciphernode/indexer/tests/helpers.rs b/packages/ciphernode/indexer/tests/helpers.rs new file mode 100644 index 0000000000..4aca799430 --- /dev/null +++ b/packages/ciphernode/indexer/tests/helpers.rs @@ -0,0 +1,56 @@ +use alloy::{ + node_bindings::{Anvil, AnvilInstance}, + providers::{ProviderBuilder, RootProvider, WsConnect}, + pubsub::PubSubFrontend, + sol, +}; +use eyre::Result; +use EmitLogs::EmitLogsInstance; +use Enclave::EnclaveInstance; + +sol!( + #[sol(rpc)] + Enclave, + "tests/fixtures/fake_enclave.json" +); + +sol!( + #[sol(rpc)] + EmitLogs, + "tests/fixtures/emit_logs.json" +); + +pub async fn setup_logs_contract() -> Result<( + EmitLogsInstance>, + String, + String, + AnvilInstance, +)> { + let (provider, endpoint, anvil) = setup_provider().await?; + let contract = EmitLogs::deploy(provider).await?; + let address = contract.address().to_string(); + Ok((contract, address, endpoint, anvil)) +} + +pub async fn setup_fake_enclave() -> Result<( + EnclaveInstance>, + String, + String, + AnvilInstance, +)> { + let (provider, endpoint, anvil) = setup_provider().await?; + let contract = Enclave::deploy(provider).await?; + let address = contract.address().to_string(); + Ok((contract, address, endpoint, anvil)) +} + +pub async fn setup_provider() -> Result<(RootProvider, String, AnvilInstance)> { + // Set anvil with fast blocktimes for testing + let anvil = Anvil::new().block_time_f64(0.01).try_spawn()?; + + let provider = ProviderBuilder::new() + .on_ws(WsConnect::new(anvil.ws_endpoint())) + .await?; + let endpoint = anvil.ws_endpoint(); + Ok((provider, endpoint, anvil)) +} diff --git a/packages/enclave-sdk/tests/indexer.rs b/packages/ciphernode/indexer/tests/indexer.rs similarity index 97% rename from packages/enclave-sdk/tests/indexer.rs rename to packages/ciphernode/indexer/tests/indexer.rs index 97d3ccc7b2..97cfe1409e 100644 --- a/packages/enclave-sdk/tests/indexer.rs +++ b/packages/ciphernode/indexer/tests/indexer.rs @@ -3,7 +3,7 @@ use alloy::{ primitives::{Bytes, Uint}, sol, }; -use enclave_sdk::indexer::{DataStore, EnclaveIndexer, InMemoryStore}; +use e3_indexer::{DataStore, EnclaveIndexer, InMemoryStore}; use eyre::Result; use helpers::setup_fake_enclave; use std::time::Duration; diff --git a/packages/ciphernode/scripts/build_fixtures.sh b/packages/ciphernode/scripts/build_fixtures.sh new file mode 100755 index 0000000000..4f1bb9c3e8 --- /dev/null +++ b/packages/ciphernode/scripts/build_fixtures.sh @@ -0,0 +1,4 @@ + +pushd ./evm && ./scripts/build_fixtures.sh && popd +pushd ./evm-helpers && ./scripts/build_fixtures.sh && popd +pushd ./indexer && ./scripts/build_fixtures.sh && popd diff --git a/packages/ciphernode/scripts/lint.sh b/packages/ciphernode/scripts/lint.sh new file mode 100755 index 0000000000..5636e5a946 --- /dev/null +++ b/packages/ciphernode/scripts/lint.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -e + +cargo fmt -- --check diff --git a/packages/ciphernode/scripts/test.sh b/packages/ciphernode/scripts/test.sh index 79de102f7d..46b830cdd3 100755 --- a/packages/ciphernode/scripts/test.sh +++ b/packages/ciphernode/scripts/test.sh @@ -2,6 +2,6 @@ set -e -pushd ./evm && ./scripts/build_fixtures.sh && popd +./scripts/build_fixtures.sh cargo test -- $@ diff --git a/packages/ciphernode/sdk/Cargo.toml b/packages/ciphernode/sdk/Cargo.toml new file mode 100644 index 0000000000..289d7ffd70 --- /dev/null +++ b/packages/ciphernode/sdk/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "e3-sdk" +version.workspace = true +edition.workspace = true + +[dependencies] +e3-evm-helpers.workspace = true +e3-bfv-helpers.workspace = true +e3-indexer.workspace = true diff --git a/packages/ciphernode/sdk/src/lib.rs b/packages/ciphernode/sdk/src/lib.rs new file mode 100644 index 0000000000..345448cd2e --- /dev/null +++ b/packages/ciphernode/sdk/src/lib.rs @@ -0,0 +1,3 @@ +pub use e3_bfv_helpers as bfv_helpers; +pub use e3_evm_helpers as evm_helpers; +pub use e3_indexer as indexer; diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test_helpers/Cargo.toml index 22bdad5ccc..2508e6b92d 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test_helpers/Cargo.toml @@ -14,4 +14,4 @@ fhe-traits = { workspace = true } rand_chacha = { workspace = true } rand = { workspace = true } tracing = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +e3-sdk = { workspace = true } diff --git a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs index 27c16f5634..e44f63ce33 100644 --- a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs +++ b/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs @@ -1,6 +1,6 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use enclave_sdk::bfv::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use e3_sdk::bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; diff --git a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs index 26d4ba3a45..f1b2f9f67d 100644 --- a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs +++ b/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs @@ -1,5 +1,5 @@ use clap::{command, Parser}; -use enclave_sdk::bfv::{build_bfv_params_arc, encode_bfv_params}; +use e3_sdk::bfv_helpers::{build_bfv_params_arc, encode_bfv_params}; use std::{error::Error, num::ParseIntError, process}; fn parse_hex(arg: &str) -> Result { diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index 5de1edba00..cf66313ad4 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -30,4 +30,4 @@ bincode = { workspace = true } base64 = { workspace = true } actix = { workspace = true } anyhow = { workspace = true } -enclave-sdk = { path = "../../enclave-sdk" } +e3-sdk = { workspace = true } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index 4a0a260213..270ae6ef39 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -6,7 +6,7 @@ use crypto::Cipher; use data::RepositoriesFactory; use data::{DataStore, InMemStore}; use e3_request::E3Router; -use enclave_sdk::bfv::{encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sdk::bfv_helpers::{encode_bfv_params, params::SET_2048_1032193_1}; use events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, EventBusConfig, diff --git a/packages/enclave-sdk/Cargo.lock b/packages/enclave-sdk/Cargo.lock deleted file mode 100644 index e1ead888d2..0000000000 --- a/packages/enclave-sdk/Cargo.lock +++ /dev/null @@ -1,4312 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.2", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-network", - "alloy-node-bindings", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum 0.27.1", -] - -[[package]] -name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "k256", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "k256", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-node-bindings" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" -dependencies = [ - "alloy-genesis", - "alloy-primitives", - "k256", - "rand 0.8.5", - "serde_json", - "tempfile", - "thiserror 2.0.12", - "tracing", - "url", -] - -[[package]] -name = "alloy-primitives" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 2.0.1", - "foldhash", - "hashbrown 0.15.2", - "indexmap", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.8.5", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-node-bindings", - "alloy-primitives", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types-anvil", - "alloy-rpc-types-eth", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-pubsub" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "bimap", - "futures", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-pubsub", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-anvil" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more 1.0.0", - "serde", - "strum 0.26.3", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-signer-local" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.101", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" -dependencies = [ - "alloy-json-rpc", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-ipc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "alloy-transport-ws" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http", - "rustls", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "ws_stream_wasm", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", - "serde", - "smallvec", - "tracing", -] - -[[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 = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "cc" -version = "1.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "const-hex" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "enclave-sdk" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "async-trait", - "bincode", - "chrono", - "eyre", - "fhe", - "fhe-traits", - "futures", - "futures-util", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "ethnum" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fhe" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "doc-comment", - "fhe-math", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-traits", - "prost", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "thiserror 1.0.69", - "zeroize", - "zeroize_derive", -] - -[[package]] -name = "fhe-math" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "ethnum", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-bigint-dig", - "num-traits", - "prost", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sha2", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "fhe-traits" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "fhe-util" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "itertools 0.12.1", - "num-bigint-dig", - "num-traits", - "prime_factorization", - "rand 0.8.5", - "rayon", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[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 = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "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 = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", - "serde", -] - -[[package]] -name = "interprocess" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.2", -] - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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", - "serde", - "smallvec", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[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.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "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 = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "const-hex", - "serde", - "smallvec", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "parity-scale-codec" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn 2.0.101", -] - -[[package]] -name = "prime_factorization" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" -dependencies = [ - "itertools 0.10.5", - "num", - "rand 0.8.5", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.101", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[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_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[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 = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[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 = "ruint" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.1", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[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.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.26", -] - -[[package]] -name = "rustix" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[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 = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "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 = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -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 = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.8.5", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 1.0.69", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[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 = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "widestring" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[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.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.101", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] diff --git a/packages/enclave-sdk/Cargo.toml b/packages/enclave-sdk/Cargo.toml deleted file mode 100644 index 461986abd4..0000000000 --- a/packages/enclave-sdk/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "enclave-sdk" -version = "0.1.0" -edition = "2021" - -# Core dependencies compatible with everything -[dependencies] -anyhow = "1.0.86" -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } -eyre = { version = "0.6.12", optional = true } -futures = { version = "0.3.30", optional = true } -tokio = { version = "1.37.0", optional = true } -async-trait = { version = "0.1.73", optional = true } -serde = { version = "1.0.208", optional = true } -serde_json = { version = "1.0.140", optional = true } -bincode = { version = "1.3.3", optional = true } -thiserror = { version = "1.0.58", optional = true } -chrono = { version = "0.4.38", optional = true } -futures-util = { version = "0.3.30", optional = true } - -[dependencies.alloy] -version = "0.8.3" -default-features = false -optional = true - -[features] -default = ["full"] -full = [ - "alloy/full", - "alloy/rpc-types-eth", - "alloy/node-bindings", - "eyre", - "futures", - "tokio/full", - "async-trait", - "serde/derive", - "bincode", - "thiserror", - "futures-util", - "chrono" -] -risc0 = ["alloy/dyn-abi", "alloy/rlp", "alloy/serde"] diff --git a/packages/enclave-sdk/rust-toolchain.toml b/packages/enclave-sdk/rust-toolchain.toml deleted file mode 100644 index c68e3d8ae1..0000000000 --- a/packages/enclave-sdk/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "1.85" -components = ["rustfmt"] diff --git a/packages/enclave-sdk/scripts/test.sh b/packages/enclave-sdk/scripts/test.sh deleted file mode 100755 index 189d8fdb0d..0000000000 --- a/packages/enclave-sdk/scripts/test.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -e - -./scripts/build_fixtures.sh - -cargo test -- "$@" diff --git a/packages/enclave-sdk/src/lib.rs b/packages/enclave-sdk/src/lib.rs deleted file mode 100644 index 57e4a2475a..0000000000 --- a/packages/enclave-sdk/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod bfv; - -#[cfg(feature = "full")] -pub mod evm; - -#[cfg(feature = "full")] -pub mod indexer; From 0fb52c7c1e557d0bad98e028b1e6193f9bb81acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 30 May 2025 19:05:50 +0000 Subject: [PATCH 029/106] Rust reorg pt II compute provider (#456) * Move compute_provider -> ciphernode/compute-provider * e3-* * Update Dockerfiles --- docs/pages/compute-provider.mdx | 2 +- docs/pages/write-secure-program.mdx | 4 +- examples/CRISP/apps/program/Cargo.toml | 2 +- examples/CRISP/apps/program/app/Cargo.toml | 2 +- examples/CRISP/apps/program/app/src/main.rs | 2 +- examples/CRISP/apps/program/core/Cargo.toml | 2 +- examples/CRISP/apps/program/core/src/lib.rs | 2 +- examples/CRISP/apps/program/host/Cargo.toml | 4 +- examples/CRISP/apps/program/host/src/lib.rs | 4 +- .../apps/program/methods/guest/Cargo.toml | 2 +- .../program/methods/guest/src/bin/voting.rs | 2 +- examples/CRISP/apps/server/Cargo.toml | 2 +- examples/CRISP/apps/server/Dockerfile | 9 +- .../CRISP/apps/server/src/server/indexer.rs | 2 +- packages/ciphernode/Cargo.lock | 93 +++ packages/ciphernode/Cargo.toml | 1 + packages/ciphernode/Dockerfile | 1 + .../compute-provider}/.gitignore | 0 .../compute-provider}/Cargo.toml | 6 +- .../compute-provider}/Readme.md | 10 +- .../src/ciphertext_output.rs | 0 .../compute-provider}/src/compute_input.rs | 0 .../compute-provider}/src/compute_manager.rs | 0 .../compute-provider}/src/lib.rs | 0 .../compute-provider}/src/merkle_tree.rs | 0 packages/compute_provider/Cargo.lock | 604 ------------------ 26 files changed, 124 insertions(+), 632 deletions(-) rename packages/{compute_provider => ciphernode/compute-provider}/.gitignore (100%) rename packages/{compute_provider => ciphernode/compute-provider}/Cargo.toml (66%) rename packages/{compute_provider => ciphernode/compute-provider}/Readme.md (88%) rename packages/{compute_provider => ciphernode/compute-provider}/src/ciphertext_output.rs (100%) rename packages/{compute_provider => ciphernode/compute-provider}/src/compute_input.rs (100%) rename packages/{compute_provider => ciphernode/compute-provider}/src/compute_manager.rs (100%) rename packages/{compute_provider => ciphernode/compute-provider}/src/lib.rs (100%) rename packages/{compute_provider => ciphernode/compute-provider}/src/merkle_tree.rs (100%) delete mode 100644 packages/compute_provider/Cargo.lock diff --git a/docs/pages/compute-provider.mdx b/docs/pages/compute-provider.mdx index ee24681148..f1602ecca6 100644 --- a/docs/pages/compute-provider.mdx +++ b/docs/pages/compute-provider.mdx @@ -46,7 +46,7 @@ Select a CP that suits your needs. Options include: - **Language Support**: Choose a CP that supports the programming languages you're comfortable with. Enclave provides a -[Compute Provider package](https://github.com/gnosisguild/CRISP/tree/main/packages/compute_provider) +[Compute Provider package](https://github.com/gnosisguild/CRISP/tree/main/packages/ciphernode/compute-provider) to simplify the integration, letting you focus on computation logic. More details can be found in the [Writing the Secure Process](./write-secure-program.mdx) guide. diff --git a/docs/pages/write-secure-program.mdx b/docs/pages/write-secure-program.mdx index 0649573c1e..b733234a47 100644 --- a/docs/pages/write-secure-program.mdx +++ b/docs/pages/write-secure-program.mdx @@ -8,7 +8,7 @@ description: '' The Secure Process is the core FHE logic for your E3 Program. It runs within your selected Compute Provider's environment, ultimately producing and publishing a ciphertext output that is decrypted by your Ciphernode Committee. To facilitate this, Enclave provides a -[Compute Provider package](https://github.com/gnosisguild/enclave/tree/main/packages/compute_provider) +[Compute Provider package](https://github.com/gnosisguild/enclave/tree/main/packages/ciphernode/compute-provider) to simplify writing the Secure Process with any Compute Provider. ### Using the Compute Provider Package @@ -30,7 +30,7 @@ To simplify integration with Enclave, use the provided Compute Provider package. **Example:** ```rust -use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; +use e3_compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; // Implement ComputeProvider trait for your chosen provider pub struct Risc0Provider; diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index 9a6cd2aec7..d87cad2aab 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -37,7 +37,7 @@ serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -compute-provider = { path = "../../../../packages/compute_provider" } +e3-compute-provider = { path = "../../../../packages/ciphernode/compute-provider" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/examples/CRISP/apps/program/app/Cargo.toml b/examples/CRISP/apps/program/app/Cargo.toml index 85b1d8959f..dcef3f08c2 100644 --- a/examples/CRISP/apps/program/app/Cargo.toml +++ b/examples/CRISP/apps/program/app/Cargo.toml @@ -9,6 +9,6 @@ env_logger.workspace = true serde.workspace = true serde_json.workspace = true tokio.workspace = true -compute-provider.workspace = true +e3-compute-provider.workspace = true voting-host.workspace = true program-client.workspace = true diff --git a/examples/CRISP/apps/program/app/src/main.rs b/examples/CRISP/apps/program/app/src/main.rs index 9dd8d7a76f..d1fe7b828c 100644 --- a/examples/CRISP/apps/program/app/src/main.rs +++ b/examples/CRISP/apps/program/app/src/main.rs @@ -1,5 +1,5 @@ use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result}; -use compute_provider::FHEInputs; +use e3_compute_provider::FHEInputs; use program_client::{ComputeRequest, ComputeResponse}; use serde::{Deserialize, Serialize}; use serde_json::json; diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index 07bcdefc41..d43573c2ce 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -6,5 +6,5 @@ edition = { workspace = true } [dependencies] fhe_rs = { workspace = true } fhe-traits = { workspace = true } -compute-provider = { path = "../../../../../packages/compute_provider" } +e3-compute-provider = { path = "../../../../../packages/ciphernode/compute-provider" } e3-bfv-helpers = { path = "../../../../../packages/ciphernode/bfv-helpers" } diff --git a/examples/CRISP/apps/program/core/src/lib.rs b/examples/CRISP/apps/program/core/src/lib.rs index 3227a6214f..3ed45d3ac6 100644 --- a/examples/CRISP/apps/program/core/src/lib.rs +++ b/examples/CRISP/apps/program/core/src/lib.rs @@ -1,5 +1,5 @@ -use compute_provider::FHEInputs; use e3_bfv_helpers::decode_bfv_params_arc; +use e3_compute_provider::FHEInputs; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; diff --git a/examples/CRISP/apps/program/host/Cargo.toml b/examples/CRISP/apps/program/host/Cargo.toml index acd102ed48..0fd2a77005 100644 --- a/examples/CRISP/apps/program/host/Cargo.toml +++ b/examples/CRISP/apps/program/host/Cargo.toml @@ -15,10 +15,10 @@ methods = { workspace = true } risc0-ethereum-contracts = { workspace = true } risc0-zkvm = { workspace = true } tokio = { workspace = true } -compute-provider = { path = "../../../../../packages/compute_provider" } +e3-compute-provider = { path = "../../../../../packages/ciphernode/compute-provider" } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } voting-core = { workspace = true } rand = { workspace = true } -tracing-subscriber = { workspace = true } \ No newline at end of file +tracing-subscriber = { workspace = true } diff --git a/examples/CRISP/apps/program/host/src/lib.rs b/examples/CRISP/apps/program/host/src/lib.rs index d9e3ac38a3..dc363d9fbe 100644 --- a/examples/CRISP/apps/program/host/src/lib.rs +++ b/examples/CRISP/apps/program/host/src/lib.rs @@ -1,6 +1,8 @@ use anyhow::{Error, Result}; use bincode::serialize; -use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; +use e3_compute_provider::{ + ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs, +}; use methods::VOTING_ELF; use risc0_ethereum_contracts::groth16; use risc0_zkvm::{default_prover, ExecutorEnv, ProverOpts, VerifierContext}; diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.toml b/examples/CRISP/apps/program/methods/guest/Cargo.toml index 0f0143c140..89ae4aee9c 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.toml +++ b/examples/CRISP/apps/program/methods/guest/Cargo.toml @@ -13,7 +13,7 @@ path = "src/bin/voting.rs" alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" risc0-zkvm = { version = "2.0.0", default-features = false, features = ['std'] } -compute-provider = { path = "../../../../../../packages/compute_provider" } +e3-compute-provider = { path = "../../../../../../packages/ciphernode/compute-provider" } voting-core = { path = "../../core" } bincode = "1.3.3" anyhow = "1.0.86" diff --git a/examples/CRISP/apps/program/methods/guest/src/bin/voting.rs b/examples/CRISP/apps/program/methods/guest/src/bin/voting.rs index 9410e102a2..c98b2250b3 100644 --- a/examples/CRISP/apps/program/methods/guest/src/bin/voting.rs +++ b/examples/CRISP/apps/program/methods/guest/src/bin/voting.rs @@ -1,6 +1,6 @@ use anyhow::{Error, Result}; use bincode::deserialize; -use compute_provider::{ComputeInput, ComputeResult}; +use e3_compute_provider::{ComputeInput, ComputeResult}; use risc0_zkvm::guest::env; use std::io::Read; use voting_core::fhe_processor; diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index fe41358540..3df5b524ae 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -37,7 +37,7 @@ jwt = "0.16.0" sha2 = "0.10.8" # Local dependencies -compute-provider = { path = "../../../../packages/compute_provider" } +e3-compute-provider = { path = "../../../../packages/ciphernode/compute-provider" } e3-sdk = { path = "../../../../packages/ciphernode/sdk" } program-client = { path = "../program/client" } diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index cce13a4408..6eca01dc25 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -33,7 +33,7 @@ COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/cor COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/ COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.lock packages/ciphernode/ -COPY packages/compute_provider/Cargo.toml packages/compute_provider/ +COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/ WORKDIR /app/examples/CRISP/apps/server RUN cargo chef prepare --recipe-path recipe.json @@ -59,6 +59,7 @@ COPY packages/ciphernode/aggregator/Cargo.toml packages/ciphernode/aggregator/Ca COPY packages/ciphernode/bfv-helpers/Cargo.toml packages/ciphernode/bfv-helpers/Cargo.toml COPY packages/ciphernode/Cargo.lock packages/ciphernode/Cargo.lock COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.toml +COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml packages/ciphernode/config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml packages/ciphernode/crypto/Cargo.toml COPY packages/ciphernode/data/Cargo.toml packages/ciphernode/data/Cargo.toml @@ -79,13 +80,13 @@ COPY packages/ciphernode/sortition/Cargo.toml packages/ciphernode/sortition/Carg COPY packages/ciphernode/test_helpers/Cargo.toml packages/ciphernode/test_helpers/Cargo.toml COPY packages/ciphernode/tests/Cargo.toml packages/ciphernode/tests/Cargo.toml -COPY packages/compute_provider/Cargo.toml packages/compute_provider/ + +COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/ RUN set -eux; \ find \ examples/CRISP/apps/program \ packages/ciphernode \ - packages/compute_provider \ -type f -name Cargo.toml ! -path '*/target/*' -print0 \ | while IFS= read -r -d '' manifest_path; do \ crate_dir="$(dirname "$manifest_path")"; \ @@ -115,7 +116,7 @@ WORKDIR /app COPY examples/CRISP/apps/server/ examples/CRISP/apps/server/ COPY examples/CRISP/apps/program/ examples/CRISP/apps/program/ COPY packages/ciphernode/ packages/ciphernode/ -COPY packages/compute_provider/ packages/compute_provider/ +COPY packages/ciphernode/compute-provider/ packages/ciphernode/compute-provider/ WORKDIR /app/examples/CRISP/apps/server RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs index 759ed6d284..7978d3836e 100644 --- a/examples/CRISP/apps/server/src/server/indexer.rs +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -2,7 +2,7 @@ use crate::server::{ models::CurrentRound, repo::{CrispE3Repository, CurrentRoundRepository}, }; -use compute_provider::FHEInputs; +use e3_compute_provider::FHEInputs; use e3_sdk::{ evm_helpers::{ contracts::{ diff --git a/packages/ciphernode/Cargo.lock b/packages/ciphernode/Cargo.lock index 842c345c44..9a3acc1f35 100644 --- a/packages/ciphernode/Cargo.lock +++ b/packages/ciphernode/Cargo.lock @@ -1068,6 +1068,34 @@ dependencies = [ "password-hash", ] +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.3.0" @@ -1151,6 +1179,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -1167,11 +1208,23 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ + "ark-serialize-derive", "ark-std 0.4.0", "digest 0.10.7", "num-bigint", ] +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -2332,6 +2385,22 @@ dependencies = [ "fhe-traits", ] +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + [[package]] name = "e3-evm-helpers" version = "0.1.0" @@ -3181,6 +3250,9 @@ name = "hashbrown" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -3911,6 +3983,15 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "lean-imt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" +dependencies = [ + "hashbrown 0.15.3", +] + [[package]] name = "libc" version = "0.2.172" @@ -4344,6 +4425,18 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "num-bigint", + "thiserror 1.0.69", +] + [[package]] name = "linked-hash-map" version = "0.5.6" diff --git a/packages/ciphernode/Cargo.toml b/packages/ciphernode/Cargo.toml index 7572c6a290..d1ce3ea596 100644 --- a/packages/ciphernode/Cargo.toml +++ b/packages/ciphernode/Cargo.toml @@ -3,6 +3,7 @@ members = [ "aggregator", "config", "crypto", + "compute-provider", "data", "bfv-helpers", "evm-helpers", diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 57e5481599..f5353326ec 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -27,6 +27,7 @@ COPY packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY packages/ciphernode/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml COPY packages/ciphernode/Cargo.lock ./Cargo.lock COPY packages/ciphernode/Cargo.toml ./Cargo.toml +COPY packages/ciphernode/compute-provider/Cargo.toml ./compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml ./config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml COPY packages/ciphernode/data/Cargo.toml ./data/Cargo.toml diff --git a/packages/compute_provider/.gitignore b/packages/ciphernode/compute-provider/.gitignore similarity index 100% rename from packages/compute_provider/.gitignore rename to packages/ciphernode/compute-provider/.gitignore diff --git a/packages/compute_provider/Cargo.toml b/packages/ciphernode/compute-provider/Cargo.toml similarity index 66% rename from packages/compute_provider/Cargo.toml rename to packages/ciphernode/compute-provider/Cargo.toml index 633ab90809..736a021b7c 100644 --- a/packages/compute_provider/Cargo.toml +++ b/packages/ciphernode/compute-provider/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "compute-provider" +name = "e3-compute-provider" version = "0.1.0" edition = "2021" [dependencies] -serde = { version = "1.0.208", features = ["derive", "std"] } +serde = { workspace = true, features = ["derive", "std"] } lean-imt = "0.1.2" sha3 = "0.10.8" num-bigint = "0.4.6" @@ -13,4 +13,4 @@ hex = "0.4.3" light-poseidon = "0.2.0" ark-ff = "0.4.2" ark-bn254 = "0.4.0" -rayon = "1.10.0" \ No newline at end of file +rayon = "1.10.0" diff --git a/packages/compute_provider/Readme.md b/packages/ciphernode/compute-provider/Readme.md similarity index 88% rename from packages/compute_provider/Readme.md rename to packages/ciphernode/compute-provider/Readme.md index c8c6050810..d1574779d1 100644 --- a/packages/compute_provider/Readme.md +++ b/packages/ciphernode/compute-provider/Readme.md @@ -15,7 +15,7 @@ To use this library, add it to your `Cargo.toml`: ```toml [dependencies] -compute-provider = { git = "https://github.com/gnosisguild/enclave.git", path = "packages/compute_provider"} +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave.git", path = "packages/ciphernode/compute-provider"} ``` ## Usage @@ -28,7 +28,7 @@ To use the library, follow these steps: ```rust use anyhow::Result; -use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; +use e3_compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; use voting_core::fhe_processor; // Define your Risc0Provider struct and implement the ComputeProvider trait @@ -40,13 +40,12 @@ pub fn run_compute(params: FHEInputs) -> Result<(Risc0Output, Vec)> { } ``` - ## Risc0 Example Here's a more detailed example of how to use the Compute Manager with Risc0: ```rust -use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; +use e3_compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; use methods::VOTING_ELF; use risc0_ethereum_contracts::groth16; use risc0_zkvm::{default_prover, ExecutorEnv, ProverOpts, VerifierContext}; @@ -73,7 +72,6 @@ pub fn run_compute(params: FHEInputs) -> Result<(Risc0Output, Vec)> { } ``` - This example demonstrates how to create a Risc0Provider, use it with the ComputeManager, and measure the execution time of the computation. ## Configuration @@ -84,4 +82,4 @@ The `ComputeManager::new()` function takes several parameters: - `fhe_inputs`: The FHE inputs for the computation - `fhe_processor`: A function to process the FHE inputs - `use_parallel`: A boolean indicating whether to use parallel processing -- `batch_size`: An optional batch size for parallel processing, must be a power of 2 \ No newline at end of file +- `batch_size`: An optional batch size for parallel processing, must be a power of 2 diff --git a/packages/compute_provider/src/ciphertext_output.rs b/packages/ciphernode/compute-provider/src/ciphertext_output.rs similarity index 100% rename from packages/compute_provider/src/ciphertext_output.rs rename to packages/ciphernode/compute-provider/src/ciphertext_output.rs diff --git a/packages/compute_provider/src/compute_input.rs b/packages/ciphernode/compute-provider/src/compute_input.rs similarity index 100% rename from packages/compute_provider/src/compute_input.rs rename to packages/ciphernode/compute-provider/src/compute_input.rs diff --git a/packages/compute_provider/src/compute_manager.rs b/packages/ciphernode/compute-provider/src/compute_manager.rs similarity index 100% rename from packages/compute_provider/src/compute_manager.rs rename to packages/ciphernode/compute-provider/src/compute_manager.rs diff --git a/packages/compute_provider/src/lib.rs b/packages/ciphernode/compute-provider/src/lib.rs similarity index 100% rename from packages/compute_provider/src/lib.rs rename to packages/ciphernode/compute-provider/src/lib.rs diff --git a/packages/compute_provider/src/merkle_tree.rs b/packages/ciphernode/compute-provider/src/merkle_tree.rs similarity index 100% rename from packages/compute_provider/src/merkle_tree.rs rename to packages/ciphernode/compute-provider/src/merkle_tree.rs diff --git a/packages/compute_provider/Cargo.lock b/packages/compute_provider/Cargo.lock deleted file mode 100644 index f658942fcf..0000000000 --- a/packages/compute_provider/Cargo.lock +++ /dev/null @@ -1,604 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-ff", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[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 = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lean-imt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" -dependencies = [ - "hashbrown 0.15.2", -] - -[[package]] -name = "libc" -version = "0.2.158" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254", - "ark-ff", - "num-bigint", - "thiserror", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe" - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[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.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.77", -] From 69982be72d7ee827a2061859f3d6edd8e66e445f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 30 May 2025 20:52:03 +0000 Subject: [PATCH 030/106] Move `Cargo.toml` from `packages/ciphernode` to `.` (#458) * Move Cargo.toml to root * Update package.json * Provide toolchain * Fix Dockerfile * Update actions * Update actions * Add excludes * lint * Add explicit excludes * Add commas * Remove incorrect path --- .github/workflows/ec2-deployment.yml | 2 + .github/workflows/integration.yml | 24 +-- .github/workflows/rust-ci.yml | 1 - packages/ciphernode/Cargo.lock => Cargo.lock | 0 packages/ciphernode/Cargo.toml => Cargo.toml | 91 ++++---- examples/CRISP/apps/program/Cargo.lock | 38 ++-- .../apps/program/methods/guest/Cargo.lock | 36 ++-- examples/CRISP/apps/server/Cargo.lock | 34 +-- examples/CRISP/apps/server/Dockerfile | 11 +- package.json | 4 +- packages/ciphernode/Dockerfile | 12 +- packages/ciphernode/net/tests/Dockerfile | 3 +- .../ciphernode/net/tests/docker-compose.yaml | 12 +- pnpm-lock.yaml | 198 +++--------------- ...rust-toolchain.toml => rust-toolchain.toml | 0 tests/integration/base.sh | 2 +- tests/integration/fns.sh | 2 +- tests/integration/lib/fake_encrypt.sh | 2 +- tests/integration/lib/pack_e3_params.sh | 2 +- tests/integration/persist.sh | 2 +- 20 files changed, 173 insertions(+), 303 deletions(-) rename packages/ciphernode/Cargo.lock => Cargo.lock (100%) rename packages/ciphernode/Cargo.toml => Cargo.toml (51%) rename packages/ciphernode/rust-toolchain.toml => rust-toolchain.toml (100%) diff --git a/.github/workflows/ec2-deployment.yml b/.github/workflows/ec2-deployment.yml index 23460feb34..e95aca9034 100644 --- a/.github/workflows/ec2-deployment.yml +++ b/.github/workflows/ec2-deployment.yml @@ -6,6 +6,7 @@ on: - main - hacknet paths: + - "Cargo.*" - "packages/ciphernode/**" - "packages/evm/contracts/**" pull_request: @@ -14,6 +15,7 @@ on: - main - hacknet paths: + - "Cargo.*" - "packages/ciphernode/**" - "packages/evm/contracts/**" diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 90aa5c4431..dfecac7809 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -49,11 +49,10 @@ jobs: - name: pnpm-setup uses: pnpm/action-setup@v4 - - name: Install Rust 1.81.0 + - name: Install Rust 1.85.0 uses: actions-rs/toolchain@v1 with: - toolchain: 1.81.0 - override: true + toolchain: 1.85.0 - name: Cache node modules uses: actions/cache@v4 @@ -83,9 +82,9 @@ jobs: with: name: build-artifacts path: | - packages/ciphernode/target/debug/enclave - packages/ciphernode/target/debug/fake_encrypt - packages/ciphernode/target/debug/pack_e3_params + target/debug/enclave + target/debug/fake_encrypt + target/debug/pack_e3_params test: needs: prebuild @@ -107,11 +106,10 @@ jobs: - name: pnpm-setup uses: pnpm/action-setup@v4 - - name: Install Rust 1.81.0 + - name: Install Rust 1.85.0 uses: actions-rs/toolchain@v1 with: - toolchain: 1.81.0 - override: true + toolchain: 1.85.0 - name: Cache node modules uses: actions/cache@v4 @@ -126,13 +124,13 @@ jobs: uses: actions/download-artifact@v4 with: name: build-artifacts - path: packages/ciphernode/target/debug/ + path: target/debug/ - name: "Set executable permissions" run: | - chmod +x packages/ciphernode/target/debug/enclave - chmod +x packages/ciphernode/target/debug/fake_encrypt - chmod +x packages/ciphernode/target/debug/pack_e3_params + chmod +x target/debug/enclave + chmod +x target/debug/fake_encrypt + chmod +x target/debug/pack_e3_params - name: "Run ${{ matrix.test-suite }} tests" run: "pnpm test:integration ${{ matrix.test-suite }} --no-prebuild" diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 93000410a9..163b1af791 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -17,7 +17,6 @@ jobs: uses: actions-rs/toolchain@v1 with: toolchain: 1.85.0 - override: true # We must install foundry in order to be able to test anvil - name: Install Foundry diff --git a/packages/ciphernode/Cargo.lock b/Cargo.lock similarity index 100% rename from packages/ciphernode/Cargo.lock rename to Cargo.lock diff --git a/packages/ciphernode/Cargo.toml b/Cargo.toml similarity index 51% rename from packages/ciphernode/Cargo.toml rename to Cargo.toml index d1ce3ea596..9fbdcf632f 100644 --- a/packages/ciphernode/Cargo.toml +++ b/Cargo.toml @@ -1,27 +1,32 @@ [workspace] members = [ - "aggregator", - "config", - "crypto", - "compute-provider", - "data", - "bfv-helpers", - "evm-helpers", - "indexer", - "e3_request", - "enclave", - "enclave_core", - "events", - "evm", - "fhe", - "init", - "keyshare", - "logger", - "net", - "sdk", - "sortition", - "test_helpers", - "tests", + "packages/ciphernode/aggregator", + "packages/ciphernode/config", + "packages/ciphernode/crypto", + "packages/ciphernode/compute-provider", + "packages/ciphernode/data", + "packages/ciphernode/bfv-helpers", + "packages/ciphernode/evm-helpers", + "packages/ciphernode/indexer", + "packages/ciphernode/e3_request", + "packages/ciphernode/enclave", + "packages/ciphernode/enclave_core", + "packages/ciphernode/events", + "packages/ciphernode/evm", + "packages/ciphernode/fhe", + "packages/ciphernode/init", + "packages/ciphernode/keyshare", + "packages/ciphernode/logger", + "packages/ciphernode/net", + "packages/ciphernode/sdk", + "packages/ciphernode/sortition", + "packages/ciphernode/test_helpers", + "packages/ciphernode/tests", +] +exclude = [ + "examples/CRISP/apps/server", + "examples/CRISP/apps/program", + "examples/CRISP/apps/wasm-crypto" ] resolver = "2" @@ -30,27 +35,27 @@ version = "0.1.0" edition = "2021" [workspace.dependencies] -aggregator = { path = "./aggregator" } -e3-bfv-helpers = { path = "./bfv-helpers" } -config = { path = "./config" } -crypto = { path = "./crypto" } -data = { path = "./data" } -e3_request = { path = "./e3_request" } -e3-sdk = { path = "./sdk" } -enclave = { path = "./enclave" } -enclave_core = { path = "./enclave_core" } -enclave-init = { path = "./init" } -events = { path = "./events" } -evm = { path = "./evm" } -e3-evm-helpers = { path = "./evm-helpers" } -fhe = { path = "./fhe" } -e3-indexer = { path = "./indexer" } -keyshare = { path = "./keyshare" } -logger = { path = "./logger" } -net = { path = "./net" } -sortition = { path = "./sortition" } -test_helpers = { package = "test-helpers", path = "./test_helpers" } -tests = { path = "./tests" } +aggregator = { path = "./packages/ciphernode/aggregator" } +e3-bfv-helpers = { path = "./packages/ciphernode/bfv-helpers" } +config = { path = "./packages/ciphernode/config" } +crypto = { path = "./packages/ciphernode/crypto" } +data = { path = "./packages/ciphernode/data" } +e3_request = { path = "./packages/ciphernode/e3_request" } +e3-sdk = { path = "./packages/ciphernode/sdk" } +enclave = { path = "./packages/ciphernode/enclave" } +enclave_core = { path = "./packages/ciphernode/enclave_core" } +enclave-init = { path = "./packages/ciphernode/init" } +events = { path = "./packages/ciphernode/events" } +evm = { path = "./packages/ciphernode/evm" } +e3-evm-helpers = { path = "./packages/ciphernode/evm-helpers" } +fhe = { path = "./packages/ciphernode/fhe" } +e3-indexer = { path = "./packages/ciphernode/indexer" } +keyshare = { path = "./packages/ciphernode/keyshare" } +logger = { path = "./packages/ciphernode/logger" } +net = { path = "./packages/ciphernode/net" } +sortition = { path = "./packages/ciphernode/sortition" } +test_helpers = { package = "test-helpers", path = "./packages/ciphernode/test_helpers" } +tests = { path = "./packages/ciphernode/tests" } actix = "0.13.5" actix-web = "4.10.2" diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index a9d258e498..f2590c9d91 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -1972,22 +1972,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - [[package]] name = "const-hex" version = "1.14.0" @@ -2103,7 +2087,7 @@ name = "crisp-program" version = "0.1.0" dependencies = [ "actix-web", - "compute-provider", + "e3-compute-provider", "env_logger", "program-client", "serde", @@ -2414,6 +2398,22 @@ dependencies = [ "fhe-traits", ] +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -6094,8 +6094,8 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" name = "voting-core" version = "0.1.0" dependencies = [ - "compute-provider", "e3-bfv-helpers", + "e3-compute-provider", "fhe", "fhe-traits", ] @@ -6109,7 +6109,7 @@ dependencies = [ "anyhow", "bincode", "bytemuck", - "compute-provider", + "e3-compute-provider", "fhe", "fhe-traits", "fhe-util", diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index a5d3824b9e..0b43d14473 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -1222,22 +1222,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - [[package]] name = "const-hex" version = "1.14.1" @@ -1482,6 +1466,22 @@ dependencies = [ "fhe-traits", ] +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -1932,7 +1932,7 @@ dependencies = [ "alloy-sol-types", "anyhow", "bincode", - "compute-provider", + "e3-compute-provider", "risc0-zkvm", "voting-core", ] @@ -4192,8 +4192,8 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" name = "voting-core" version = "0.1.0" dependencies = [ - "compute-provider", "e3-bfv-helpers", + "e3-compute-provider", "fhe", "fhe-traits", ] diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 6f0ff67d19..798d3eba7a 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -1528,22 +1528,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "compute-provider" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-ff 0.4.2", - "hex", - "lean-imt", - "light-poseidon", - "num-bigint", - "num-traits", - "rayon", - "serde", - "sha3", -] - [[package]] name = "config" version = "0.14.1" @@ -1702,10 +1686,10 @@ dependencies = [ "bincode", "chrono", "clap", - "compute-provider", "config", "dialoguer", "dotenvy", + "e3-compute-provider", "e3-sdk", "env_logger", "eyre", @@ -1962,6 +1946,22 @@ dependencies = [ "fhe-traits", ] +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + [[package]] name = "e3-evm-helpers" version = "0.1.0" diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 6eca01dc25..29fd870b22 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -32,7 +32,7 @@ COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/hos COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/ -COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.lock packages/ciphernode/ +COPY Cargo.toml Cargo.lock ./ COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/ WORKDIR /app/examples/CRISP/apps/server @@ -54,11 +54,12 @@ COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/hos COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ +COPY Cargo.lock ./Cargo.lock +COPY Cargo.toml ./Cargo.toml + # find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" COPY packages/ciphernode/aggregator/Cargo.toml packages/ciphernode/aggregator/Cargo.toml COPY packages/ciphernode/bfv-helpers/Cargo.toml packages/ciphernode/bfv-helpers/Cargo.toml -COPY packages/ciphernode/Cargo.lock packages/ciphernode/Cargo.lock -COPY packages/ciphernode/Cargo.toml packages/ciphernode/Cargo.toml COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml packages/ciphernode/config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml packages/ciphernode/crypto/Cargo.toml @@ -80,9 +81,6 @@ COPY packages/ciphernode/sortition/Cargo.toml packages/ciphernode/sortition/Carg COPY packages/ciphernode/test_helpers/Cargo.toml packages/ciphernode/test_helpers/Cargo.toml COPY packages/ciphernode/tests/Cargo.toml packages/ciphernode/tests/Cargo.toml - -COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/ - RUN set -eux; \ find \ examples/CRISP/apps/program \ @@ -115,6 +113,7 @@ WORKDIR /app COPY examples/CRISP/apps/server/ examples/CRISP/apps/server/ COPY examples/CRISP/apps/program/ examples/CRISP/apps/program/ +COPY Cargo.* ./ COPY packages/ciphernode/ packages/ciphernode/ COPY packages/ciphernode/compute-provider/ packages/ciphernode/compute-provider/ diff --git a/package.json b/package.json index f4e70241e3..6e0d957f43 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,11 @@ "coverage": "pnpm evm:coverage", "prepare": "husky", "enclave": "cd packages/ciphernode && ./scripts/launch.sh", - "ciphernode:lint": "cd packages/ciphernode && ./scripts/lint.sh", + "ciphernode:lint": "cargo fmt -- --check", "ciphernode:add": "cd packages/evm && pnpm ciphernode:add", "ciphernode:remove": "cd packages/evm && pnpm ciphernode:remove", "ciphernode:test": "cd packages/ciphernode && ./scripts/test.sh", - "ciphernode:build": "cd packages/ciphernode && cargo build --release", + "ciphernode:build": "cargo build --release", "preciphernode:build": "pnpm evm:compile", "committee:new": "cd packages/evm && pnpm committee:new", "committee:publish": "cd packages/evm && pnpm hardhat committee:publish", diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index f5353326ec..0fa32cf718 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -17,16 +17,19 @@ ENV RUSTC_FORCE_INCREMENTAL=1 ENV CARGO_BUILD_JOBS=8 # Create build directory + +WORKDIR /build +COPY Cargo.lock ./Cargo.lock +COPY Cargo.toml ./Cargo.toml +COPY ./rust-toolchain.toml . + WORKDIR /build/packages/ciphernode COPY --from=evm-builder /build/packages/evm/artifacts ../evm/artifacts COPY --from=evm-builder /build/packages/evm/deployments ../evm/deployments - # find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) packages/ciphernode/|COPY \1 ./|' COPY packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY packages/ciphernode/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml -COPY packages/ciphernode/Cargo.lock ./Cargo.lock -COPY packages/ciphernode/Cargo.toml ./Cargo.toml COPY packages/ciphernode/compute-provider/Cargo.toml ./compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml ./config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml @@ -49,7 +52,6 @@ COPY packages/ciphernode/test_helpers/Cargo.toml ./test_helpers/Cargo.toml COPY packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml COPY ./packages/ciphernode/enclave_core/build.rs ./enclave_core/build.rs -COPY ./packages/ciphernode/rust-toolchain.toml . RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ @@ -86,7 +88,7 @@ USER ciphernode WORKDIR /home/ciphernode # Copy binary from builder -COPY --from=ciphernode-builder --chown=ciphernode:ciphernode /build/packages/ciphernode/target/release/enclave /usr/local/bin/ +COPY --from=ciphernode-builder --chown=ciphernode:ciphernode /build/target/release/enclave /usr/local/bin/ COPY --from=ciphernode-builder --chmod=755 --chown=ciphernode:ciphernode /build/packages/ciphernode/ciphernode-entrypoint.sh /usr/local/bin/ # Environment variables for configuration diff --git a/packages/ciphernode/net/tests/Dockerfile b/packages/ciphernode/net/tests/Dockerfile index 67db945187..0c14a1125d 100644 --- a/packages/ciphernode/net/tests/Dockerfile +++ b/packages/ciphernode/net/tests/Dockerfile @@ -4,7 +4,6 @@ FROM rust:1.81 AS builder WORKDIR /app COPY . . -WORKDIR /app/ciphernode RUN cargo build --release --bin p2p_test FROM debian:bookworm-slim @@ -14,6 +13,6 @@ WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends iptables ca-certificates && \ apt-get clean && rm -rf /var/lib/apt/lists/* -COPY --from=builder /app/ciphernode/target/release/p2p_test . +COPY --from=builder /app/target/release/p2p_test . ENTRYPOINT ["/app/p2p_test"] diff --git a/packages/ciphernode/net/tests/docker-compose.yaml b/packages/ciphernode/net/tests/docker-compose.yaml index 7ebd0e0cd8..e599898ae8 100644 --- a/packages/ciphernode/net/tests/docker-compose.yaml +++ b/packages/ciphernode/net/tests/docker-compose.yaml @@ -1,8 +1,8 @@ services: alice: build: - dockerfile: ciphernode/net/tests/Dockerfile - context: ../../.. + dockerfile: packages/ciphernode/net/tests/Dockerfile + context: ../../../.. command: ["/app/p2p_test", "alice"] environment: QUIC_PORT: 9091 @@ -13,8 +13,8 @@ services: bob: build: - dockerfile: ciphernode/net/tests/Dockerfile - context: ../../.. + dockerfile: packages/ciphernode/net/tests/Dockerfile + context: ../../../.. command: ["/app/p2p_test", "bob"] environment: QUIC_PORT: 9091 @@ -25,8 +25,8 @@ services: charlie: build: - dockerfile: ciphernode/net/tests/Dockerfile - context: ../../.. + dockerfile: packages/ciphernode/net/tests/Dockerfile + context: ../../../.. command: ["/app/p2p_test", "charlie"] environment: QUIC_PORT: 9091 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ff9477186..a84d7f05b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,10 +72,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 version: 1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -84,13 +84,13 @@ importers: version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(225b6e328c7c72dea10c70026633527e) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(b285d134f7bebf40fffb5d0c9e92a2e9) + version: 5.0.0(a7f0110eca458f09074d1c2612ad945e) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -267,69 +267,6 @@ importers: specifier: ^3.3.0 version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) - examples/basic: - devDependencies: - '@nomicfoundation/hardhat-chai-matchers': - specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.0 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers': - specifier: ^0.15.0 - version: 0.15.11(adcb435609ba3eedf4e14820144ed57f) - '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.0 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-toolbox': - specifier: ^5.0.0 - version: 5.0.0(34b660bf6f3b32c6dc1600e0ee083f08) - '@nomicfoundation/hardhat-verify': - specifier: ^2.0.0 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': - specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': - specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) - '@types/chai': - specifier: ^4.2.0 - version: 4.3.20 - '@types/mocha': - specifier: '>=9.1.0' - version: 10.0.10 - '@types/node': - specifier: '>=18.0.0' - version: 22.7.5 - chai: - specifier: ^4.2.0 - version: 4.5.0 - ethers: - specifier: ^6.4.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: - specifier: ^2.14.0 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: - specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: - specifier: ^0.8.0 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - ts-node: - specifier: '>=8.0.0' - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typechain: - specifier: ^8.3.0 - version: 8.3.2(typescript@5.8.2) - typescript: - specifier: '>=4.5.0' - version: 5.8.2 - packages/evm: dependencies: '@excubiae/contracts': @@ -9284,11 +9221,10 @@ snapshots: '@depay/web3-blockchains@9.8.2': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)': dependencies: '@depay/solana-web3.js': 1.98.1 '@depay/web3-blockchains': 9.8.2 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -10484,17 +10420,6 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@types/chai-as-promised': 7.1.8 - chai: 4.5.0 - chai-as-promised: 7.1.2(chai@4.5.0) - deep-eql: 4.1.4 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10506,26 +10431,16 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': - dependencies: - debug: 4.4.0(supports-color@5.5.0) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.0(supports-color@5.5.0) @@ -10535,10 +10450,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@5.5.0) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: @@ -10549,20 +10463,11 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(225b6e328c7c72dea10c70026633527e)': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(adcb435609ba3eedf4e14820144ed57f)': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': @@ -10571,7 +10476,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) fs-extra: 10.1.0 hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -10611,41 +10516,19 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 - '@nomicfoundation/hardhat-toolbox@5.0.0(34b660bf6f3b32c6dc1600e0ee083f08)': + '@nomicfoundation/hardhat-toolbox@5.0.0(a7f0110eca458f09074d1c2612ad945e)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(adcb435609ba3eedf4e14820144ed57f) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 - - '@nomicfoundation/hardhat-toolbox@5.0.0(b285d134f7bebf40fffb5d0c9e92a2e9)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(225b6e328c7c72dea10c70026633527e) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) - '@types/chai': 4.3.20 - '@types/mocha': 10.0.10 - '@types/node': 22.7.5 - chai: 4.5.0 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10673,7 +10556,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -10688,7 +10571,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -11204,9 +11087,9 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 @@ -11289,10 +11172,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) @@ -11375,14 +11258,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 - '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': dependencies: ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11391,14 +11266,6 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.8.2) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) @@ -11407,10 +11274,9 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.2) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.2) @@ -12173,7 +12039,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14019,7 +13885,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -14477,7 +14343,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -14761,7 +14627,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17902,7 +17768,7 @@ snapshots: typechain@8.3.2(typescript@5.8.2): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 diff --git a/packages/ciphernode/rust-toolchain.toml b/rust-toolchain.toml similarity index 100% rename from packages/ciphernode/rust-toolchain.toml rename to rust-toolchain.toml diff --git a/tests/integration/base.sh b/tests/integration/base.sh index 36a9f9090e..1f2ec5e7aa 100755 --- a/tests/integration/base.sh +++ b/tests/integration/base.sh @@ -24,7 +24,7 @@ enclave_nodes_up echo "waiting on binaries and utilities..." -waiton-files "$ROOT_DIR/packages/ciphernode/target/debug/enclave" "$ROOT_DIR/packages/ciphernode/target/debug/fake_encrypt" +waiton-files "$ROOT_DIR/target/debug/enclave" "$ROOT_DIR/target/debug/fake_encrypt" sleep 4 diff --git a/tests/integration/fns.sh b/tests/integration/fns.sh index 4d5b751fd2..3858639a6d 100644 --- a/tests/integration/fns.sh +++ b/tests/integration/fns.sh @@ -38,7 +38,7 @@ NETWORK_PRIVATE_KEY_2="0x21a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85f NETWORK_PRIVATE_KEY_3="0x31a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85fa33d3f580" NETWORK_PRIVATE_KEY_4="0x41a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85fa33d3f580" -ENCLAVE_BIN=$ROOT_DIR/packages/ciphernode/target/debug/enclave +ENCLAVE_BIN=$ROOT_DIR/target/debug/enclave # Function to clean up background processes cleanup() { diff --git a/tests/integration/lib/fake_encrypt.sh b/tests/integration/lib/fake_encrypt.sh index 7095ef3b88..4eec7c75e8 100755 --- a/tests/integration/lib/fake_encrypt.sh +++ b/tests/integration/lib/fake_encrypt.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -../../packages/ciphernode/target/debug/fake_encrypt "$@" +../../target/debug/fake_encrypt "$@" diff --git a/tests/integration/lib/pack_e3_params.sh b/tests/integration/lib/pack_e3_params.sh index a5a012c0e6..db80ee906c 100755 --- a/tests/integration/lib/pack_e3_params.sh +++ b/tests/integration/lib/pack_e3_params.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -../../packages/ciphernode/target/debug/pack_e3_params "$@" +../../target/debug/pack_e3_params "$@" diff --git a/tests/integration/persist.sh b/tests/integration/persist.sh index c152b4bc01..3218b319be 100755 --- a/tests/integration/persist.sh +++ b/tests/integration/persist.sh @@ -22,7 +22,7 @@ enclave_wallet_set ag "$PRIVATE_KEY" # start swarm enclave_nodes_up -waiton-files "$ROOT_DIR/packages/ciphernode/target/debug/enclave" "$ROOT_DIR/packages/ciphernode/target/debug/fake_encrypt" +waiton-files "$ROOT_DIR/target/debug/enclave" "$ROOT_DIR/target/debug/fake_encrypt" heading "Add ciphernode $CIPHERNODE_ADDRESS_1" pnpm ciphernode:add --ciphernode-address $CIPHERNODE_ADDRESS_1 --network localhost From bb16ddde000608cb2e1b9ba4a8e55d73f80a9020 Mon Sep 17 00:00:00 2001 From: SUBHASISH BEHERA <92573882+Subhasish-Behera@users.noreply.github.com> Date: Sat, 31 May 2025 07:25:20 +0530 Subject: [PATCH 031/106] handle otel flag when used with `enclave nodes up` (#457) * feat: handle OTEL endpoint through nodes command chain propagate the --otel CLI flag through the nodes command chain so individual node processes can be configured with OpenTelemetry endpoints. * fix: rust formatting --- packages/ciphernode/enclave/src/cli.rs | 9 ++++++++- packages/ciphernode/enclave/src/nodes.rs | 5 +++-- packages/ciphernode/enclave/src/nodes_daemon.rs | 3 ++- packages/ciphernode/enclave/src/nodes_up.rs | 3 ++- packages/ciphernode/enclave_core/src/nodes/daemon.rs | 11 ++++++++++- packages/ciphernode/enclave_core/src/nodes/up.rs | 3 ++- 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/ciphernode/enclave/src/cli.rs b/packages/ciphernode/enclave/src/cli.rs index 31dc59bb99..d7a94924b1 100644 --- a/packages/ciphernode/enclave/src/cli.rs +++ b/packages/ciphernode/enclave/src/cli.rs @@ -134,7 +134,14 @@ impl Cli { bail!("Cannot run `enclave wizard` when a configuration exists."); } Commands::Nodes { command } => { - nodes::execute(command, &config, self.verbose, self.config).await? + nodes::execute( + command, + &config, + self.verbose, + self.config, + self.otel.clone().map(Into::into), + ) + .await? } Commands::Password { command } => password::execute(command, &config).await?, Commands::Wallet { command } => wallet::execute(command, config).await?, diff --git a/packages/ciphernode/enclave/src/nodes.rs b/packages/ciphernode/enclave/src/nodes.rs index 0806a94451..fdf3c99de4 100644 --- a/packages/ciphernode/enclave/src/nodes.rs +++ b/packages/ciphernode/enclave/src/nodes.rs @@ -66,15 +66,16 @@ pub async fn execute( config: &AppConfig, verbose: u8, config_string: Option, + otel: Option, ) -> Result<()> { match command { NodeCommands::Up { detach, exclude } => { - nodes_up::execute(config, detach, exclude, verbose, config_string).await? + nodes_up::execute(config, detach, exclude, verbose, config_string, otel).await? } NodeCommands::Down => nodes_down::execute().await?, NodeCommands::Ps => nodes_ps::execute().await?, NodeCommands::Daemon { exclude } => { - nodes_daemon::execute(config, exclude, verbose, config_string).await? + nodes_daemon::execute(config, exclude, verbose, config_string, otel).await? } NodeCommands::Start { id } => nodes_start::execute(&id).await?, NodeCommands::Status { id } => nodes_status::execute(&id).await?, diff --git a/packages/ciphernode/enclave/src/nodes_daemon.rs b/packages/ciphernode/enclave/src/nodes_daemon.rs index bc7412fb4e..351885bff9 100644 --- a/packages/ciphernode/enclave/src/nodes_daemon.rs +++ b/packages/ciphernode/enclave/src/nodes_daemon.rs @@ -7,6 +7,7 @@ pub async fn execute( exclude: Vec, verbose: u8, config_string: Option, + otel: Option, ) -> Result<()> { - daemon::execute(config, exclude, verbose, config_string).await + daemon::execute(config, exclude, verbose, config_string, otel).await } diff --git a/packages/ciphernode/enclave/src/nodes_up.rs b/packages/ciphernode/enclave/src/nodes_up.rs index 62a4ec0552..cc500748b2 100644 --- a/packages/ciphernode/enclave/src/nodes_up.rs +++ b/packages/ciphernode/enclave/src/nodes_up.rs @@ -8,6 +8,7 @@ pub async fn execute( exclude: Vec, verbose: u8, config_string: Option, + otel: Option, ) -> Result<()> { - up::execute(config, detach, exclude, verbose, config_string).await + up::execute(config, detach, exclude, verbose, config_string, otel).await } diff --git a/packages/ciphernode/enclave_core/src/nodes/daemon.rs b/packages/ciphernode/enclave_core/src/nodes/daemon.rs index 50065fc8cd..67ad9f3bb2 100644 --- a/packages/ciphernode/enclave_core/src/nodes/daemon.rs +++ b/packages/ciphernode/enclave_core/src/nodes/daemon.rs @@ -46,6 +46,7 @@ impl LaunchCommand { &self, verbose: u8, maybe_config_string: &Option, + maybe_otel: &Option, ) -> Result { let enclave_bin = env::current_exe()?.display().to_string(); let mut args = vec![]; @@ -63,6 +64,11 @@ impl LaunchCommand { args.push(format!("-{}", "v".repeat(verbose as usize))); // -vvv } + if let Some(otel) = maybe_otel { + args.push("--otel".to_string()); + args.push(otel.to_string()); + } + for peer in self.peers.iter() { args.push("--peer".to_string()); args.push(peer.to_string()); @@ -78,6 +84,7 @@ fn extract_commands( exclude: Vec, verbose: u8, maybe_config_string: Option, + maybe_otel: Option, ) -> Result { let mut exclude_list = exclude.clone(); @@ -98,7 +105,7 @@ fn extract_commands( let mut cmds = HashMap::new(); for item in filtered.iter() { - let params = item.to_params(verbose, &maybe_config_string)?; + let params = item.to_params(verbose, &maybe_config_string, &maybe_otel)?; cmds.insert(item.name.clone(), params); } @@ -111,6 +118,7 @@ pub async fn execute( exclude: Vec, verbose: u8, maybe_config_string: Option, + maybe_otel: Option, ) -> Result<()> { let command_map = extract_commands( config.nodes(), @@ -118,6 +126,7 @@ pub async fn execute( exclude, verbose, maybe_config_string, + maybe_otel, )?; let process_manager = Arc::new(Mutex::new(ProcessManager::from(command_map))); diff --git a/packages/ciphernode/enclave_core/src/nodes/up.rs b/packages/ciphernode/enclave_core/src/nodes/up.rs index 7a970f04cd..646b359fde 100644 --- a/packages/ciphernode/enclave_core/src/nodes/up.rs +++ b/packages/ciphernode/enclave_core/src/nodes/up.rs @@ -12,6 +12,7 @@ pub async fn execute( exclude: Vec, verbose: u8, maybe_config_string: Option, + maybe_otel: Option, ) -> Result<()> { if client::is_ready().await? { bail!("Swarm is already running!"); @@ -23,7 +24,7 @@ pub async fn execute( } // run the swarm_daemon process locally forwarding args - daemon::execute(config, exclude, verbose, maybe_config_string).await?; + daemon::execute(config, exclude, verbose, maybe_config_string, maybe_otel).await?; Ok(()) } From fa61b08c12b0431f627ce0ef409202fa02d6fba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 1 Jun 2025 21:16:24 +0000 Subject: [PATCH 032/106] Refactor everything (#460) * aggreator-> e3-aggregator * config -> e3-config * crypto -> e3-crypto * data -> e3-data * e3_request -> e3-request * enclave -> e3-cli * update docker * Update dockerfile * Fix installation script * enclave_core -> e3-entrypoint * events -> e3-events * update docker entry * evm -> e3-evm * fhe -> e3-fhe * enclave_init -> e3-init * specify bin * Fix setup task * keyshare -> e3-keyshare * logger -> e3_logger * net -> e3-net * sorition -> e3-sortition * test_helpers -> e3-test-helpers * tests -> e3-tests * Fix up main.rs --- Cargo.lock | 658 +++++++++--------- Cargo.toml | 42 +- examples/CRISP/apps/server/Dockerfile | 8 +- examples/CRISP/scripts/tasks/setup.sh | 2 +- packages/ciphernode/Dockerfile | 14 +- packages/ciphernode/aggregator/Cargo.toml | 14 +- packages/ciphernode/aggregator/src/ext.rs | 8 +- .../aggregator/src/plaintext_aggregator.rs | 8 +- .../aggregator/src/publickey_aggregator.rs | 8 +- packages/ciphernode/aggregator/src/repo.rs | 6 +- .../ciphernode/{enclave => cli}/Cargo.toml | 18 +- .../ciphernode/{enclave => cli}/src/cli.rs | 12 +- .../src/helpers/compile_id.rs | 0 .../{enclave => cli}/src/helpers/mod.rs | 0 .../src/helpers/prompt_password.rs | 0 .../{enclave => cli}/src/helpers/telemetry.rs | 2 +- .../ciphernode/{enclave => cli}/src/init.rs | 2 +- .../ciphernode/{enclave => cli}/src/main.rs | 0 .../ciphernode/{enclave => cli}/src/net.rs | 2 +- .../{enclave => cli}/src/net_generate.rs | 4 +- .../{enclave => cli}/src/net_purge.rs | 4 +- .../{enclave => cli}/src/net_set.rs | 4 +- .../ciphernode/{enclave => cli}/src/nodes.rs | 2 +- .../{enclave => cli}/src/nodes_daemon.rs | 4 +- .../{enclave => cli}/src/nodes_down.rs | 2 +- .../{enclave => cli}/src/nodes_ps.rs | 2 +- .../{enclave => cli}/src/nodes_restart.rs | 2 +- .../{enclave => cli}/src/nodes_start.rs | 2 +- .../{enclave => cli}/src/nodes_status.rs | 2 +- .../{enclave => cli}/src/nodes_stop.rs | 2 +- .../{enclave => cli}/src/nodes_up.rs | 4 +- .../{enclave => cli}/src/password.rs | 2 +- .../{enclave => cli}/src/password_delete.rs | 6 +- .../{enclave => cli}/src/password_set.rs | 6 +- .../ciphernode/{enclave => cli}/src/start.rs | 8 +- .../ciphernode/{enclave => cli}/src/wallet.rs | 2 +- .../{enclave => cli}/src/wallet_set.rs | 6 +- .../ciphernode/{enclave => cli}/src/wizard.rs | 2 +- packages/ciphernode/config/Cargo.toml | 4 +- packages/ciphernode/config/src/store_keys.rs | 2 +- packages/ciphernode/crypto/Cargo.toml | 6 +- packages/ciphernode/crypto/src/cipher.rs | 2 +- packages/ciphernode/data/Cargo.toml | 4 +- packages/ciphernode/data/src/data_store.rs | 4 +- packages/ciphernode/data/src/sled_store.rs | 2 +- .../{enclave_core => entrypoint}/Cargo.toml | 28 +- packages/ciphernode/entrypoint/README.md | 3 + .../{enclave_core => entrypoint}/build.rs | 0 .../src/helpers/datastore.rs | 8 +- .../src/helpers/mod.rs | 0 .../src/helpers/rand.rs | 0 .../src/helpers/shutdown.rs | 2 +- .../src/helpers/termtable.rs | 0 .../{enclave_core => entrypoint}/src/lib.rs | 0 .../src/net/keypair/generate.rs | 6 +- .../src/net/keypair/mod.rs | 0 .../src/net/keypair/set.rs | 6 +- .../src/net/mod.rs | 0 .../src/net/peer_id/mod.rs | 0 .../src/net/peer_id/purge.rs | 4 +- .../src/nodes/client.rs | 0 .../src/nodes/daemon.rs | 2 +- .../src/nodes/down.rs | 0 .../src/nodes/mod.rs | 0 .../src/nodes/nodes.rs | 0 .../src/nodes/process_manager.rs | 0 .../src/nodes/ps.rs | 0 .../src/nodes/restart.rs | 0 .../src/nodes/server.rs | 0 .../src/nodes/start.rs | 0 .../src/nodes/status.rs | 0 .../src/nodes/stop.rs | 0 .../src/nodes/up.rs | 2 +- .../src/password/delete.rs | 4 +- .../src/password/mod.rs | 0 .../src/password/set.rs | 4 +- .../src/start/aggregator_start.rs | 24 +- .../src/start/mod.rs | 0 .../src/start/start.rs | 26 +- .../src/wallet/mod.rs | 0 .../src/wallet/set.rs | 6 +- .../src/wizard/mod.rs | 6 +- packages/ciphernode/events/Cargo.toml | 2 +- packages/ciphernode/evm/Cargo.toml | 14 +- .../evm/src/ciphernode_registry_sol.rs | 16 +- packages/ciphernode/evm/src/enclave_sol.rs | 4 +- .../ciphernode/evm/src/enclave_sol_reader.rs | 16 +- .../ciphernode/evm/src/enclave_sol_writer.rs | 6 +- packages/ciphernode/evm/src/event_reader.rs | 4 +- packages/ciphernode/evm/src/helpers.rs | 6 +- .../ciphernode/evm/src/registry_filter_sol.rs | 2 +- packages/ciphernode/evm/src/repo.rs | 4 +- packages/ciphernode/evm/tests/evm_reader.rs | 8 +- packages/ciphernode/fhe/Cargo.toml | 10 +- packages/ciphernode/fhe/src/ext.rs | 4 +- packages/ciphernode/fhe/src/fhe.rs | 4 +- packages/ciphernode/fhe/src/repo.rs | 6 +- packages/ciphernode/init/Cargo.toml | 2 +- packages/ciphernode/keyshare/Cargo.toml | 14 +- packages/ciphernode/keyshare/src/ext.rs | 8 +- packages/ciphernode/keyshare/src/keyshare.rs | 8 +- packages/ciphernode/keyshare/src/repo.rs | 6 +- packages/ciphernode/logger/Cargo.toml | 4 +- packages/ciphernode/logger/src/logger.rs | 2 +- packages/ciphernode/net/Cargo.toml | 10 +- packages/ciphernode/net/src/bin/p2p_test.rs | 6 +- packages/ciphernode/net/src/lib.rs | 3 - .../ciphernode/net/src/network_manager.rs | 6 +- packages/ciphernode/net/src/repo.rs | 4 +- .../{e3_request => request}/Cargo.toml | 8 +- .../{e3_request => request}/src/context.rs | 4 +- .../src/hetrogenous_map.rs | 0 .../{e3_request => request}/src/lib.rs | 0 .../{e3_request => request}/src/meta.rs | 4 +- .../{e3_request => request}/src/repo.rs | 6 +- .../{e3_request => request}/src/router.rs | 18 +- packages/ciphernode/sortition/Cargo.toml | 8 +- .../sortition/src/ciphernode_selector.rs | 2 +- packages/ciphernode/sortition/src/lib.rs | 4 - packages/ciphernode/sortition/src/repo.rs | 4 +- .../ciphernode/sortition/src/sortition.rs | 4 +- .../{test_helpers => test-helpers}/Cargo.toml | 6 +- .../src/bin/fake_encrypt.rs | 0 .../src/bin/pack_e3_params.rs | 0 .../{test_helpers => test-helpers}/src/lib.rs | 0 .../src/plaintext_writer.rs | 2 +- .../src/public_key_writer.rs | 2 +- .../src/utils.rs | 0 packages/ciphernode/tests/Cargo.toml | 26 +- .../tests/test_aggregation_and_decryption.rs | 30 +- 130 files changed, 666 insertions(+), 666 deletions(-) rename packages/ciphernode/{enclave => cli}/Cargo.toml (74%) rename packages/ciphernode/{enclave => cli}/src/cli.rs (95%) rename packages/ciphernode/{enclave => cli}/src/helpers/compile_id.rs (100%) rename packages/ciphernode/{enclave => cli}/src/helpers/mod.rs (100%) rename packages/ciphernode/{enclave => cli}/src/helpers/prompt_password.rs (100%) rename packages/ciphernode/{enclave => cli}/src/helpers/telemetry.rs (98%) rename packages/ciphernode/{enclave => cli}/src/init.rs (64%) rename packages/ciphernode/{enclave => cli}/src/main.rs (100%) rename packages/ciphernode/{enclave => cli}/src/net.rs (98%) rename packages/ciphernode/{enclave => cli}/src/net_generate.rs (85%) rename packages/ciphernode/{enclave => cli}/src/net_purge.rs (81%) rename packages/ciphernode/{enclave => cli}/src/net_set.rs (86%) rename packages/ciphernode/{enclave => cli}/src/nodes.rs (98%) rename packages/ciphernode/{enclave => cli}/src/nodes_daemon.rs (81%) rename packages/ciphernode/{enclave => cli}/src/nodes_down.rs (75%) rename packages/ciphernode/{enclave => cli}/src/nodes_ps.rs (75%) rename packages/ciphernode/{enclave => cli}/src/nodes_restart.rs (75%) rename packages/ciphernode/{enclave => cli}/src/nodes_start.rs (76%) rename packages/ciphernode/{enclave => cli}/src/nodes_status.rs (76%) rename packages/ciphernode/{enclave => cli}/src/nodes_stop.rs (76%) rename packages/ciphernode/{enclave => cli}/src/nodes_up.rs (83%) rename packages/ciphernode/{enclave => cli}/src/password.rs (96%) rename packages/ciphernode/{enclave => cli}/src/password_delete.rs (84%) rename packages/ciphernode/{enclave => cli}/src/password_set.rs (90%) rename packages/ciphernode/{enclave => cli}/src/start.rs (80%) rename packages/ciphernode/{enclave => cli}/src/wallet.rs (96%) rename packages/ciphernode/{enclave => cli}/src/wallet_set.rs (81%) rename packages/ciphernode/{enclave => cli}/src/wizard.rs (98%) rename packages/ciphernode/{enclave_core => entrypoint}/Cargo.toml (66%) create mode 100644 packages/ciphernode/entrypoint/README.md rename packages/ciphernode/{enclave_core => entrypoint}/build.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/helpers/datastore.rs (81%) rename packages/ciphernode/{enclave_core => entrypoint}/src/helpers/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/helpers/rand.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/helpers/shutdown.rs (95%) rename packages/ciphernode/{enclave_core => entrypoint}/src/helpers/termtable.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/lib.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/keypair/generate.rs (90%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/keypair/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/keypair/set.rs (90%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/peer_id/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/net/peer_id/purge.rs (79%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/client.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/daemon.rs (98%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/down.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/nodes.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/process_manager.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/ps.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/restart.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/server.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/start.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/status.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/stop.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/nodes/up.rs (96%) rename packages/ciphernode/{enclave_core => entrypoint}/src/password/delete.rs (87%) rename packages/ciphernode/{enclave_core => entrypoint}/src/password/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/password/set.rs (92%) rename packages/ciphernode/{enclave_core => entrypoint}/src/start/aggregator_start.rs (87%) rename packages/ciphernode/{enclave_core => entrypoint}/src/start/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/start/start.rs (86%) rename packages/ciphernode/{enclave_core => entrypoint}/src/wallet/mod.rs (100%) rename packages/ciphernode/{enclave_core => entrypoint}/src/wallet/set.rs (91%) rename packages/ciphernode/{enclave_core => entrypoint}/src/wizard/mod.rs (97%) rename packages/ciphernode/{e3_request => request}/Cargo.toml (69%) rename packages/ciphernode/{e3_request => request}/src/context.rs (98%) rename packages/ciphernode/{e3_request => request}/src/hetrogenous_map.rs (100%) rename packages/ciphernode/{e3_request => request}/src/lib.rs (100%) rename packages/ciphernode/{e3_request => request}/src/meta.rs (94%) rename packages/ciphernode/{e3_request => request}/src/repo.rs (91%) rename packages/ciphernode/{e3_request => request}/src/router.rs (97%) rename packages/ciphernode/{test_helpers => test-helpers}/Cargo.toml (80%) rename packages/ciphernode/{test_helpers => test-helpers}/src/bin/fake_encrypt.rs (100%) rename packages/ciphernode/{test_helpers => test-helpers}/src/bin/pack_e3_params.rs (100%) rename packages/ciphernode/{test_helpers => test-helpers}/src/lib.rs (100%) rename packages/ciphernode/{test_helpers => test-helpers}/src/plaintext_writer.rs (95%) rename packages/ciphernode/{test_helpers => test-helpers}/src/public_key_writer.rs (95%) rename packages/ciphernode/{test_helpers => test-helpers}/src/utils.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 9a3acc1f35..3267ce84ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -271,24 +271,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "aggregator" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "async-trait", - "bincode", - "config", - "data", - "e3_request", - "events", - "fhe 0.1.0", - "serde", - "sortition", - "tracing", -] - [[package]] name = "ahash" version = "0.8.12" @@ -1884,26 +1866,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "config" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "dirs 5.0.1", - "events", - "figment", - "path-clean", - "petname", - "rand 0.8.5", - "serde", - "serde_yaml", - "shellexpand", - "tempfile", - "tracing", - "url", -] - [[package]] name = "console" version = "0.15.11" @@ -2050,20 +2012,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" -[[package]] -name = "crypto" -version = "0.1.0" -dependencies = [ - "aes-gcm", - "anyhow", - "argon2", - "async-trait", - "config", - "rand 0.8.5", - "tokio", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.5" @@ -2137,22 +2085,6 @@ dependencies = [ "parking_lot_core 0.9.10", ] -[[package]] -name = "data" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "async-trait", - "bincode", - "events", - "once_cell", - "serde", - "sled", - "tempfile", - "tracing", -] - [[package]] name = "data-encoding" version = "2.9.0" @@ -2376,15 +2308,62 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "e3-aggregator" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-trait", + "bincode", + "e3-config", + "e3-data", + "e3-events", + "e3-fhe", + "e3-request", + "e3-sortition", + "serde", + "tracing", +] + [[package]] name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ "alloy", - "fhe 0.1.0-beta.7", + "fhe", "fhe-traits", ] +[[package]] +name = "e3-cli" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "clap", + "compile-time", + "dialoguer", + "e3-config", + "e3-crypto", + "e3-entrypoint", + "e3-events", + "e3-init", + "hex", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-stdout", + "opentelemetry_sdk", + "petname", + "rand 0.8.5", + "tokio", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", + "url", + "zeroize", +] + [[package]] name = "e3-compute-provider" version = "0.1.0" @@ -2401,6 +2380,137 @@ dependencies = [ "sha3", ] +[[package]] +name = "e3-config" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "dirs 5.0.1", + "e3-events", + "figment", + "path-clean", + "petname", + "rand 0.8.5", + "serde", + "serde_yaml", + "shellexpand", + "tempfile", + "tracing", + "url", +] + +[[package]] +name = "e3-crypto" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "anyhow", + "argon2", + "async-trait", + "e3-config", + "rand 0.8.5", + "tokio", + "zeroize", +] + +[[package]] +name = "e3-data" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-trait", + "bincode", + "e3-events", + "once_cell", + "serde", + "sled", + "tempfile", + "tracing", +] + +[[package]] +name = "e3-entrypoint" +version = "0.1.0" +dependencies = [ + "actix", + "actix-web", + "alloy", + "alloy-primitives", + "anyhow", + "bincode", + "clap", + "dirs 5.0.1", + "e3-aggregator", + "e3-config", + "e3-crypto", + "e3-data", + "e3-events", + "e3-evm", + "e3-fhe", + "e3-keyshare", + "e3-logger", + "e3-net", + "e3-request", + "e3-sortition", + "e3-test-helpers", + "hex", + "libp2p", + "phf", + "rand 0.8.5", + "rand_chacha 0.3.1", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "e3-events" +version = "0.1.0" +dependencies = [ + "actix", + "alloy", + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "bincode", + "bloom", + "bs58", + "futures-util", + "once_cell", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "e3-evm" +version = "0.1.0" +dependencies = [ + "actix", + "alloy", + "alloy-primitives", + "anyhow", + "async-trait", + "base64", + "e3-config", + "e3-crypto", + "e3-data", + "e3-entrypoint", + "e3-events", + "e3-sortition", + "futures-util", + "serde", + "tokio", + "tracing", + "url", + "zeroize", +] + [[package]] name = "e3-evm-helpers" version = "0.1.0" @@ -2413,6 +2523,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "e3-fhe" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-trait", + "bincode", + "e3-bfv-helpers", + "e3-config", + "e3-data", + "e3-events", + "e3-request", + "fhe", + "fhe-traits", + "fhe-util", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", +] + [[package]] name = "e3-indexer" version = "0.1.0" @@ -2427,6 +2558,78 @@ dependencies = [ "tokio", ] +[[package]] +name = "e3-init" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-recursion", + "git2", + "tokio", +] + +[[package]] +name = "e3-keyshare" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-trait", + "e3-config", + "e3-crypto", + "e3-data", + "e3-events", + "e3-fhe", + "e3-request", + "serde", + "tracing", +] + +[[package]] +name = "e3-logger" +version = "0.1.0" +dependencies = [ + "actix", + "base64", + "e3-events", + "tracing", +] + +[[package]] +name = "e3-net" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-std", + "async-trait", + "e3-config", + "e3-crypto", + "e3-data", + "e3-events", + "futures", + "libp2p", + "tokio", + "tracing", + "tracing-subscriber", + "zeroize", +] + +[[package]] +name = "e3-request" +version = "0.1.0" +dependencies = [ + "actix", + "anyhow", + "async-trait", + "bincode", + "e3-config", + "e3-data", + "e3-events", + "serde", + "tracing", +] + [[package]] name = "e3-sdk" version = "0.1.0" @@ -2437,20 +2640,72 @@ dependencies = [ ] [[package]] -name = "e3_request" +name = "e3-sortition" version = "0.1.0" dependencies = [ "actix", + "alloy", "anyhow", "async-trait", - "bincode", - "config", - "data", - "events", + "e3-config", + "e3-data", + "e3-events", + "num", + "rand 0.8.5", "serde", "tracing", ] +[[package]] +name = "e3-test-helpers" +version = "0.1.0" +dependencies = [ + "actix", + "bincode", + "clap", + "e3-events", + "e3-fhe", + "e3-sdk", + "fhe", + "fhe-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "tracing", +] + +[[package]] +name = "e3-tests" +version = "0.1.0" +dependencies = [ + "actix", + "alloy", + "alloy-primitives", + "anyhow", + "async-std", + "base64", + "bincode", + "clap", + "e3-aggregator", + "e3-crypto", + "e3-data", + "e3-events", + "e3-evm", + "e3-fhe", + "e3-keyshare", + "e3-logger", + "e3-net", + "e3-request", + "e3-sdk", + "e3-sortition", + "e3-test-helpers", + "fhe", + "fhe-traits", + "fhe-util", + "rand 0.8.5", + "rand_chacha 0.3.1", + "tokio", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -2515,83 +2770,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "enclave" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "clap", - "compile-time", - "config", - "crypto", - "dialoguer", - "enclave-init", - "enclave_core", - "events", - "hex", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry-stdout", - "opentelemetry_sdk", - "petname", - "rand 0.8.5", - "tokio", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber", - "url", - "zeroize", -] - -[[package]] -name = "enclave-init" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-recursion", - "git2", - "tokio", -] - -[[package]] -name = "enclave_core" -version = "0.1.0" -dependencies = [ - "actix", - "actix-web", - "aggregator", - "alloy", - "alloy-primitives", - "anyhow", - "bincode", - "clap", - "config", - "crypto", - "data", - "dirs 5.0.1", - "e3_request", - "events", - "evm", - "fhe 0.1.0", - "hex", - "keyshare", - "libp2p", - "logger", - "net", - "phf", - "rand 0.8.5", - "rand_chacha 0.3.1", - "reqwest", - "serde", - "serde_json", - "sortition", - "test-helpers", - "tokio", - "tracing", - "zeroize", -] - [[package]] name = "encode_unicode" version = "1.0.0" @@ -2668,49 +2846,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "events" -version = "0.1.0" -dependencies = [ - "actix", - "alloy", - "alloy-primitives", - "alloy-sol-types", - "anyhow", - "bincode", - "bloom", - "bs58", - "futures-util", - "once_cell", - "serde", - "sha2", - "tracing", -] - -[[package]] -name = "evm" -version = "0.1.0" -dependencies = [ - "actix", - "alloy", - "alloy-primitives", - "anyhow", - "async-trait", - "base64", - "config", - "crypto", - "data", - "enclave_core", - "events", - "futures-util", - "serde", - "sortition", - "tokio", - "tracing", - "url", - "zeroize", -] - [[package]] name = "eyre" version = "0.6.12" @@ -2782,27 +2917,6 @@ dependencies = [ "zeroize_derive", ] -[[package]] -name = "fhe" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "async-trait", - "bincode", - "config", - "data", - "e3-bfv-helpers", - "e3_request", - "events", - "fhe 0.1.0-beta.7", - "fhe-traits", - "fhe-util", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", -] - [[package]] name = "fhe-math" version = "0.1.0-beta.7" @@ -3942,23 +4056,6 @@ dependencies = [ "sha3-asm", ] -[[package]] -name = "keyshare" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "async-trait", - "config", - "crypto", - "data", - "e3_request", - "events", - "fhe 0.1.0", - "serde", - "tracing", -] - [[package]] name = "kv-log-macro" version = "1.0.7" @@ -4497,16 +4594,6 @@ dependencies = [ "value-bag", ] -[[package]] -name = "logger" -version = "0.1.0" -dependencies = [ - "actix", - "base64", - "events", - "tracing", -] - [[package]] name = "lru" version = "0.12.5" @@ -4684,26 +4771,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "net" -version = "0.1.0" -dependencies = [ - "actix", - "anyhow", - "async-std", - "async-trait", - "config", - "crypto", - "data", - "events", - "futures", - "libp2p", - "tokio", - "tracing", - "tracing-subscriber", - "zeroize", -] - [[package]] name = "netlink-packet-core" version = "0.7.0" @@ -6523,23 +6590,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "sortition" -version = "0.1.0" -dependencies = [ - "actix", - "alloy", - "anyhow", - "async-trait", - "config", - "data", - "events", - "num", - "rand 0.8.5", - "serde", - "tracing", -] - [[package]] name = "spin" version = "0.5.2" @@ -6724,56 +6774,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "test-helpers" -version = "0.1.0" -dependencies = [ - "actix", - "bincode", - "clap", - "e3-sdk", - "events", - "fhe 0.1.0", - "fhe 0.1.0-beta.7", - "fhe-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "tracing", -] - -[[package]] -name = "tests" -version = "0.1.0" -dependencies = [ - "actix", - "aggregator", - "alloy", - "alloy-primitives", - "anyhow", - "async-std", - "base64", - "bincode", - "clap", - "crypto", - "data", - "e3-sdk", - "e3_request", - "events", - "evm", - "fhe 0.1.0", - "fhe 0.1.0-beta.7", - "fhe-traits", - "fhe-util", - "keyshare", - "logger", - "net", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sortition", - "test-helpers", - "tokio", -] - [[package]] name = "thiserror" version = "1.0.69" diff --git a/Cargo.toml b/Cargo.toml index 9fbdcf632f..f85be60359 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,9 +8,9 @@ members = [ "packages/ciphernode/bfv-helpers", "packages/ciphernode/evm-helpers", "packages/ciphernode/indexer", - "packages/ciphernode/e3_request", - "packages/ciphernode/enclave", - "packages/ciphernode/enclave_core", + "packages/ciphernode/request", + "packages/ciphernode/cli", + "packages/ciphernode/entrypoint", "packages/ciphernode/events", "packages/ciphernode/evm", "packages/ciphernode/fhe", @@ -20,7 +20,7 @@ members = [ "packages/ciphernode/net", "packages/ciphernode/sdk", "packages/ciphernode/sortition", - "packages/ciphernode/test_helpers", + "packages/ciphernode/test-helpers", "packages/ciphernode/tests", ] exclude = [ @@ -35,27 +35,27 @@ version = "0.1.0" edition = "2021" [workspace.dependencies] -aggregator = { path = "./packages/ciphernode/aggregator" } +e3-aggregator = { path = "./packages/ciphernode/aggregator" } e3-bfv-helpers = { path = "./packages/ciphernode/bfv-helpers" } -config = { path = "./packages/ciphernode/config" } -crypto = { path = "./packages/ciphernode/crypto" } -data = { path = "./packages/ciphernode/data" } -e3_request = { path = "./packages/ciphernode/e3_request" } +e3-config = { path = "./packages/ciphernode/config" } +e3-crypto = { path = "./packages/ciphernode/crypto" } +e3-data = { path = "./packages/ciphernode/data" } +e3-request = { path = "./packages/ciphernode/request" } e3-sdk = { path = "./packages/ciphernode/sdk" } -enclave = { path = "./packages/ciphernode/enclave" } -enclave_core = { path = "./packages/ciphernode/enclave_core" } -enclave-init = { path = "./packages/ciphernode/init" } -events = { path = "./packages/ciphernode/events" } -evm = { path = "./packages/ciphernode/evm" } +e3-cli = { path = "./packages/ciphernode/cli" } +e3-entrypoint = { path = "./packages/ciphernode/entrypoint" } +e3-init = { path = "./packages/ciphernode/init" } +e3-events = { path = "./packages/ciphernode/events" } +e3-evm = { path = "./packages/ciphernode/evm" } e3-evm-helpers = { path = "./packages/ciphernode/evm-helpers" } -fhe = { path = "./packages/ciphernode/fhe" } +e3-fhe = { path = "./packages/ciphernode/fhe" } e3-indexer = { path = "./packages/ciphernode/indexer" } -keyshare = { path = "./packages/ciphernode/keyshare" } -logger = { path = "./packages/ciphernode/logger" } -net = { path = "./packages/ciphernode/net" } -sortition = { path = "./packages/ciphernode/sortition" } -test_helpers = { package = "test-helpers", path = "./packages/ciphernode/test_helpers" } -tests = { path = "./packages/ciphernode/tests" } +e3-keyshare = { path = "./packages/ciphernode/keyshare" } +e3-logger = { path = "./packages/ciphernode/logger" } +e3-net = { path = "./packages/ciphernode/net" } +e3-sortition = { path = "./packages/ciphernode/sortition" } +e3-test-helpers = { path = "./packages/ciphernode/test-helpers" } +e3-tests = { path = "./packages/ciphernode/tests" } actix = "0.13.5" actix-web = "4.10.2" diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 29fd870b22..b24945c6b4 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -60,13 +60,12 @@ COPY Cargo.toml ./Cargo.toml # find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" COPY packages/ciphernode/aggregator/Cargo.toml packages/ciphernode/aggregator/Cargo.toml COPY packages/ciphernode/bfv-helpers/Cargo.toml packages/ciphernode/bfv-helpers/Cargo.toml +COPY packages/ciphernode/cli/Cargo.toml packages/ciphernode/cli/Cargo.toml COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml packages/ciphernode/config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml packages/ciphernode/crypto/Cargo.toml COPY packages/ciphernode/data/Cargo.toml packages/ciphernode/data/Cargo.toml -COPY packages/ciphernode/e3_request/Cargo.toml packages/ciphernode/e3_request/Cargo.toml -COPY packages/ciphernode/enclave/Cargo.toml packages/ciphernode/enclave/Cargo.toml -COPY packages/ciphernode/enclave_core/Cargo.toml packages/ciphernode/enclave_core/Cargo.toml +COPY packages/ciphernode/entrypoint/Cargo.toml packages/ciphernode/entrypoint/Cargo.toml COPY packages/ciphernode/events/Cargo.toml packages/ciphernode/events/Cargo.toml COPY packages/ciphernode/evm/Cargo.toml packages/ciphernode/evm/Cargo.toml COPY packages/ciphernode/evm-helpers/Cargo.toml packages/ciphernode/evm-helpers/Cargo.toml @@ -76,9 +75,10 @@ COPY packages/ciphernode/init/Cargo.toml packages/ciphernode/init/Cargo.toml COPY packages/ciphernode/keyshare/Cargo.toml packages/ciphernode/keyshare/Cargo.toml COPY packages/ciphernode/logger/Cargo.toml packages/ciphernode/logger/Cargo.toml COPY packages/ciphernode/net/Cargo.toml packages/ciphernode/net/Cargo.toml +COPY packages/ciphernode/request/Cargo.toml packages/ciphernode/request/Cargo.toml COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/Cargo.toml COPY packages/ciphernode/sortition/Cargo.toml packages/ciphernode/sortition/Cargo.toml -COPY packages/ciphernode/test_helpers/Cargo.toml packages/ciphernode/test_helpers/Cargo.toml +COPY packages/ciphernode/test-helpers/Cargo.toml packages/ciphernode/test-helpers/Cargo.toml COPY packages/ciphernode/tests/Cargo.toml packages/ciphernode/tests/Cargo.toml RUN set -eux; \ diff --git a/examples/CRISP/scripts/tasks/setup.sh b/examples/CRISP/scripts/tasks/setup.sh index 6ba8f1ab2f..9e65be128d 100755 --- a/examples/CRISP/scripts/tasks/setup.sh +++ b/examples/CRISP/scripts/tasks/setup.sh @@ -12,7 +12,7 @@ echo "pnpm install" echo "evm" (cd /app/packages/evm && pnpm compile) echo "ciphernode" -(cd /app/packages/ciphernode && cargo build && cargo install --path ./enclave --force) +(cd /app && cargo build -p e3-cli && cargo install --path packages/ciphernode/cli) echo "program" (cd ./apps/program && cargo build --bin crisp-program) echo "server" diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile index 0fa32cf718..8bc9384827 100644 --- a/packages/ciphernode/Dockerfile +++ b/packages/ciphernode/Dockerfile @@ -30,13 +30,12 @@ COPY --from=evm-builder /build/packages/evm/deployments ../evm/deployments # find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) packages/ciphernode/|COPY \1 ./|' COPY packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY packages/ciphernode/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml +COPY packages/ciphernode/cli/Cargo.toml ./cli/Cargo.toml COPY packages/ciphernode/compute-provider/Cargo.toml ./compute-provider/Cargo.toml COPY packages/ciphernode/config/Cargo.toml ./config/Cargo.toml COPY packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml COPY packages/ciphernode/data/Cargo.toml ./data/Cargo.toml -COPY packages/ciphernode/e3_request/Cargo.toml ./e3_request/Cargo.toml -COPY packages/ciphernode/enclave/Cargo.toml ./enclave/Cargo.toml -COPY packages/ciphernode/enclave_core/Cargo.toml ./enclave_core/Cargo.toml +COPY packages/ciphernode/entrypoint/Cargo.toml ./entrypoint/Cargo.toml COPY packages/ciphernode/events/Cargo.toml ./events/Cargo.toml COPY packages/ciphernode/evm/Cargo.toml ./evm/Cargo.toml COPY packages/ciphernode/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml @@ -46,17 +45,18 @@ COPY packages/ciphernode/init/Cargo.toml ./init/Cargo.toml COPY packages/ciphernode/keyshare/Cargo.toml ./keyshare/Cargo.toml COPY packages/ciphernode/logger/Cargo.toml ./logger/Cargo.toml COPY packages/ciphernode/net/Cargo.toml ./net/Cargo.toml +COPY packages/ciphernode/request/Cargo.toml ./request/Cargo.toml COPY packages/ciphernode/sdk/Cargo.toml ./sdk/Cargo.toml COPY packages/ciphernode/sortition/Cargo.toml ./sortition/Cargo.toml -COPY packages/ciphernode/test_helpers/Cargo.toml ./test_helpers/Cargo.toml +COPY packages/ciphernode/test-helpers/Cargo.toml ./test-helpers/Cargo.toml COPY packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml -COPY ./packages/ciphernode/enclave_core/build.rs ./enclave_core/build.rs +COPY ./packages/ciphernode/entrypoint/build.rs ./entrypoint/build.rs RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ mkdir -p "$d/src" && \ - echo "fn main() {}" > "$d/src/lib.rs"; \ + echo "fn main() {}" > "$d/src/main.rs"; \ fi \ done @@ -65,7 +65,7 @@ RUN cargo build --release COPY ./packages/ciphernode . RUN find . -name "*.rs" -exec touch {} + -RUN cargo build --release +RUN cargo build --release -p e3-cli # Runtime stage FROM debian:stable-slim diff --git a/packages/ciphernode/aggregator/Cargo.toml b/packages/ciphernode/aggregator/Cargo.toml index 50de627b7d..37217bdc0e 100644 --- a/packages/ciphernode/aggregator/Cargo.toml +++ b/packages/ciphernode/aggregator/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "aggregator" +name = "e3-aggregator" version.workspace = true edition.workspace = true @@ -8,11 +8,11 @@ actix = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } bincode = { workspace = true } -config = { workspace = true } +e3-config = { workspace = true } async-trait = { workspace = true } -events = { workspace = true } -fhe = { workspace = true } -sortition = { workspace = true } -e3_request = { workspace = true } -data = { workspace = true } +e3-events = { workspace = true } +e3-fhe = { workspace = true } +e3-sortition = { workspace = true } +e3-request = { workspace = true } +e3-data = { workspace = true } tracing = { workspace = true } diff --git a/packages/ciphernode/aggregator/src/ext.rs b/packages/ciphernode/aggregator/src/ext.rs index b4a38b194c..550f297c84 100644 --- a/packages/ciphernode/aggregator/src/ext.rs +++ b/packages/ciphernode/aggregator/src/ext.rs @@ -6,11 +6,11 @@ use crate::{ use actix::{Actor, Addr}; use anyhow::{anyhow, Result}; use async_trait::async_trait; -use data::{AutoPersist, RepositoriesFactory}; +use e3_data::{AutoPersist, RepositoriesFactory}; +use e3_events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus}; +use e3_fhe::ext::FHE_KEY; use e3_request::{E3Context, E3ContextSnapshot, E3Extension, META_KEY}; -use events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus}; -use fhe::ext::FHE_KEY; -use sortition::Sortition; +use e3_sortition::Sortition; pub struct PlaintextAggregatorExtension { bus: Addr>, diff --git a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs index 167116a9da..f91beadf36 100644 --- a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs +++ b/packages/ciphernode/aggregator/src/plaintext_aggregator.rs @@ -1,12 +1,12 @@ use actix::prelude::*; use anyhow::Result; -use data::Persistable; -use events::{ +use e3_data::Persistable; +use e3_events::{ DecryptionshareCreated, Die, E3id, EnclaveEvent, EventBus, OrderedSet, PlaintextAggregated, Seed, }; -use fhe::{Fhe, GetAggregatePlaintext}; -use sortition::{GetHasNode, Sortition}; +use e3_fhe::{Fhe, GetAggregatePlaintext}; +use e3_sortition::{GetHasNode, Sortition}; use std::sync::Arc; use tracing::error; diff --git a/packages/ciphernode/aggregator/src/publickey_aggregator.rs b/packages/ciphernode/aggregator/src/publickey_aggregator.rs index 03869987a9..894acdc441 100644 --- a/packages/ciphernode/aggregator/src/publickey_aggregator.rs +++ b/packages/ciphernode/aggregator/src/publickey_aggregator.rs @@ -1,11 +1,11 @@ use actix::prelude::*; use anyhow::Result; -use data::Persistable; -use events::{ +use e3_data::Persistable; +use e3_events::{ Die, E3id, EnclaveEvent, EventBus, KeyshareCreated, OrderedSet, PublicKeyAggregated, Seed, }; -use fhe::{Fhe, GetAggregatePublicKey}; -use sortition::{GetHasNode, GetNodes, Sortition}; +use e3_fhe::{Fhe, GetAggregatePublicKey}; +use e3_sortition::{GetHasNode, GetNodes, Sortition}; use std::sync::Arc; use tracing::error; diff --git a/packages/ciphernode/aggregator/src/repo.rs b/packages/ciphernode/aggregator/src/repo.rs index e12ad6e881..c4f9c6b53d 100644 --- a/packages/ciphernode/aggregator/src/repo.rs +++ b/packages/ciphernode/aggregator/src/repo.rs @@ -1,6 +1,6 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; -use events::E3id; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; +use e3_events::E3id; use crate::{PlaintextAggregatorState, PublicKeyAggregatorState}; diff --git a/packages/ciphernode/enclave/Cargo.toml b/packages/ciphernode/cli/Cargo.toml similarity index 74% rename from packages/ciphernode/enclave/Cargo.toml rename to packages/ciphernode/cli/Cargo.toml index 9f6c3cb829..6faa20c370 100644 --- a/packages/ciphernode/enclave/Cargo.toml +++ b/packages/ciphernode/cli/Cargo.toml @@ -1,21 +1,25 @@ [package] -name = "enclave" +name = "e3-cli" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave" + +[[bin]] +name = "enclave" +path = "src/main.rs" [dependencies] actix = { workspace = true } anyhow = { workspace = true } clap = { workspace = true } compile-time = { workspace = true } -config = { workspace = true } -crypto = { workspace = true } +e3-config = { workspace = true } +e3-crypto = { workspace = true } dialoguer = { workspace = true } -enclave_core = { workspace = true } -enclave-init = { workspace = true } -events = { workspace = true } +e3-entrypoint = { workspace = true } +e3-init = { workspace = true } +e3-events = { workspace = true } hex = { workspace = true } opentelemetry = { workspace = true } opentelemetry-otlp = { workspace = true } diff --git a/packages/ciphernode/enclave/src/cli.rs b/packages/ciphernode/cli/src/cli.rs similarity index 95% rename from packages/ciphernode/enclave/src/cli.rs rename to packages/ciphernode/cli/src/cli.rs index d7a94924b1..b4d82713cd 100644 --- a/packages/ciphernode/enclave/src/cli.rs +++ b/packages/ciphernode/cli/src/cli.rs @@ -7,9 +7,9 @@ use crate::wallet::WalletCommands; use crate::{init, net, password, wallet, wizard}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; -use config::validation::ValidUrl; -use config::{load_config, AppConfig}; -use enclave_core::helpers::datastore::close_all_connections; +use e3_config::validation::ValidUrl; +use e3_config::{load_config, AppConfig}; +use e3_entrypoint::helpers::datastore::close_all_connections; use tracing::{info, instrument, Level}; #[derive(Parser, Debug)] @@ -114,15 +114,15 @@ impl Cli { info!("Config loaded from: {:?}", config.config_file()); if config.autopassword() { - enclave_core::password::set::autopassword(&config).await?; + e3_entrypoint::password::set::autopassword(&config).await?; } if config.autonetkey() { - enclave_core::net::keypair::generate::autonetkey(&config).await?; + e3_entrypoint::net::keypair::generate::autonetkey(&config).await?; } if config.autowallet() { - enclave_core::wallet::set::autowallet(&config).await?; + e3_entrypoint::wallet::set::autowallet(&config).await?; } match self.command { diff --git a/packages/ciphernode/enclave/src/helpers/compile_id.rs b/packages/ciphernode/cli/src/helpers/compile_id.rs similarity index 100% rename from packages/ciphernode/enclave/src/helpers/compile_id.rs rename to packages/ciphernode/cli/src/helpers/compile_id.rs diff --git a/packages/ciphernode/enclave/src/helpers/mod.rs b/packages/ciphernode/cli/src/helpers/mod.rs similarity index 100% rename from packages/ciphernode/enclave/src/helpers/mod.rs rename to packages/ciphernode/cli/src/helpers/mod.rs diff --git a/packages/ciphernode/enclave/src/helpers/prompt_password.rs b/packages/ciphernode/cli/src/helpers/prompt_password.rs similarity index 100% rename from packages/ciphernode/enclave/src/helpers/prompt_password.rs rename to packages/ciphernode/cli/src/helpers/prompt_password.rs diff --git a/packages/ciphernode/enclave/src/helpers/telemetry.rs b/packages/ciphernode/cli/src/helpers/telemetry.rs similarity index 98% rename from packages/ciphernode/enclave/src/helpers/telemetry.rs rename to packages/ciphernode/cli/src/helpers/telemetry.rs index 05b619e8da..e90e7efb09 100644 --- a/packages/ciphernode/enclave/src/helpers/telemetry.rs +++ b/packages/ciphernode/cli/src/helpers/telemetry.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use config::AppConfig; +use e3_config::AppConfig; use opentelemetry::trace::TracerProvider; use opentelemetry_otlp::{Protocol, WithExportConfig}; use opentelemetry_sdk::trace::SdkTracerProvider; diff --git a/packages/ciphernode/enclave/src/init.rs b/packages/ciphernode/cli/src/init.rs similarity index 64% rename from packages/ciphernode/enclave/src/init.rs rename to packages/ciphernode/cli/src/init.rs index cde34a1e5a..da0c897235 100644 --- a/packages/ciphernode/enclave/src/init.rs +++ b/packages/ciphernode/cli/src/init.rs @@ -1,5 +1,5 @@ use anyhow::Result; pub async fn execute() -> Result<()> { - enclave_init::execute().await + e3_init::execute().await } diff --git a/packages/ciphernode/enclave/src/main.rs b/packages/ciphernode/cli/src/main.rs similarity index 100% rename from packages/ciphernode/enclave/src/main.rs rename to packages/ciphernode/cli/src/main.rs diff --git a/packages/ciphernode/enclave/src/net.rs b/packages/ciphernode/cli/src/net.rs similarity index 98% rename from packages/ciphernode/enclave/src/net.rs rename to packages/ciphernode/cli/src/net.rs index 7b5a26113d..1dc340776f 100644 --- a/packages/ciphernode/enclave/src/net.rs +++ b/packages/ciphernode/cli/src/net.rs @@ -1,6 +1,6 @@ use anyhow::*; use clap::Subcommand; -use config::AppConfig; +use e3_config::AppConfig; use crate::{net_generate, net_purge, net_set}; diff --git a/packages/ciphernode/enclave/src/net_generate.rs b/packages/ciphernode/cli/src/net_generate.rs similarity index 85% rename from packages/ciphernode/enclave/src/net_generate.rs rename to packages/ciphernode/cli/src/net_generate.rs index 2702b20699..33791ab48d 100644 --- a/packages/ciphernode/enclave/src/net_generate.rs +++ b/packages/ciphernode/cli/src/net_generate.rs @@ -1,6 +1,6 @@ use anyhow::Result; -use config::AppConfig; -use enclave_core::net; +use e3_config::AppConfig; +use e3_entrypoint::net; pub async fn execute(config: &AppConfig) -> Result<()> { let peer_id = net::keypair::generate::execute(config).await?; diff --git a/packages/ciphernode/enclave/src/net_purge.rs b/packages/ciphernode/cli/src/net_purge.rs similarity index 81% rename from packages/ciphernode/enclave/src/net_purge.rs rename to packages/ciphernode/cli/src/net_purge.rs index 359530065d..867e884dc0 100644 --- a/packages/ciphernode/enclave/src/net_purge.rs +++ b/packages/ciphernode/cli/src/net_purge.rs @@ -1,6 +1,6 @@ use anyhow::*; -use config::AppConfig; -use enclave_core::net; +use e3_config::AppConfig; +use e3_entrypoint::net; pub async fn execute(config: &AppConfig) -> Result<()> { net::peer_id::purge::execute(config).await?; diff --git a/packages/ciphernode/enclave/src/net_set.rs b/packages/ciphernode/cli/src/net_set.rs similarity index 86% rename from packages/ciphernode/enclave/src/net_set.rs rename to packages/ciphernode/cli/src/net_set.rs index e92b6540e5..7a80f1eeb5 100644 --- a/packages/ciphernode/enclave/src/net_set.rs +++ b/packages/ciphernode/cli/src/net_set.rs @@ -1,7 +1,7 @@ use anyhow::Result; -use config::AppConfig; use dialoguer::{theme::ColorfulTheme, Password}; -use enclave_core::net::{self, keypair::set::validate_keypair_input}; +use e3_config::AppConfig; +use e3_entrypoint::net::{self, keypair::set::validate_keypair_input}; pub async fn execute(config: &AppConfig, net_keypair: Option) -> Result<()> { let input = if let Some(nkp) = net_keypair { diff --git a/packages/ciphernode/enclave/src/nodes.rs b/packages/ciphernode/cli/src/nodes.rs similarity index 98% rename from packages/ciphernode/enclave/src/nodes.rs rename to packages/ciphernode/cli/src/nodes.rs index fdf3c99de4..0e32976b4a 100644 --- a/packages/ciphernode/enclave/src/nodes.rs +++ b/packages/ciphernode/cli/src/nodes.rs @@ -1,6 +1,6 @@ use anyhow::*; use clap::Subcommand; -use config::AppConfig; +use e3_config::AppConfig; use crate::{ nodes_daemon, nodes_down, nodes_ps, nodes_restart, nodes_start, nodes_status, nodes_stop, diff --git a/packages/ciphernode/enclave/src/nodes_daemon.rs b/packages/ciphernode/cli/src/nodes_daemon.rs similarity index 81% rename from packages/ciphernode/enclave/src/nodes_daemon.rs rename to packages/ciphernode/cli/src/nodes_daemon.rs index 351885bff9..b39d718b01 100644 --- a/packages/ciphernode/enclave/src/nodes_daemon.rs +++ b/packages/ciphernode/cli/src/nodes_daemon.rs @@ -1,6 +1,6 @@ use anyhow::*; -use config::AppConfig; -use enclave_core::nodes::daemon; +use e3_config::AppConfig; +use e3_entrypoint::nodes::daemon; pub async fn execute( config: &AppConfig, diff --git a/packages/ciphernode/enclave/src/nodes_down.rs b/packages/ciphernode/cli/src/nodes_down.rs similarity index 75% rename from packages/ciphernode/enclave/src/nodes_down.rs rename to packages/ciphernode/cli/src/nodes_down.rs index bdc8a8d61b..a320283538 100644 --- a/packages/ciphernode/enclave/src/nodes_down.rs +++ b/packages/ciphernode/cli/src/nodes_down.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::down; +use e3_entrypoint::nodes::down; pub async fn execute() -> Result<()> { down::execute().await?; diff --git a/packages/ciphernode/enclave/src/nodes_ps.rs b/packages/ciphernode/cli/src/nodes_ps.rs similarity index 75% rename from packages/ciphernode/enclave/src/nodes_ps.rs rename to packages/ciphernode/cli/src/nodes_ps.rs index c75faeee64..58c09c3ae2 100644 --- a/packages/ciphernode/enclave/src/nodes_ps.rs +++ b/packages/ciphernode/cli/src/nodes_ps.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::ps; +use e3_entrypoint::nodes::ps; pub async fn execute() -> Result<()> { ps::execute().await?; diff --git a/packages/ciphernode/enclave/src/nodes_restart.rs b/packages/ciphernode/cli/src/nodes_restart.rs similarity index 75% rename from packages/ciphernode/enclave/src/nodes_restart.rs rename to packages/ciphernode/cli/src/nodes_restart.rs index 15f15b59ad..39dd991705 100644 --- a/packages/ciphernode/enclave/src/nodes_restart.rs +++ b/packages/ciphernode/cli/src/nodes_restart.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::restart; +use e3_entrypoint::nodes::restart; pub async fn execute(id: &str) -> Result<()> { restart::execute(id).await?; diff --git a/packages/ciphernode/enclave/src/nodes_start.rs b/packages/ciphernode/cli/src/nodes_start.rs similarity index 76% rename from packages/ciphernode/enclave/src/nodes_start.rs rename to packages/ciphernode/cli/src/nodes_start.rs index 9ab408d66f..b4c4799d48 100644 --- a/packages/ciphernode/enclave/src/nodes_start.rs +++ b/packages/ciphernode/cli/src/nodes_start.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::start; +use e3_entrypoint::nodes::start; pub async fn execute(id: &str) -> Result<()> { start::execute(id).await?; diff --git a/packages/ciphernode/enclave/src/nodes_status.rs b/packages/ciphernode/cli/src/nodes_status.rs similarity index 76% rename from packages/ciphernode/enclave/src/nodes_status.rs rename to packages/ciphernode/cli/src/nodes_status.rs index 391c80b406..ea764be6f8 100644 --- a/packages/ciphernode/enclave/src/nodes_status.rs +++ b/packages/ciphernode/cli/src/nodes_status.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::status; +use e3_entrypoint::nodes::status; pub async fn execute(id: &str) -> Result<()> { status::execute(id).await?; diff --git a/packages/ciphernode/enclave/src/nodes_stop.rs b/packages/ciphernode/cli/src/nodes_stop.rs similarity index 76% rename from packages/ciphernode/enclave/src/nodes_stop.rs rename to packages/ciphernode/cli/src/nodes_stop.rs index ff44785ca8..e82dc97176 100644 --- a/packages/ciphernode/enclave/src/nodes_stop.rs +++ b/packages/ciphernode/cli/src/nodes_stop.rs @@ -1,5 +1,5 @@ use anyhow::*; -use enclave_core::nodes::stop; +use e3_entrypoint::nodes::stop; pub async fn execute(id: &str) -> Result<()> { stop::execute(id).await?; diff --git a/packages/ciphernode/enclave/src/nodes_up.rs b/packages/ciphernode/cli/src/nodes_up.rs similarity index 83% rename from packages/ciphernode/enclave/src/nodes_up.rs rename to packages/ciphernode/cli/src/nodes_up.rs index cc500748b2..1de56bc5d8 100644 --- a/packages/ciphernode/enclave/src/nodes_up.rs +++ b/packages/ciphernode/cli/src/nodes_up.rs @@ -1,6 +1,6 @@ use anyhow::*; -use config::AppConfig; -use enclave_core::nodes::up; +use e3_config::AppConfig; +use e3_entrypoint::nodes::up; pub async fn execute( config: &AppConfig, diff --git a/packages/ciphernode/enclave/src/password.rs b/packages/ciphernode/cli/src/password.rs similarity index 96% rename from packages/ciphernode/enclave/src/password.rs rename to packages/ciphernode/cli/src/password.rs index f97991b751..b8da6d0a16 100644 --- a/packages/ciphernode/enclave/src/password.rs +++ b/packages/ciphernode/cli/src/password.rs @@ -1,6 +1,6 @@ use anyhow::*; use clap::Subcommand; -use config::AppConfig; +use e3_config::AppConfig; use crate::{password_delete, password_set}; diff --git a/packages/ciphernode/enclave/src/password_delete.rs b/packages/ciphernode/cli/src/password_delete.rs similarity index 84% rename from packages/ciphernode/enclave/src/password_delete.rs rename to packages/ciphernode/cli/src/password_delete.rs index fee6124439..86fac12ab4 100644 --- a/packages/ciphernode/enclave/src/password_delete.rs +++ b/packages/ciphernode/cli/src/password_delete.rs @@ -1,7 +1,7 @@ use crate::helpers::prompt_password::prompt_password; use anyhow::Result; -use config::AppConfig; use dialoguer::{theme::ColorfulTheme, Confirm}; +use e3_config::AppConfig; use zeroize::Zeroize; pub async fn prompt_delete(config: &AppConfig) -> Result { @@ -13,7 +13,7 @@ pub async fn prompt_delete(config: &AppConfig) -> Result { return Ok(false); } - let Ok(mut cur_pw) = enclave_core::password::delete::get_current_password(config).await else { + let Ok(mut cur_pw) = e3_entrypoint::password::delete::get_current_password(config).await else { println!("Password is not set. Nothing to do."); return Ok(false); }; @@ -31,7 +31,7 @@ pub async fn prompt_delete(config: &AppConfig) -> Result { pub async fn execute(config: &AppConfig) -> Result<()> { if prompt_delete(config).await? { - enclave_core::password::delete::execute(config).await?; + e3_entrypoint::password::delete::execute(config).await?; println!("Password successfully deleted."); } else { println!("Operation cancelled."); diff --git a/packages/ciphernode/enclave/src/password_set.rs b/packages/ciphernode/cli/src/password_set.rs similarity index 90% rename from packages/ciphernode/enclave/src/password_set.rs rename to packages/ciphernode/cli/src/password_set.rs index f0185b9f80..e6e8216e81 100644 --- a/packages/ciphernode/enclave/src/password_set.rs +++ b/packages/ciphernode/cli/src/password_set.rs @@ -1,5 +1,5 @@ use anyhow::{bail, Result}; -use config::AppConfig; +use e3_config::AppConfig; use zeroize::{Zeroize, Zeroizing}; use crate::helpers::prompt_password::prompt_password; @@ -42,11 +42,11 @@ fn get_zeroizing_pw_vec(input: Option) -> Result>> { pub async fn execute(config: &AppConfig, input: Option) -> Result<()> { println!("Setting password..."); - enclave_core::password::set::preflight(config).await?; + e3_entrypoint::password::set::preflight(config).await?; let pw = get_zeroizing_pw_vec(input)?; - enclave_core::password::set::execute(config, pw).await?; + e3_entrypoint::password::set::execute(config, pw).await?; println!("Password successfully set."); diff --git a/packages/ciphernode/enclave/src/start.rs b/packages/ciphernode/cli/src/start.rs similarity index 80% rename from packages/ciphernode/enclave/src/start.rs rename to packages/ciphernode/cli/src/start.rs index f0847529c2..192ec80249 100644 --- a/packages/ciphernode/enclave/src/start.rs +++ b/packages/ciphernode/cli/src/start.rs @@ -1,7 +1,7 @@ use crate::owo; use anyhow::{anyhow, Result}; -use config::{AppConfig, NodeRole}; -use enclave_core::helpers::listen_for_shutdown; +use e3_config::{AppConfig, NodeRole}; +use e3_entrypoint::helpers::listen_for_shutdown; use tracing::{info, instrument}; #[instrument(skip_all)] @@ -21,7 +21,7 @@ pub async fn execute(mut config: AppConfig, peers: Vec) -> Result<()> { pubkey_write_path, plaintext_write_path, } => { - enclave_core::start::aggregator_start::execute( + e3_entrypoint::start::aggregator_start::execute( &config, pubkey_write_path, plaintext_write_path, @@ -30,7 +30,7 @@ pub async fn execute(mut config: AppConfig, peers: Vec) -> Result<()> { } // Launch in ciphernode configuration - NodeRole::Ciphernode => enclave_core::start::start::execute(&config, address).await?, + NodeRole::Ciphernode => e3_entrypoint::start::start::execute(&config, address).await?, }; info!( diff --git a/packages/ciphernode/enclave/src/wallet.rs b/packages/ciphernode/cli/src/wallet.rs similarity index 96% rename from packages/ciphernode/enclave/src/wallet.rs rename to packages/ciphernode/cli/src/wallet.rs index 3ad3ac226d..af703a5597 100644 --- a/packages/ciphernode/enclave/src/wallet.rs +++ b/packages/ciphernode/cli/src/wallet.rs @@ -1,6 +1,6 @@ use anyhow::*; use clap::Subcommand; -use config::AppConfig; +use e3_config::AppConfig; use crate::wallet_set; diff --git a/packages/ciphernode/enclave/src/wallet_set.rs b/packages/ciphernode/cli/src/wallet_set.rs similarity index 81% rename from packages/ciphernode/enclave/src/wallet_set.rs rename to packages/ciphernode/cli/src/wallet_set.rs index f51d012288..aa4e96c2e8 100644 --- a/packages/ciphernode/enclave/src/wallet_set.rs +++ b/packages/ciphernode/cli/src/wallet_set.rs @@ -1,7 +1,7 @@ use anyhow::Result; -use config::AppConfig; use dialoguer::{theme::ColorfulTheme, Password}; -use enclave_core::wallet::set::validate_private_key; +use e3_config::AppConfig; +use e3_entrypoint::wallet::set::validate_private_key; pub async fn execute(config: &AppConfig, private_key: Option) -> Result<()> { let input = if let Some(private_key) = private_key { @@ -16,7 +16,7 @@ pub async fn execute(config: &AppConfig, private_key: Option) -> Result< .to_string() }; - enclave_core::wallet::set::execute(config, input).await?; + e3_entrypoint::wallet::set::execute(config, input).await?; println!("WalletKey key has been successfully stored and encrypted."); diff --git a/packages/ciphernode/enclave/src/wizard.rs b/packages/ciphernode/cli/src/wizard.rs similarity index 98% rename from packages/ciphernode/enclave/src/wizard.rs rename to packages/ciphernode/cli/src/wizard.rs index 9e352579d5..bc76f3926e 100644 --- a/packages/ciphernode/enclave/src/wizard.rs +++ b/packages/ciphernode/cli/src/wizard.rs @@ -1,6 +1,6 @@ use anyhow::Result; use dialoguer::{theme::ColorfulTheme, Input}; -use enclave_core::wizard; +use e3_entrypoint::wizard; use tracing::instrument; use crate::net; diff --git a/packages/ciphernode/config/Cargo.toml b/packages/ciphernode/config/Cargo.toml index 417275eed9..74c6cd1cd5 100644 --- a/packages/ciphernode/config/Cargo.toml +++ b/packages/ciphernode/config/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "config" +name = "e3-config" version.workspace = true edition.workspace = true @@ -7,7 +7,7 @@ edition.workspace = true alloy = { workspace = true } anyhow = { workspace = true } dirs = { workspace = true } -events = { workspace = true } +e3-events = { workspace = true } figment = { workspace = true } path-clean = { workspace = true } petname = { workspace = true } diff --git a/packages/ciphernode/config/src/store_keys.rs b/packages/ciphernode/config/src/store_keys.rs index 812d0bdcfb..0df9942199 100644 --- a/packages/ciphernode/config/src/store_keys.rs +++ b/packages/ciphernode/config/src/store_keys.rs @@ -1,4 +1,4 @@ -use events::E3id; +use e3_events::E3id; pub struct StoreKeys; diff --git a/packages/ciphernode/crypto/Cargo.toml b/packages/ciphernode/crypto/Cargo.toml index 095f5e45eb..1a5220555d 100644 --- a/packages/ciphernode/crypto/Cargo.toml +++ b/packages/ciphernode/crypto/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "crypto" +name = "e3-crypto" version.workspace = true edition.workspace = true @@ -10,5 +10,5 @@ rand = { workspace = true } zeroize = { workspace = true } anyhow = { workspace = true } tokio = { workspace = true } -config = { workspace = true } -async-trait = { workspace = true } \ No newline at end of file +e3-config = { workspace = true } +async-trait = { workspace = true } diff --git a/packages/ciphernode/crypto/src/cipher.rs b/packages/ciphernode/crypto/src/cipher.rs index ded90491e4..fad92c8fa7 100644 --- a/packages/ciphernode/crypto/src/cipher.rs +++ b/packages/ciphernode/crypto/src/cipher.rs @@ -6,7 +6,7 @@ use aes_gcm::{ }; use anyhow::{anyhow, Result}; use argon2::{Algorithm, Argon2, Params, Version}; -use config::AppConfig; +use e3_config::AppConfig; use rand::{rngs::OsRng, RngCore}; use zeroize::{Zeroize, Zeroizing}; diff --git a/packages/ciphernode/data/Cargo.toml b/packages/ciphernode/data/Cargo.toml index 6e4197517c..cdad02f33e 100644 --- a/packages/ciphernode/data/Cargo.toml +++ b/packages/ciphernode/data/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "data" +name = "e3-data" version.workspace = true edition.workspace = true description = "Data persistence for enclave" @@ -7,7 +7,7 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" [dependencies] actix = { workspace = true } -events = { workspace = true } +e3-events = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } sled = { workspace = true } diff --git a/packages/ciphernode/data/src/data_store.rs b/packages/ciphernode/data/src/data_store.rs index 07a13c9102..5fb25c2fa9 100644 --- a/packages/ciphernode/data/src/data_store.rs +++ b/packages/ciphernode/data/src/data_store.rs @@ -140,8 +140,8 @@ impl DataStore { /// Changes the scope for the data store. /// Note that if the scope does not start with a slash one is appended. /// ``` - /// use data::DataStore; - /// use data::InMemStore; + /// use e3_data::DataStore; + /// use e3_data::InMemStore; /// use actix::Actor; /// use anyhow::Result; /// diff --git a/packages/ciphernode/data/src/sled_store.rs b/packages/ciphernode/data/src/sled_store.rs index 4bf854efc5..0563656c1a 100644 --- a/packages/ciphernode/data/src/sled_store.rs +++ b/packages/ciphernode/data/src/sled_store.rs @@ -1,7 +1,7 @@ use crate::{Get, Insert, InsertSync, Remove}; use actix::{Actor, ActorContext, Addr, Handler}; use anyhow::{Context, Result}; -use events::{ +use e3_events::{ get_enclave_event_bus, BusError, EnclaveErrorType, EnclaveEvent, EventBus, Subscribe, }; use once_cell::sync::Lazy; diff --git a/packages/ciphernode/enclave_core/Cargo.toml b/packages/ciphernode/entrypoint/Cargo.toml similarity index 66% rename from packages/ciphernode/enclave_core/Cargo.toml rename to packages/ciphernode/entrypoint/Cargo.toml index 91c28fae51..1361e3ad28 100644 --- a/packages/ciphernode/enclave_core/Cargo.toml +++ b/packages/ciphernode/entrypoint/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "enclave_core" +name = "e3-entrypoint" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" @@ -8,32 +8,32 @@ build = "build.rs" [dependencies] actix = { workspace = true } -aggregator = { workspace = true } +e3-aggregator = { workspace = true } alloy = { workspace = true } alloy-primitives = { workspace = true } anyhow = { workspace = true } bincode = { workspace = true } -config = { workspace = true } +e3-config = { workspace = true } clap = { workspace = true } -crypto = { workspace = true } -data = { workspace = true } +e3-crypto = { workspace = true } +e3-data = { workspace = true } dirs = { workspace = true } -events = { workspace = true } -evm = { workspace = true } -fhe = { workspace = true } +e3-events = { workspace = true } +e3-evm = { workspace = true } +e3-fhe = { workspace = true } hex = { workspace = true } -keyshare = { workspace = true } -logger = { workspace = true } +e3-keyshare = { workspace = true } +e3-logger = { workspace = true } libp2p = { workspace = true } -net = { workspace = true } +e3-net = { workspace = true } phf = { workspace = true } rand = { workspace = true } rand_chacha = { workspace = true } -e3_request = { workspace = true } +e3-request = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -sortition = { workspace = true } -test_helpers = { workspace = true } +e3-sortition = { workspace = true } +e3-test-helpers = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } zeroize = { workspace = true } diff --git a/packages/ciphernode/entrypoint/README.md b/packages/ciphernode/entrypoint/README.md new file mode 100644 index 0000000000..d92b1f50ac --- /dev/null +++ b/packages/ciphernode/entrypoint/README.md @@ -0,0 +1,3 @@ +Enclave entry point create. + +This needs further refactoring and decomposition to separate crates per functionality. diff --git a/packages/ciphernode/enclave_core/build.rs b/packages/ciphernode/entrypoint/build.rs similarity index 100% rename from packages/ciphernode/enclave_core/build.rs rename to packages/ciphernode/entrypoint/build.rs diff --git a/packages/ciphernode/enclave_core/src/helpers/datastore.rs b/packages/ciphernode/entrypoint/src/helpers/datastore.rs similarity index 81% rename from packages/ciphernode/enclave_core/src/helpers/datastore.rs rename to packages/ciphernode/entrypoint/src/helpers/datastore.rs index cc4d0eb8ab..95f7d938ed 100644 --- a/packages/ciphernode/enclave_core/src/helpers/datastore.rs +++ b/packages/ciphernode/entrypoint/src/helpers/datastore.rs @@ -2,10 +2,10 @@ use std::path::PathBuf; use actix::{Actor, Addr}; use anyhow::Result; -use config::AppConfig; -use data::{DataStore, InMemStore, SledDb, SledStore}; -use data::{Repositories, RepositoriesFactory}; -use events::{get_enclave_event_bus, EnclaveEvent, EventBus}; +use e3_config::AppConfig; +use e3_data::{DataStore, InMemStore, SledDb, SledStore}; +use e3_data::{Repositories, RepositoriesFactory}; +use e3_events::{get_enclave_event_bus, EnclaveEvent, EventBus}; pub fn get_sled_store(bus: &Addr>, db_file: &PathBuf) -> Result { Ok((&SledStore::new(bus, db_file)?).into()) diff --git a/packages/ciphernode/enclave_core/src/helpers/mod.rs b/packages/ciphernode/entrypoint/src/helpers/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/helpers/mod.rs rename to packages/ciphernode/entrypoint/src/helpers/mod.rs diff --git a/packages/ciphernode/enclave_core/src/helpers/rand.rs b/packages/ciphernode/entrypoint/src/helpers/rand.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/helpers/rand.rs rename to packages/ciphernode/entrypoint/src/helpers/rand.rs diff --git a/packages/ciphernode/enclave_core/src/helpers/shutdown.rs b/packages/ciphernode/entrypoint/src/helpers/shutdown.rs similarity index 95% rename from packages/ciphernode/enclave_core/src/helpers/shutdown.rs rename to packages/ciphernode/entrypoint/src/helpers/shutdown.rs index 1736b648ef..38978d444b 100644 --- a/packages/ciphernode/enclave_core/src/helpers/shutdown.rs +++ b/packages/ciphernode/entrypoint/src/helpers/shutdown.rs @@ -1,6 +1,6 @@ use actix::Recipient; use anyhow::Result; -use events::{EnclaveEvent, Shutdown}; +use e3_events::{EnclaveEvent, Shutdown}; use std::time::Duration; use tokio::{ signal::unix::{signal, SignalKind}, diff --git a/packages/ciphernode/enclave_core/src/helpers/termtable.rs b/packages/ciphernode/entrypoint/src/helpers/termtable.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/helpers/termtable.rs rename to packages/ciphernode/entrypoint/src/helpers/termtable.rs diff --git a/packages/ciphernode/enclave_core/src/lib.rs b/packages/ciphernode/entrypoint/src/lib.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/lib.rs rename to packages/ciphernode/entrypoint/src/lib.rs diff --git a/packages/ciphernode/enclave_core/src/net/keypair/generate.rs b/packages/ciphernode/entrypoint/src/net/keypair/generate.rs similarity index 90% rename from packages/ciphernode/enclave_core/src/net/keypair/generate.rs rename to packages/ciphernode/entrypoint/src/net/keypair/generate.rs index 2277c7a9cf..1e0029c58a 100644 --- a/packages/ciphernode/enclave_core/src/net/keypair/generate.rs +++ b/packages/ciphernode/entrypoint/src/net/keypair/generate.rs @@ -1,8 +1,8 @@ use anyhow::Result; -use config::AppConfig; -use crypto::Cipher; +use e3_config::AppConfig; +use e3_crypto::Cipher; +use e3_net::NetRepositoryFactory; use libp2p::{identity::Keypair, PeerId}; -use net::NetRepositoryFactory; use zeroize::Zeroize; use crate::helpers::datastore::get_repositories; diff --git a/packages/ciphernode/enclave_core/src/net/keypair/mod.rs b/packages/ciphernode/entrypoint/src/net/keypair/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/net/keypair/mod.rs rename to packages/ciphernode/entrypoint/src/net/keypair/mod.rs diff --git a/packages/ciphernode/enclave_core/src/net/keypair/set.rs b/packages/ciphernode/entrypoint/src/net/keypair/set.rs similarity index 90% rename from packages/ciphernode/enclave_core/src/net/keypair/set.rs rename to packages/ciphernode/entrypoint/src/net/keypair/set.rs index cb4ab08f5b..cc8853b754 100644 --- a/packages/ciphernode/enclave_core/src/net/keypair/set.rs +++ b/packages/ciphernode/entrypoint/src/net/keypair/set.rs @@ -1,9 +1,9 @@ use alloy::primitives::hex; use anyhow::Result; -use config::AppConfig; -use crypto::Cipher; +use e3_config::AppConfig; +use e3_crypto::Cipher; +use e3_net::NetRepositoryFactory; use libp2p::identity::Keypair; -use net::NetRepositoryFactory; use crate::helpers::datastore::get_repositories; diff --git a/packages/ciphernode/enclave_core/src/net/mod.rs b/packages/ciphernode/entrypoint/src/net/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/net/mod.rs rename to packages/ciphernode/entrypoint/src/net/mod.rs diff --git a/packages/ciphernode/enclave_core/src/net/peer_id/mod.rs b/packages/ciphernode/entrypoint/src/net/peer_id/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/net/peer_id/mod.rs rename to packages/ciphernode/entrypoint/src/net/peer_id/mod.rs diff --git a/packages/ciphernode/enclave_core/src/net/peer_id/purge.rs b/packages/ciphernode/entrypoint/src/net/peer_id/purge.rs similarity index 79% rename from packages/ciphernode/enclave_core/src/net/peer_id/purge.rs rename to packages/ciphernode/entrypoint/src/net/peer_id/purge.rs index 7d55387b96..5b31a4cd43 100644 --- a/packages/ciphernode/enclave_core/src/net/peer_id/purge.rs +++ b/packages/ciphernode/entrypoint/src/net/peer_id/purge.rs @@ -1,7 +1,7 @@ use crate::helpers::datastore::get_repositories; use anyhow::*; -use config::AppConfig; -use net::NetRepositoryFactory; +use e3_config::AppConfig; +use e3_net::NetRepositoryFactory; pub async fn execute(config: &AppConfig) -> Result<()> { let repositories = get_repositories(config)?; diff --git a/packages/ciphernode/enclave_core/src/nodes/client.rs b/packages/ciphernode/entrypoint/src/nodes/client.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/client.rs rename to packages/ciphernode/entrypoint/src/nodes/client.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/daemon.rs b/packages/ciphernode/entrypoint/src/nodes/daemon.rs similarity index 98% rename from packages/ciphernode/enclave_core/src/nodes/daemon.rs rename to packages/ciphernode/entrypoint/src/nodes/daemon.rs index 67ad9f3bb2..7742460493 100644 --- a/packages/ciphernode/enclave_core/src/nodes/daemon.rs +++ b/packages/ciphernode/entrypoint/src/nodes/daemon.rs @@ -1,5 +1,5 @@ use anyhow::*; -use config::{combine_unique, AppConfig, NodeDefinition}; +use e3_config::{combine_unique, AppConfig, NodeDefinition}; use std::sync::Arc; use std::{collections::HashMap, env}; use tokio::sync::Mutex; diff --git a/packages/ciphernode/enclave_core/src/nodes/down.rs b/packages/ciphernode/entrypoint/src/nodes/down.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/down.rs rename to packages/ciphernode/entrypoint/src/nodes/down.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/mod.rs b/packages/ciphernode/entrypoint/src/nodes/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/mod.rs rename to packages/ciphernode/entrypoint/src/nodes/mod.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/nodes.rs b/packages/ciphernode/entrypoint/src/nodes/nodes.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/nodes.rs rename to packages/ciphernode/entrypoint/src/nodes/nodes.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/process_manager.rs b/packages/ciphernode/entrypoint/src/nodes/process_manager.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/process_manager.rs rename to packages/ciphernode/entrypoint/src/nodes/process_manager.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/ps.rs b/packages/ciphernode/entrypoint/src/nodes/ps.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/ps.rs rename to packages/ciphernode/entrypoint/src/nodes/ps.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/restart.rs b/packages/ciphernode/entrypoint/src/nodes/restart.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/restart.rs rename to packages/ciphernode/entrypoint/src/nodes/restart.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/server.rs b/packages/ciphernode/entrypoint/src/nodes/server.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/server.rs rename to packages/ciphernode/entrypoint/src/nodes/server.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/start.rs b/packages/ciphernode/entrypoint/src/nodes/start.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/start.rs rename to packages/ciphernode/entrypoint/src/nodes/start.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/status.rs b/packages/ciphernode/entrypoint/src/nodes/status.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/status.rs rename to packages/ciphernode/entrypoint/src/nodes/status.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/stop.rs b/packages/ciphernode/entrypoint/src/nodes/stop.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/nodes/stop.rs rename to packages/ciphernode/entrypoint/src/nodes/stop.rs diff --git a/packages/ciphernode/enclave_core/src/nodes/up.rs b/packages/ciphernode/entrypoint/src/nodes/up.rs similarity index 96% rename from packages/ciphernode/enclave_core/src/nodes/up.rs rename to packages/ciphernode/entrypoint/src/nodes/up.rs index 646b359fde..8f2d3456e2 100644 --- a/packages/ciphernode/enclave_core/src/nodes/up.rs +++ b/packages/ciphernode/entrypoint/src/nodes/up.rs @@ -1,6 +1,6 @@ use crate::nodes::daemon; use anyhow::*; -use config::AppConfig; +use e3_config::AppConfig; use tracing::instrument; use super::client; diff --git a/packages/ciphernode/enclave_core/src/password/delete.rs b/packages/ciphernode/entrypoint/src/password/delete.rs similarity index 87% rename from packages/ciphernode/enclave_core/src/password/delete.rs rename to packages/ciphernode/entrypoint/src/password/delete.rs index 15e47d6a7b..ce4585836d 100644 --- a/packages/ciphernode/enclave_core/src/password/delete.rs +++ b/packages/ciphernode/entrypoint/src/password/delete.rs @@ -1,6 +1,6 @@ use anyhow::*; -use config::AppConfig; -use crypto::{FilePasswordManager, PasswordManager}; +use e3_config::AppConfig; +use e3_crypto::{FilePasswordManager, PasswordManager}; use zeroize::Zeroizing; pub async fn get_current_password(config: &AppConfig) -> Result> { diff --git a/packages/ciphernode/enclave_core/src/password/mod.rs b/packages/ciphernode/entrypoint/src/password/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/password/mod.rs rename to packages/ciphernode/entrypoint/src/password/mod.rs diff --git a/packages/ciphernode/enclave_core/src/password/set.rs b/packages/ciphernode/entrypoint/src/password/set.rs similarity index 92% rename from packages/ciphernode/enclave_core/src/password/set.rs rename to packages/ciphernode/entrypoint/src/password/set.rs index 29af3cebee..c5fa5a0d27 100644 --- a/packages/ciphernode/enclave_core/src/password/set.rs +++ b/packages/ciphernode/entrypoint/src/password/set.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; -use config::AppConfig; -use crypto::{FilePasswordManager, PasswordManager}; +use e3_config::AppConfig; +use e3_crypto::{FilePasswordManager, PasswordManager}; use zeroize::Zeroizing; use crate::helpers::rand::generate_random_bytes; diff --git a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs b/packages/ciphernode/entrypoint/src/start/aggregator_start.rs similarity index 87% rename from packages/ciphernode/enclave_core/src/start/aggregator_start.rs rename to packages/ciphernode/entrypoint/src/start/aggregator_start.rs index 679d7888e3..42d9ce034c 100644 --- a/packages/ciphernode/enclave_core/src/start/aggregator_start.rs +++ b/packages/ciphernode/entrypoint/src/start/aggregator_start.rs @@ -1,27 +1,27 @@ use actix::Addr; -use aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; use anyhow::Result; -use config::AppConfig; -use crypto::Cipher; -use data::RepositoriesFactory; -use e3_request::E3Router; -use events::{get_enclave_event_bus, EnclaveEvent, EventBus}; -use evm::{ +use e3_aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; +use e3_config::AppConfig; +use e3_crypto::Cipher; +use e3_data::RepositoriesFactory; +use e3_events::{get_enclave_event_bus, EnclaveEvent, EventBus}; +use e3_evm::{ helpers::{get_signer_from_repository, ProviderConfig}, CiphernodeRegistryReaderRepositoryFactory, CiphernodeRegistrySol, EnclaveSol, EnclaveSolReaderRepositoryFactory, EthPrivateKeyRepositoryFactory, RegistryFilterSol, }; -use fhe::ext::FheExtension; -use net::{NetRepositoryFactory, NetworkManager}; +use e3_fhe::ext::FheExtension; +use e3_net::{NetRepositoryFactory, NetworkManager}; +use e3_request::E3Router; +use e3_sortition::Sortition; +use e3_sortition::SortitionRepositoryFactory; +use e3_test_helpers::{PlaintextWriter, PublicKeyWriter}; use rand::SeedableRng; use rand_chacha::{rand_core::OsRng, ChaCha20Rng}; -use sortition::Sortition; -use sortition::SortitionRepositoryFactory; use std::{ path::PathBuf, sync::{Arc, Mutex}, }; -use test_helpers::{PlaintextWriter, PublicKeyWriter}; use tokio::task::JoinHandle; use crate::helpers::datastore::setup_datastore; diff --git a/packages/ciphernode/enclave_core/src/start/mod.rs b/packages/ciphernode/entrypoint/src/start/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/start/mod.rs rename to packages/ciphernode/entrypoint/src/start/mod.rs diff --git a/packages/ciphernode/enclave_core/src/start/start.rs b/packages/ciphernode/entrypoint/src/start/start.rs similarity index 86% rename from packages/ciphernode/enclave_core/src/start/start.rs rename to packages/ciphernode/entrypoint/src/start/start.rs index 67cab074fb..5d1b45e06c 100644 --- a/packages/ciphernode/enclave_core/src/start/start.rs +++ b/packages/ciphernode/entrypoint/src/start/start.rs @@ -1,24 +1,24 @@ use actix::Addr; use alloy::primitives::Address; use anyhow::Result; -use config::AppConfig; -use crypto::Cipher; -use data::RepositoriesFactory; -use e3_request::E3Router; -use events::get_enclave_event_bus; -use events::{EnclaveEvent, EventBus}; -use evm::{ +use e3_config::AppConfig; +use e3_crypto::Cipher; +use e3_data::RepositoriesFactory; +use e3_events::get_enclave_event_bus; +use e3_events::{EnclaveEvent, EventBus}; +use e3_evm::{ helpers::ProviderConfig, CiphernodeRegistryReaderRepositoryFactory, CiphernodeRegistrySol, EnclaveSolReader, EnclaveSolReaderRepositoryFactory, }; -use fhe::ext::FheExtension; -use keyshare::ext::KeyshareExtension; -use net::{NetRepositoryFactory, NetworkManager}; +use e3_fhe::ext::FheExtension; +use e3_keyshare::ext::KeyshareExtension; +use e3_net::{NetRepositoryFactory, NetworkManager}; +use e3_request::E3Router; +use e3_sortition::CiphernodeSelector; +use e3_sortition::Sortition; +use e3_sortition::SortitionRepositoryFactory; use rand::SeedableRng; use rand_chacha::rand_core::OsRng; -use sortition::CiphernodeSelector; -use sortition::Sortition; -use sortition::SortitionRepositoryFactory; use std::sync::{Arc, Mutex}; use tokio::task::JoinHandle; use tracing::instrument; diff --git a/packages/ciphernode/enclave_core/src/wallet/mod.rs b/packages/ciphernode/entrypoint/src/wallet/mod.rs similarity index 100% rename from packages/ciphernode/enclave_core/src/wallet/mod.rs rename to packages/ciphernode/entrypoint/src/wallet/mod.rs diff --git a/packages/ciphernode/enclave_core/src/wallet/set.rs b/packages/ciphernode/entrypoint/src/wallet/set.rs similarity index 91% rename from packages/ciphernode/enclave_core/src/wallet/set.rs rename to packages/ciphernode/entrypoint/src/wallet/set.rs index 9ad8595d92..6227e25c59 100644 --- a/packages/ciphernode/enclave_core/src/wallet/set.rs +++ b/packages/ciphernode/entrypoint/src/wallet/set.rs @@ -1,8 +1,8 @@ use alloy::{hex::FromHex, primitives::FixedBytes, signers::local::PrivateKeySigner}; use anyhow::{anyhow, Result}; -use config::AppConfig; -use crypto::Cipher; -use evm::EthPrivateKeyRepositoryFactory; +use e3_config::AppConfig; +use e3_crypto::Cipher; +use e3_evm::EthPrivateKeyRepositoryFactory; use crate::helpers::{datastore::get_repositories, rand::generate_random_bytes}; diff --git a/packages/ciphernode/enclave_core/src/wizard/mod.rs b/packages/ciphernode/entrypoint/src/wizard/mod.rs similarity index 97% rename from packages/ciphernode/enclave_core/src/wizard/mod.rs rename to packages/ciphernode/entrypoint/src/wizard/mod.rs index 81dc5e79c8..cb3d3bc253 100644 --- a/packages/ciphernode/enclave_core/src/wizard/mod.rs +++ b/packages/ciphernode/entrypoint/src/wizard/mod.rs @@ -1,8 +1,8 @@ use alloy::primitives::Address; use anyhow::{anyhow, bail, Result}; -use config::load_config; -use config::AppConfig; -use config::RPC; +use e3_config::load_config; +use e3_config::AppConfig; +use e3_config::RPC; use std::fs; use tracing::instrument; diff --git a/packages/ciphernode/events/Cargo.toml b/packages/ciphernode/events/Cargo.toml index 71af507d46..9e1153a74b 100644 --- a/packages/ciphernode/events/Cargo.toml +++ b/packages/ciphernode/events/Cargo.toml @@ -1,6 +1,6 @@ [package] # we have to name this other than core for disambiguation -name = "events" +name = "e3-events" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" diff --git a/packages/ciphernode/evm/Cargo.toml b/packages/ciphernode/evm/Cargo.toml index 7600c33b37..0b508d879d 100644 --- a/packages/ciphernode/evm/Cargo.toml +++ b/packages/ciphernode/evm/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "evm" +name = "e3-evm" version.workspace = true edition.workspace = true @@ -10,12 +10,12 @@ alloy-primitives = { workspace = true } anyhow = { workspace = true } async-trait = { workspace = true } base64 = { workspace = true } -crypto = { workspace = true } -config = { workspace = true } -data = { workspace = true } -events = { workspace = true } +e3-crypto = { workspace = true } +e3-config = { workspace = true } +e3-data = { workspace = true } +e3-events = { workspace = true } futures-util = { workspace = true } -sortition = { workspace = true } +e3-sortition = { workspace = true } serde = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } @@ -23,5 +23,5 @@ url = { workspace = true } zeroize = { workspace = true } [dev-dependencies] -enclave_core = { workspace = true } +e3-entrypoint = { workspace = true } diff --git a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs index cbf885782e..826412c5ee 100644 --- a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs +++ b/packages/ciphernode/evm/src/ciphernode_registry_sol.rs @@ -11,8 +11,8 @@ use alloy::{ transports::BoxTransport, }; use anyhow::Result; -use data::Repository; -use events::{EnclaveEvent, EventBus}; +use e3_data::Repository; +use e3_events::{EnclaveEvent, EventBus}; use tracing::{error, info, trace}; sol!( @@ -24,9 +24,9 @@ sol!( struct CiphernodeAddedWithChainId(pub ICiphernodeRegistry::CiphernodeAdded, pub u64); -impl From for events::CiphernodeAdded { +impl From for e3_events::CiphernodeAdded { fn from(value: CiphernodeAddedWithChainId) -> Self { - events::CiphernodeAdded { + e3_events::CiphernodeAdded { address: value.0.node.to_string(), // TODO: limit index and numNodes to uint32 at the solidity level index: value @@ -46,15 +46,15 @@ impl From for events::CiphernodeAdded { impl From for EnclaveEvent { fn from(value: CiphernodeAddedWithChainId) -> Self { - let payload: events::CiphernodeAdded = value.into(); + let payload: e3_events::CiphernodeAdded = value.into(); EnclaveEvent::from(payload) } } struct CiphernodeRemovedWithChainId(pub ICiphernodeRegistry::CiphernodeRemoved, pub u64); -impl From for events::CiphernodeRemoved { +impl From for e3_events::CiphernodeRemoved { fn from(value: CiphernodeRemovedWithChainId) -> Self { - events::CiphernodeRemoved { + e3_events::CiphernodeRemoved { address: value.0.node.to_string(), index: value .0 @@ -73,7 +73,7 @@ impl From for events::CiphernodeRemoved { impl From for EnclaveEvent { fn from(value: CiphernodeRemovedWithChainId) -> Self { - let payload: events::CiphernodeRemoved = value.into(); + let payload: e3_events::CiphernodeRemoved = value.into(); EnclaveEvent::from(payload) } } diff --git a/packages/ciphernode/evm/src/enclave_sol.rs b/packages/ciphernode/evm/src/enclave_sol.rs index 176a8cf994..a5c1ba354c 100644 --- a/packages/ciphernode/evm/src/enclave_sol.rs +++ b/packages/ciphernode/evm/src/enclave_sol.rs @@ -7,8 +7,8 @@ use crate::{ use actix::Addr; use alloy::transports::BoxTransport; use anyhow::Result; -use data::Repository; -use events::{EnclaveEvent, EventBus}; +use e3_data::Repository; +use e3_events::{EnclaveEvent, EventBus}; pub struct EnclaveSol; impl EnclaveSol { diff --git a/packages/ciphernode/evm/src/enclave_sol_reader.rs b/packages/ciphernode/evm/src/enclave_sol_reader.rs index c2e18be8f0..d332310745 100644 --- a/packages/ciphernode/evm/src/enclave_sol_reader.rs +++ b/packages/ciphernode/evm/src/enclave_sol_reader.rs @@ -6,8 +6,8 @@ use alloy::primitives::{LogData, B256}; use alloy::transports::BoxTransport; use alloy::{sol, sol_types::SolEvent}; use anyhow::Result; -use data::Repository; -use events::{E3id, EnclaveEvent, EventBus}; +use e3_data::Repository; +use e3_events::{E3id, EnclaveEvent, EventBus}; use tracing::{error, info, trace}; sol!( @@ -18,9 +18,9 @@ sol!( struct E3RequestedWithChainId(pub IEnclave::E3Requested, pub u64); -impl From for events::E3Requested { +impl From for e3_events::E3Requested { fn from(value: E3RequestedWithChainId) -> Self { - events::E3Requested { + e3_events::E3Requested { params: value.0.e3.e3ProgramParams.to_vec(), threshold_m: value.0.e3.threshold[0] as usize, seed: value.0.e3.seed.into(), @@ -31,16 +31,16 @@ impl From for events::E3Requested { impl From for EnclaveEvent { fn from(value: E3RequestedWithChainId) -> Self { - let payload: events::E3Requested = value.into(); + let payload: e3_events::E3Requested = value.into(); EnclaveEvent::from(payload) } } struct CiphertextOutputPublishedWithChainId(pub IEnclave::CiphertextOutputPublished, pub u64); -impl From for events::CiphertextOutputPublished { +impl From for e3_events::CiphertextOutputPublished { fn from(value: CiphertextOutputPublishedWithChainId) -> Self { - events::CiphertextOutputPublished { + e3_events::CiphertextOutputPublished { e3_id: E3id::new(value.0.e3Id.to_string(), value.1), ciphertext_output: value.0.ciphertextOutput.to_vec(), } @@ -49,7 +49,7 @@ impl From for events::CiphertextOutputPubl impl From for EnclaveEvent { fn from(value: CiphertextOutputPublishedWithChainId) -> Self { - let payload: events::CiphertextOutputPublished = value.into(); + let payload: e3_events::CiphertextOutputPublished = value.into(); EnclaveEvent::from(payload) } } diff --git a/packages/ciphernode/evm/src/enclave_sol_writer.rs b/packages/ciphernode/evm/src/enclave_sol_writer.rs index 2e3d82b72b..f7e3918849 100644 --- a/packages/ciphernode/evm/src/enclave_sol_writer.rs +++ b/packages/ciphernode/evm/src/enclave_sol_writer.rs @@ -7,9 +7,9 @@ use alloy::{ rpc::types::TransactionReceipt, }; use anyhow::Result; -use events::Shutdown; -use events::{BusError, E3id, EnclaveErrorType, PlaintextAggregated, Subscribe}; -use events::{EnclaveEvent, EventBus}; +use e3_events::Shutdown; +use e3_events::{BusError, E3id, EnclaveErrorType, PlaintextAggregated, Subscribe}; +use e3_events::{EnclaveEvent, EventBus}; use tracing::info; sol!( diff --git a/packages/ciphernode/evm/src/event_reader.rs b/packages/ciphernode/evm/src/event_reader.rs index 9d64fda84d..2db14c0cc1 100644 --- a/packages/ciphernode/evm/src/event_reader.rs +++ b/packages/ciphernode/evm/src/event_reader.rs @@ -8,8 +8,8 @@ use alloy::providers::Provider; use alloy::rpc::types::Filter; use alloy::transports::{BoxTransport, Transport}; use anyhow::{anyhow, Result}; -use data::{AutoPersist, Persistable, Repository}; -use events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus, EventId, Subscribe}; +use e3_data::{AutoPersist, Persistable, Repository}; +use e3_events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus, EventId, Subscribe}; use futures_util::stream::StreamExt; use std::collections::HashSet; use tokio::select; diff --git a/packages/ciphernode/evm/src/helpers.rs b/packages/ciphernode/evm/src/helpers.rs index 22a0b4c878..2bd18d3b6a 100644 --- a/packages/ciphernode/evm/src/helpers.rs +++ b/packages/ciphernode/evm/src/helpers.rs @@ -24,9 +24,9 @@ use alloy::{ }; use anyhow::{bail, Context, Result}; use base64::{engine::general_purpose::STANDARD, Engine}; -use config::{RpcAuth, RPC}; -use crypto::Cipher; -use data::Repository; +use e3_config::{RpcAuth, RPC}; +use e3_crypto::Cipher; +use e3_data::Repository; use std::{env, io, marker::PhantomData, sync::Arc}; use zeroize::Zeroizing; pub trait AuthConversions { diff --git a/packages/ciphernode/evm/src/registry_filter_sol.rs b/packages/ciphernode/evm/src/registry_filter_sol.rs index f7092a65d7..b9a0df8eff 100644 --- a/packages/ciphernode/evm/src/registry_filter_sol.rs +++ b/packages/ciphernode/evm/src/registry_filter_sol.rs @@ -6,7 +6,7 @@ use alloy::{ sol, }; use anyhow::Result; -use events::{ +use e3_events::{ BusError, E3id, EnclaveErrorType, EnclaveEvent, EventBus, OrderedSet, PublicKeyAggregated, Shutdown, Subscribe, }; diff --git a/packages/ciphernode/evm/src/repo.rs b/packages/ciphernode/evm/src/repo.rs index f20b5d1e83..f458178f03 100644 --- a/packages/ciphernode/evm/src/repo.rs +++ b/packages/ciphernode/evm/src/repo.rs @@ -1,5 +1,5 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; use crate::EvmEventReaderState; diff --git a/packages/ciphernode/evm/tests/evm_reader.rs b/packages/ciphernode/evm/tests/evm_reader.rs index 4255bdffc6..a217bfbf7e 100644 --- a/packages/ciphernode/evm/tests/evm_reader.rs +++ b/packages/ciphernode/evm/tests/evm_reader.rs @@ -7,12 +7,12 @@ use alloy::{ sol_types::SolEvent, }; use anyhow::Result; -use data::Repository; -use enclave_core::helpers::datastore::get_in_mem_store; -use events::{ +use e3_data::Repository; +use e3_entrypoint::helpers::datastore::get_in_mem_store; +use e3_events::{ new_event_bus_with_history, EnclaveEvent, GetHistory, HistoryCollector, Shutdown, TestEvent, }; -use evm::{helpers::WithChainId, EvmEventReader}; +use e3_evm::{helpers::WithChainId, EvmEventReader}; use std::time::Duration; use tokio::time::sleep; diff --git a/packages/ciphernode/fhe/Cargo.toml b/packages/ciphernode/fhe/Cargo.toml index bb4005742d..566d5254d7 100644 --- a/packages/ciphernode/fhe/Cargo.toml +++ b/packages/ciphernode/fhe/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "fhe" +name = "e3-fhe" version.workspace = true edition.workspace = true @@ -8,14 +8,14 @@ actix = { workspace = true } anyhow = { workspace = true } async-trait = { workspace = true } bincode = { workspace = true } -config = { workspace = true } -data = { workspace = true } -events = { workspace = true } +e3-config = { workspace = true } +e3-data = { workspace = true } +e3-events = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } fhe_rs = { workspace = true } rand = { workspace = true } rand_chacha = { workspace = true } -e3_request = { workspace = true } +e3-request = { workspace = true } serde = { workspace = true } e3-bfv-helpers = { workspace = true } diff --git a/packages/ciphernode/fhe/src/ext.rs b/packages/ciphernode/fhe/src/ext.rs index 17f60c3664..ad05fa7bbd 100644 --- a/packages/ciphernode/fhe/src/ext.rs +++ b/packages/ciphernode/fhe/src/ext.rs @@ -2,9 +2,9 @@ use crate::{Fhe, FheRepositoryFactory, SharedRng}; use actix::Addr; use anyhow::{anyhow, Result}; use async_trait::async_trait; -use data::{FromSnapshotWithParams, RepositoriesFactory, Snapshot}; +use e3_data::{FromSnapshotWithParams, RepositoriesFactory, Snapshot}; +use e3_events::{BusError, E3Requested, EnclaveErrorType, EnclaveEvent, EventBus}; use e3_request::{E3Context, E3ContextSnapshot, E3Extension, TypedKey}; -use events::{BusError, E3Requested, EnclaveErrorType, EnclaveEvent, EventBus}; use std::sync::Arc; pub const FHE_KEY: TypedKey> = TypedKey::new("fhe"); diff --git a/packages/ciphernode/fhe/src/fhe.rs b/packages/ciphernode/fhe/src/fhe.rs index 7d5b8425dd..535f51710a 100644 --- a/packages/ciphernode/fhe/src/fhe.rs +++ b/packages/ciphernode/fhe/src/fhe.rs @@ -1,9 +1,9 @@ use super::set_up_crp; use anyhow::*; use async_trait::async_trait; -use data::{FromSnapshotWithParams, Snapshot}; use e3_bfv_helpers::{build_bfv_params_arc, decode_bfv_params_arc}; -use events::{OrderedSet, Seed}; +use e3_data::{FromSnapshotWithParams, Snapshot}; +use e3_events::{OrderedSet, Seed}; use fhe_rs::{ bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}, mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, diff --git a/packages/ciphernode/fhe/src/repo.rs b/packages/ciphernode/fhe/src/repo.rs index b7ef37e43a..09a5052923 100644 --- a/packages/ciphernode/fhe/src/repo.rs +++ b/packages/ciphernode/fhe/src/repo.rs @@ -1,6 +1,6 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; -use events::E3id; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; +use e3_events::E3id; use crate::FheSnapshot; diff --git a/packages/ciphernode/init/Cargo.toml b/packages/ciphernode/init/Cargo.toml index 9037b6a50e..7fad37ed02 100644 --- a/packages/ciphernode/init/Cargo.toml +++ b/packages/ciphernode/init/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "enclave-init" +name = "e3-init" version.workspace = true edition.workspace = true diff --git a/packages/ciphernode/keyshare/Cargo.toml b/packages/ciphernode/keyshare/Cargo.toml index 9c7039f604..c992250a10 100644 --- a/packages/ciphernode/keyshare/Cargo.toml +++ b/packages/ciphernode/keyshare/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "keyshare" +name = "e3-keyshare" version.workspace = true edition.workspace = true @@ -7,11 +7,11 @@ edition.workspace = true actix = { workspace = true } anyhow = { workspace = true } async-trait = { workspace = true } -config = { workspace = true } -data = { workspace = true } -crypto = { workspace = true } -events = { workspace = true } -fhe = { workspace = true } -e3_request = { workspace = true } +e3-config = { workspace = true } +e3-data = { workspace = true } +e3-crypto = { workspace = true } +e3-events = { workspace = true } +e3-fhe = { workspace = true } +e3-request = { workspace = true } serde = { workspace = true } tracing = { workspace = true } diff --git a/packages/ciphernode/keyshare/src/ext.rs b/packages/ciphernode/keyshare/src/ext.rs index a50a3ec80c..1c5d069ab0 100644 --- a/packages/ciphernode/keyshare/src/ext.rs +++ b/packages/ciphernode/keyshare/src/ext.rs @@ -2,11 +2,11 @@ use crate::{Keyshare, KeyshareParams, KeyshareRepositoryFactory}; use actix::{Actor, Addr}; use anyhow::{anyhow, Result}; use async_trait::async_trait; -use crypto::Cipher; -use data::{AutoPersist, RepositoriesFactory}; +use e3_crypto::Cipher; +use e3_data::{AutoPersist, RepositoriesFactory}; +use e3_events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus}; +use e3_fhe::ext::FHE_KEY; use e3_request::{E3Context, E3ContextSnapshot, E3Extension}; -use events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus}; -use fhe::ext::FHE_KEY; use std::sync::Arc; pub struct KeyshareExtension { diff --git a/packages/ciphernode/keyshare/src/keyshare.rs b/packages/ciphernode/keyshare/src/keyshare.rs index 7688a23f1e..718b3c00b6 100644 --- a/packages/ciphernode/keyshare/src/keyshare.rs +++ b/packages/ciphernode/keyshare/src/keyshare.rs @@ -1,12 +1,12 @@ use actix::prelude::*; use anyhow::{anyhow, Result}; -use crypto::Cipher; -use data::Persistable; -use events::{ +use e3_crypto::Cipher; +use e3_data::Persistable; +use e3_events::{ BusError, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, Die, E3RequestComplete, EnclaveErrorType, EnclaveEvent, EventBus, FromError, KeyshareCreated, }; -use fhe::{DecryptCiphertext, Fhe}; +use e3_fhe::{DecryptCiphertext, Fhe}; use std::sync::Arc; use tracing::warn; diff --git a/packages/ciphernode/keyshare/src/repo.rs b/packages/ciphernode/keyshare/src/repo.rs index 504c2fa7dc..9ade764c55 100644 --- a/packages/ciphernode/keyshare/src/repo.rs +++ b/packages/ciphernode/keyshare/src/repo.rs @@ -1,6 +1,6 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; -use events::E3id; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; +use e3_events::E3id; pub trait KeyshareRepositoryFactory { fn keyshare(&self, e3_id: &E3id) -> Repository>; diff --git a/packages/ciphernode/logger/Cargo.toml b/packages/ciphernode/logger/Cargo.toml index d965ac1d40..91ea1a0bff 100644 --- a/packages/ciphernode/logger/Cargo.toml +++ b/packages/ciphernode/logger/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "logger" +name = "e3-logger" version.workspace = true edition.workspace = true [dependencies] -events = { workspace = true } +e3-events = { workspace = true } actix = { workspace = true } base64 = { workspace = true } tracing = { workspace = true } diff --git a/packages/ciphernode/logger/src/logger.rs b/packages/ciphernode/logger/src/logger.rs index 09fe4bba88..4b558dd9c8 100644 --- a/packages/ciphernode/logger/src/logger.rs +++ b/packages/ciphernode/logger/src/logger.rs @@ -1,5 +1,5 @@ use actix::{Actor, Addr, Context, Handler}; -use events::{EnclaveEvent, Event, EventBus, Subscribe}; +use e3_events::{EnclaveEvent, Event, EventBus, Subscribe}; use std::marker::PhantomData; use tracing::{error, info}; diff --git a/packages/ciphernode/net/Cargo.toml b/packages/ciphernode/net/Cargo.toml index 36647655f2..4193cdead7 100644 --- a/packages/ciphernode/net/Cargo.toml +++ b/packages/ciphernode/net/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "net" +name = "e3-net" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" @@ -11,14 +11,14 @@ repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" async-std = { workspace = true } async-trait = { workspace = true } futures = { workspace = true } -crypto = { workspace = true } -config = { workspace = true } -data = { workspace = true } +e3-crypto = { workspace = true } +e3-config = { workspace = true } +e3-data = { workspace = true } libp2p = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } -events = { workspace = true } +e3-events = { workspace = true } anyhow = { workspace = true } actix = { workspace = true } zeroize = { workspace = true } diff --git a/packages/ciphernode/net/src/bin/p2p_test.rs b/packages/ciphernode/net/src/bin/p2p_test.rs index b34b6ce99e..c9a2b1072b 100644 --- a/packages/ciphernode/net/src/bin/p2p_test.rs +++ b/packages/ciphernode/net/src/bin/p2p_test.rs @@ -1,7 +1,7 @@ use anyhow::Result; -use net::correlation_id::CorrelationId; -use net::events::{NetworkPeerCommand, NetworkPeerEvent}; -use net::NetworkPeer; +use e3_net::correlation_id::CorrelationId; +use e3_net::events::{NetworkPeerCommand, NetworkPeerEvent}; +use e3_net::NetworkPeer; use std::time::Duration; use std::{collections::HashSet, env, process}; use tokio::time::{sleep, timeout}; diff --git a/packages/ciphernode/net/src/lib.rs b/packages/ciphernode/net/src/lib.rs index b695df3224..872933ad00 100644 --- a/packages/ciphernode/net/src/lib.rs +++ b/packages/ciphernode/net/src/lib.rs @@ -1,6 +1,3 @@ -#![crate_name = "net"] -#![crate_type = "lib"] - pub mod correlation_id; mod dialer; pub mod events; diff --git a/packages/ciphernode/net/src/network_manager.rs b/packages/ciphernode/net/src/network_manager.rs index 326599775a..45f1632cc2 100644 --- a/packages/ciphernode/net/src/network_manager.rs +++ b/packages/ciphernode/net/src/network_manager.rs @@ -6,9 +6,9 @@ use crate::NetworkPeer; /// This Actor should be responsible for use actix::prelude::*; use anyhow::{bail, Result}; -use crypto::Cipher; -use data::Repository; -use events::{EnclaveEvent, EventBus, EventId, Subscribe}; +use e3_crypto::Cipher; +use e3_data::Repository; +use e3_events::{EnclaveEvent, EventBus, EventId, Subscribe}; use libp2p::identity::ed25519; use std::collections::HashSet; use std::sync::Arc; diff --git a/packages/ciphernode/net/src/repo.rs b/packages/ciphernode/net/src/repo.rs index 93b0abc217..14090dfaab 100644 --- a/packages/ciphernode/net/src/repo.rs +++ b/packages/ciphernode/net/src/repo.rs @@ -1,5 +1,5 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; pub trait NetRepositoryFactory { fn libp2p_keypair(&self) -> Repository>; diff --git a/packages/ciphernode/e3_request/Cargo.toml b/packages/ciphernode/request/Cargo.toml similarity index 69% rename from packages/ciphernode/e3_request/Cargo.toml rename to packages/ciphernode/request/Cargo.toml index d236518a07..8cc8ab14eb 100644 --- a/packages/ciphernode/e3_request/Cargo.toml +++ b/packages/ciphernode/request/Cargo.toml @@ -1,15 +1,15 @@ [package] -name = "e3_request" +name = "e3-request" version.workspace = true edition.workspace = true [dependencies] actix = { workspace = true } -events = { workspace = true } -data = { workspace = true} +e3-events = { workspace = true } +e3-data = { workspace = true} anyhow = { workspace = true } serde = { workspace = true } -config = { workspace = true } +e3-config = { workspace = true } bincode = { workspace = true } async-trait = { workspace = true } tracing = { workspace = true } diff --git a/packages/ciphernode/e3_request/src/context.rs b/packages/ciphernode/request/src/context.rs similarity index 98% rename from packages/ciphernode/e3_request/src/context.rs rename to packages/ciphernode/request/src/context.rs index cfd5832c45..df8eb0792c 100644 --- a/packages/ciphernode/e3_request/src/context.rs +++ b/packages/ciphernode/request/src/context.rs @@ -2,10 +2,10 @@ use crate::{E3Extension, EventBuffer, HetrogenousMap, TypedKey}; use actix::Recipient; use anyhow::Result; use async_trait::async_trait; -use data::{ +use e3_data::{ Checkpoint, FromSnapshotWithParams, Repositories, RepositoriesFactory, Repository, Snapshot, }; -use events::{E3id, EnclaveEvent}; +use e3_events::{E3id, EnclaveEvent}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, sync::Arc}; diff --git a/packages/ciphernode/e3_request/src/hetrogenous_map.rs b/packages/ciphernode/request/src/hetrogenous_map.rs similarity index 100% rename from packages/ciphernode/e3_request/src/hetrogenous_map.rs rename to packages/ciphernode/request/src/hetrogenous_map.rs diff --git a/packages/ciphernode/e3_request/src/lib.rs b/packages/ciphernode/request/src/lib.rs similarity index 100% rename from packages/ciphernode/e3_request/src/lib.rs rename to packages/ciphernode/request/src/lib.rs diff --git a/packages/ciphernode/e3_request/src/meta.rs b/packages/ciphernode/request/src/meta.rs similarity index 94% rename from packages/ciphernode/e3_request/src/meta.rs rename to packages/ciphernode/request/src/meta.rs index f8ec76db96..a6ac3d19c3 100644 --- a/packages/ciphernode/e3_request/src/meta.rs +++ b/packages/ciphernode/request/src/meta.rs @@ -1,8 +1,8 @@ use crate::{E3Context, E3ContextSnapshot, E3Extension, MetaRepositoryFactory, TypedKey}; use anyhow::*; use async_trait::async_trait; -use data::RepositoriesFactory; -use events::{E3Requested, EnclaveEvent, Seed}; +use e3_data::RepositoriesFactory; +use e3_events::{E3Requested, EnclaveEvent, Seed}; pub const META_KEY: TypedKey = TypedKey::new("meta"); diff --git a/packages/ciphernode/e3_request/src/repo.rs b/packages/ciphernode/request/src/repo.rs similarity index 91% rename from packages/ciphernode/e3_request/src/repo.rs rename to packages/ciphernode/request/src/repo.rs index 21f781f4de..f3a8c8c3ad 100644 --- a/packages/ciphernode/e3_request/src/repo.rs +++ b/packages/ciphernode/request/src/repo.rs @@ -1,6 +1,6 @@ -use config::StoreKeys; -use data::{Repositories, Repository}; -use events::E3id; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; +use e3_events::E3id; use crate::{E3ContextSnapshot, E3Meta, E3RouterSnapshot}; diff --git a/packages/ciphernode/e3_request/src/router.rs b/packages/ciphernode/request/src/router.rs similarity index 97% rename from packages/ciphernode/e3_request/src/router.rs rename to packages/ciphernode/request/src/router.rs index 7074461fce..8f3c7cf200 100644 --- a/packages/ciphernode/e3_request/src/router.rs +++ b/packages/ciphernode/request/src/router.rs @@ -8,15 +8,15 @@ use actix::AsyncContext; use actix::{Actor, Addr, Context, Handler}; use anyhow::*; use async_trait::async_trait; -use data::Checkpoint; -use data::DataStore; -use data::FromSnapshotWithParams; -use data::RepositoriesFactory; -use data::Repository; -use data::Snapshot; -use events::E3RequestComplete; -use events::Shutdown; -use events::{E3id, EnclaveEvent, EventBus, Subscribe}; +use e3_data::Checkpoint; +use e3_data::DataStore; +use e3_data::FromSnapshotWithParams; +use e3_data::RepositoriesFactory; +use e3_data::Repository; +use e3_data::Snapshot; +use e3_events::E3RequestComplete; +use e3_events::Shutdown; +use e3_events::{E3id, EnclaveEvent, EventBus, Subscribe}; use serde::Deserialize; use serde::Serialize; use std::collections::HashSet; diff --git a/packages/ciphernode/sortition/Cargo.toml b/packages/ciphernode/sortition/Cargo.toml index 2fbbde8261..20f9a620f2 100644 --- a/packages/ciphernode/sortition/Cargo.toml +++ b/packages/ciphernode/sortition/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "sortition" +name = "e3-sortition" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" @@ -13,9 +13,9 @@ actix = { workspace = true } alloy = { workspace = true } anyhow = { workspace = true } async-trait = { workspace = true } -config = { workspace = true } -data = { workspace = true } -events = { workspace = true } +e3-config = { workspace = true } +e3-data = { workspace = true } +e3-events = { workspace = true } num = { workspace = true } rand = { workspace = true } serde = { workspace = true } diff --git a/packages/ciphernode/sortition/src/ciphernode_selector.rs b/packages/ciphernode/sortition/src/ciphernode_selector.rs index cc032bda2b..d4c94a26f1 100644 --- a/packages/ciphernode/sortition/src/ciphernode_selector.rs +++ b/packages/ciphernode/sortition/src/ciphernode_selector.rs @@ -2,7 +2,7 @@ use crate::{GetHasNode, Sortition}; /// CiphernodeSelector is an actor that determines if a ciphernode is part of a committee and if so /// forwards a CiphernodeSelected event to the event bus use actix::prelude::*; -use events::{CiphernodeSelected, E3Requested, EnclaveEvent, EventBus, Shutdown, Subscribe}; +use e3_events::{CiphernodeSelected, E3Requested, EnclaveEvent, EventBus, Shutdown, Subscribe}; use tracing::info; pub struct CiphernodeSelector { diff --git a/packages/ciphernode/sortition/src/lib.rs b/packages/ciphernode/sortition/src/lib.rs index 7021bb9fbb..52e6cb4e4e 100644 --- a/packages/ciphernode/sortition/src/lib.rs +++ b/packages/ciphernode/sortition/src/lib.rs @@ -1,7 +1,3 @@ -#![crate_name = "sortition"] -#![crate_type = "lib"] -// #![warn(missing_docs, unused_imports)] - mod ciphernode_selector; mod distance; mod index; diff --git a/packages/ciphernode/sortition/src/repo.rs b/packages/ciphernode/sortition/src/repo.rs index e264f6c7ca..a9629356ea 100644 --- a/packages/ciphernode/sortition/src/repo.rs +++ b/packages/ciphernode/sortition/src/repo.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; -use config::StoreKeys; -use data::{Repositories, Repository}; +use e3_config::StoreKeys; +use e3_data::{Repositories, Repository}; use crate::SortitionModule; diff --git a/packages/ciphernode/sortition/src/sortition.rs b/packages/ciphernode/sortition/src/sortition.rs index e5b1b3fdf6..6e5e85cabf 100644 --- a/packages/ciphernode/sortition/src/sortition.rs +++ b/packages/ciphernode/sortition/src/sortition.rs @@ -2,8 +2,8 @@ use crate::DistanceSortition; use actix::prelude::*; use alloy::primitives::Address; use anyhow::{anyhow, Result}; -use data::{AutoPersist, Persistable, Repository}; -use events::{ +use e3_data::{AutoPersist, Persistable, Repository}; +use e3_events::{ BusError, CiphernodeAdded, CiphernodeRemoved, EnclaveErrorType, EnclaveEvent, EventBus, Seed, Subscribe, }; diff --git a/packages/ciphernode/test_helpers/Cargo.toml b/packages/ciphernode/test-helpers/Cargo.toml similarity index 80% rename from packages/ciphernode/test_helpers/Cargo.toml rename to packages/ciphernode/test-helpers/Cargo.toml index 2508e6b92d..b616855313 100644 --- a/packages/ciphernode/test_helpers/Cargo.toml +++ b/packages/ciphernode/test-helpers/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "test-helpers" +name = "e3-test-helpers" version.workspace = true edition.workspace = true [dependencies] actix = { workspace = true } -events = { workspace = true } -fhe = { workspace = true } +e3-events = { workspace = true } +e3-fhe = { workspace = true } bincode = { workspace = true } clap = { workspace = true } fhe_rs = { workspace = true } diff --git a/packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs b/packages/ciphernode/test-helpers/src/bin/fake_encrypt.rs similarity index 100% rename from packages/ciphernode/test_helpers/src/bin/fake_encrypt.rs rename to packages/ciphernode/test-helpers/src/bin/fake_encrypt.rs diff --git a/packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs b/packages/ciphernode/test-helpers/src/bin/pack_e3_params.rs similarity index 100% rename from packages/ciphernode/test_helpers/src/bin/pack_e3_params.rs rename to packages/ciphernode/test-helpers/src/bin/pack_e3_params.rs diff --git a/packages/ciphernode/test_helpers/src/lib.rs b/packages/ciphernode/test-helpers/src/lib.rs similarity index 100% rename from packages/ciphernode/test_helpers/src/lib.rs rename to packages/ciphernode/test-helpers/src/lib.rs diff --git a/packages/ciphernode/test_helpers/src/plaintext_writer.rs b/packages/ciphernode/test-helpers/src/plaintext_writer.rs similarity index 95% rename from packages/ciphernode/test_helpers/src/plaintext_writer.rs rename to packages/ciphernode/test-helpers/src/plaintext_writer.rs index 26a1110374..8b68c1113c 100644 --- a/packages/ciphernode/test_helpers/src/plaintext_writer.rs +++ b/packages/ciphernode/test-helpers/src/plaintext_writer.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use super::write_file_with_dirs; use actix::{Actor, Addr, Context, Handler}; -use events::{EnclaveEvent, EventBus, Subscribe}; +use e3_events::{EnclaveEvent, EventBus, Subscribe}; use tracing::info; pub struct PlaintextWriter { diff --git a/packages/ciphernode/test_helpers/src/public_key_writer.rs b/packages/ciphernode/test-helpers/src/public_key_writer.rs similarity index 95% rename from packages/ciphernode/test_helpers/src/public_key_writer.rs rename to packages/ciphernode/test-helpers/src/public_key_writer.rs index c21df7cfc3..11a1f0f984 100644 --- a/packages/ciphernode/test_helpers/src/public_key_writer.rs +++ b/packages/ciphernode/test-helpers/src/public_key_writer.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use super::write_file_with_dirs; use actix::{Actor, Addr, Context, Handler}; -use events::{EnclaveEvent, EventBus, Subscribe}; +use e3_events::{EnclaveEvent, EventBus, Subscribe}; use tracing::info; pub struct PublicKeyWriter { diff --git a/packages/ciphernode/test_helpers/src/utils.rs b/packages/ciphernode/test-helpers/src/utils.rs similarity index 100% rename from packages/ciphernode/test_helpers/src/utils.rs rename to packages/ciphernode/test-helpers/src/utils.rs diff --git a/packages/ciphernode/tests/Cargo.toml b/packages/ciphernode/tests/Cargo.toml index cf66313ad4..db3cfa349d 100644 --- a/packages/ciphernode/tests/Cargo.toml +++ b/packages/ciphernode/tests/Cargo.toml @@ -1,21 +1,21 @@ [package] -name = "tests" +name = "e3-tests" version.workspace = true edition.workspace = true [dependencies] -net = { workspace = true } -sortition = { workspace = true } -events = { workspace = true } -evm = { workspace = true } -logger = { workspace = true } -fhe = { workspace = true } -crypto = { workspace = true } -data = { workspace = true } -keyshare = { workspace = true } -aggregator = { workspace = true } -e3_request = { workspace = true } -test_helpers = { workspace = true } +e3-net = { workspace = true } +e3-sortition = { workspace = true } +e3-events = { workspace = true } +e3-evm = { workspace = true } +e3-logger = { workspace = true } +e3-fhe = { workspace = true } +e3-crypto = { workspace = true } +e3-data = { workspace = true } +e3-keyshare = { workspace = true } +e3-aggregator = { workspace = true } +e3-request = { workspace = true } +e3-test-helpers = { workspace = true } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs index 270ae6ef39..5efc06caa8 100644 --- a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs +++ b/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs @@ -1,33 +1,33 @@ use actix::prelude::*; -use aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; use alloy::primitives::Address; use anyhow::*; -use crypto::Cipher; -use data::RepositoriesFactory; -use data::{DataStore, InMemStore}; -use e3_request::E3Router; -use e3_sdk::bfv_helpers::{encode_bfv_params, params::SET_2048_1032193_1}; -use events::{ +use e3_aggregator::ext::{PlaintextAggregatorExtension, PublicKeyAggregatorExtension}; +use e3_crypto::Cipher; +use e3_data::RepositoriesFactory; +use e3_data::{DataStore, InMemStore}; +use e3_events::{ CiphernodeAdded, CiphernodeSelected, CiphertextOutputPublished, DecryptionshareCreated, E3RequestComplete, E3Requested, E3id, EnclaveEvent, ErrorCollector, EventBus, EventBusConfig, GetErrors, GetHistory, HistoryCollector, KeyshareCreated, OrderedSet, PlaintextAggregated, PublicKeyAggregated, ResetHistory, Seed, Shutdown, Subscribe, }; -use fhe::ext::FheExtension; -use fhe::{setup_crp_params, ParamsWithCrp, SharedRng}; +use e3_fhe::ext::FheExtension; +use e3_fhe::{setup_crp_params, ParamsWithCrp, SharedRng}; +use e3_keyshare::ext::KeyshareExtension; +use e3_logger::SimpleLogger; +use e3_net::{events::NetworkPeerEvent, NetworkManager}; +use e3_request::E3Router; +use e3_sdk::bfv_helpers::{encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sortition::SortitionRepositoryFactory; +use e3_sortition::{CiphernodeSelector, Sortition}; use fhe_rs::{ bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}, mbfv::{AggregateIter, CommonRandomPoly, DecryptionShare, PublicKeyShare}, }; use fhe_traits::{FheEncoder, FheEncrypter, Serialize}; -use keyshare::ext::KeyshareExtension; -use logger::SimpleLogger; -use net::{events::NetworkPeerEvent, NetworkManager}; use rand::Rng; use rand::SeedableRng; use rand_chacha::ChaCha20Rng; -use sortition::SortitionRepositoryFactory; -use sortition::{CiphernodeSelector, Sortition}; use std::{sync::Arc, time::Duration}; use tokio::sync::{broadcast, Mutex}; use tokio::{sync::mpsc, time::sleep}; @@ -508,7 +508,7 @@ async fn test_p2p_actor_forwards_events_to_network() -> Result<()> { // the event bus as if it was gossiped from the network and ended up as an external // message this simulates a rebroadcast message if let Some(msg) = match cmd { - net::events::NetworkPeerCommand::GossipPublish { data, .. } => Some(data), + e3_net::events::NetworkPeerCommand::GossipPublish { data, .. } => Some(data), _ => None, } { msgs_loop.lock().await.push(msg.clone()); From 7c472bd5afc4f376b3c2e6f0cfdee17836cb82cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 1 Jun 2025 23:16:46 +0000 Subject: [PATCH 033/106] Refactor `packages/ciphernode` to `./crates` (#461) * ./packages/ciphernode -> ./crates * Update in readme * Fix up workflows * Fix dockerfile * Fix bug --- .github/workflows/ec2-deployment.yml | 6 +- Cargo.toml | 86 +++++++-------- {packages/ciphernode => crates}/.dockerignore | 0 crates/Dockerfile | 104 ++++++++++++++++++ {packages/ciphernode => crates}/README.md | 0 .../aggregator/Cargo.toml | 0 .../aggregator/src/ext.rs | 0 .../aggregator/src/lib.rs | 0 .../aggregator/src/plaintext_aggregator.rs | 0 .../aggregator/src/publickey_aggregator.rs | 0 .../aggregator/src/repo.rs | 0 .../bfv-helpers/Cargo.toml | 0 .../bfv-helpers/src/lib.rs | 0 .../ciphernode-entrypoint.sh | 0 .../ciphernode => crates}/cli/Cargo.toml | 0 .../ciphernode => crates}/cli/src/cli.rs | 0 .../cli/src/helpers/compile_id.rs | 0 .../cli/src/helpers/mod.rs | 0 .../cli/src/helpers/prompt_password.rs | 0 .../cli/src/helpers/telemetry.rs | 0 .../ciphernode => crates}/cli/src/init.rs | 0 .../ciphernode => crates}/cli/src/main.rs | 0 .../ciphernode => crates}/cli/src/net.rs | 0 .../cli/src/net_generate.rs | 0 .../cli/src/net_purge.rs | 0 .../ciphernode => crates}/cli/src/net_set.rs | 0 .../ciphernode => crates}/cli/src/nodes.rs | 0 .../cli/src/nodes_daemon.rs | 0 .../cli/src/nodes_down.rs | 0 .../ciphernode => crates}/cli/src/nodes_ps.rs | 0 .../cli/src/nodes_restart.rs | 0 .../cli/src/nodes_start.rs | 0 .../cli/src/nodes_status.rs | 0 .../cli/src/nodes_stop.rs | 0 .../ciphernode => crates}/cli/src/nodes_up.rs | 0 .../ciphernode => crates}/cli/src/password.rs | 0 .../cli/src/password_delete.rs | 0 .../cli/src/password_set.rs | 0 .../ciphernode => crates}/cli/src/start.rs | 0 .../ciphernode => crates}/cli/src/wallet.rs | 0 .../cli/src/wallet_set.rs | 0 .../ciphernode => crates}/cli/src/wizard.rs | 0 .../compute-provider/.gitignore | 0 .../compute-provider/Cargo.toml | 0 .../compute-provider/Readme.md | 2 +- .../compute-provider/src/ciphertext_output.rs | 0 .../compute-provider/src/compute_input.rs | 0 .../compute-provider/src/compute_manager.rs | 0 .../compute-provider/src/lib.rs | 0 .../compute-provider/src/merkle_tree.rs | 0 .../ciphernode => crates}/config/Cargo.toml | 0 .../config/src/app_config.rs | 0 .../config/src/chain_config.rs | 0 .../config/src/contract.rs | 0 .../ciphernode => crates}/config/src/lib.rs | 0 .../config/src/load_config.rs | 0 .../config/src/paths_engine.rs | 0 .../ciphernode => crates}/config/src/rpc.rs | 0 .../config/src/store_keys.rs | 0 .../config/src/validation.rs | 0 .../ciphernode => crates}/config/src/yaml.rs | 0 .../ciphernode => crates}/crypto/Cargo.toml | 0 .../crypto/src/cipher.rs | 0 .../ciphernode => crates}/crypto/src/lib.rs | 0 .../crypto/src/password_manager.rs | 0 .../ciphernode => crates}/data/Cargo.toml | 2 +- .../ciphernode => crates}/data/README.md | 9 +- .../data/src/data_store.rs | 0 .../ciphernode => crates}/data/src/in_mem.rs | 0 .../data/src/into_key.rs | 0 .../ciphernode => crates}/data/src/lib.rs | 0 .../data/src/persistable.rs | 0 .../data/src/repositories.rs | 0 .../data/src/repository.rs | 0 .../data/src/sled_store.rs | 0 .../data/src/snapshot.rs | 0 .../ciphernode => crates}/docs/user_guide.md | 0 .../entrypoint/Cargo.toml | 2 +- .../entrypoint/README.md | 0 .../ciphernode => crates}/entrypoint/build.rs | 6 +- .../entrypoint/src/helpers/datastore.rs | 0 .../entrypoint/src/helpers/mod.rs | 0 .../entrypoint/src/helpers/rand.rs | 0 .../entrypoint/src/helpers/shutdown.rs | 0 .../entrypoint/src/helpers/termtable.rs | 0 .../entrypoint/src/lib.rs | 0 .../entrypoint/src/net/keypair/generate.rs | 0 .../entrypoint/src/net/keypair/mod.rs | 0 .../entrypoint/src/net/keypair/set.rs | 0 .../entrypoint/src/net/mod.rs | 0 .../entrypoint/src/net/peer_id/mod.rs | 0 .../entrypoint/src/net/peer_id/purge.rs | 0 .../entrypoint/src/nodes/client.rs | 0 .../entrypoint/src/nodes/daemon.rs | 0 .../entrypoint/src/nodes/down.rs | 0 .../entrypoint/src/nodes/mod.rs | 0 .../entrypoint/src/nodes/nodes.rs | 0 .../entrypoint/src/nodes/process_manager.rs | 0 .../entrypoint/src/nodes/ps.rs | 0 .../entrypoint/src/nodes/restart.rs | 0 .../entrypoint/src/nodes/server.rs | 0 .../entrypoint/src/nodes/start.rs | 0 .../entrypoint/src/nodes/status.rs | 0 .../entrypoint/src/nodes/stop.rs | 0 .../entrypoint/src/nodes/up.rs | 0 .../entrypoint/src/password/delete.rs | 0 .../entrypoint/src/password/mod.rs | 0 .../entrypoint/src/password/set.rs | 0 .../entrypoint/src/start/aggregator_start.rs | 0 .../entrypoint/src/start/mod.rs | 0 .../entrypoint/src/start/start.rs | 0 .../entrypoint/src/wallet/mod.rs | 0 .../entrypoint/src/wallet/set.rs | 0 .../entrypoint/src/wizard/mod.rs | 0 .../ciphernode => crates}/events/Cargo.toml | 2 +- .../ciphernode => crates}/events/src/e3id.rs | 0 .../src/enclave_event/ciphernode_added.rs | 0 .../src/enclave_event/ciphernode_removed.rs | 0 .../src/enclave_event/ciphernode_selected.rs | 0 .../ciphertext_output_published.rs | 0 .../enclave_event/decryptionshare_created.rs | 0 .../events/src/enclave_event/die.rs | 0 .../src/enclave_event/e3_request_complete.rs | 0 .../events/src/enclave_event/e3_requested.rs | 0 .../events/src/enclave_event/enclave_error.rs | 0 .../src/enclave_event/keyshare_created.rs | 0 .../events/src/enclave_event/mod.rs | 0 .../src/enclave_event/plaintext_aggregated.rs | 0 .../src/enclave_event/publickey_aggregated.rs | 0 .../events/src/enclave_event/shutdown.rs | 0 .../events/src/enclave_event/test_event.rs | 0 .../events/src/event_id.rs | 0 .../events/src/eventbus.rs | 0 .../events/src/eventbus_factory.rs | 0 .../ciphernode => crates}/events/src/lib.rs | 0 .../events/src/ordered_set.rs | 0 .../ciphernode => crates}/events/src/seed.rs | 0 .../evm-helpers/Cargo.toml | 0 .../evm-helpers/scripts/build_fixtures.sh | 0 .../evm-helpers/src/contracts.rs | 0 .../evm-helpers/src/events.rs | 0 .../evm-helpers/src/lib.rs | 0 .../evm-helpers/src/listener.rs | 0 .../evm-helpers/tests/fixtures/.gitignore | 0 .../evm-helpers/tests/fixtures/emit_logs.sol | 0 .../tests/fixtures/fake_enclave.sol | 0 .../evm-helpers/tests/helpers.rs | 0 .../evm-helpers/tests/listener.rs | 0 .../ciphernode => crates}/evm/Cargo.toml | 0 .../evm/scripts/build_fixtures.sh | 0 .../evm/src/ciphernode_registry_sol.rs | 2 +- .../evm/src/enclave_sol.rs | 0 .../evm/src/enclave_sol_reader.rs | 2 +- .../evm/src/enclave_sol_writer.rs | 2 +- .../evm/src/event_reader.rs | 0 .../ciphernode => crates}/evm/src/helpers.rs | 0 .../ciphernode => crates}/evm/src/lib.rs | 0 .../evm/src/registry_filter_sol.rs | 2 +- .../ciphernode => crates}/evm/src/repo.rs | 0 .../evm/tests/evm_reader.rs | 0 .../evm/tests/fixtures/.gitignore | 0 .../evm/tests/fixtures/emit_logs.sol | 0 .../ciphernode => crates}/fhe/Cargo.toml | 0 .../ciphernode => crates}/fhe/src/ext.rs | 0 .../ciphernode => crates}/fhe/src/fhe.rs | 0 .../ciphernode => crates}/fhe/src/lib.rs | 0 .../ciphernode => crates}/fhe/src/repo.rs | 0 .../ciphernode => crates}/fhe/src/utils.rs | 0 .../ciphernode => crates}/indexer/Cargo.toml | 0 .../indexer/scripts/build_fixtures.sh | 0 .../indexer/src/indexer.rs | 0 .../ciphernode => crates}/indexer/src/lib.rs | 0 .../indexer/src/models.rs | 0 .../ciphernode => crates}/indexer/src/repo.rs | 0 .../indexer/src/traits.rs | 0 .../indexer/tests/fixtures/.gitignore | 0 .../indexer/tests/fixtures/emit_logs.sol | 0 .../indexer/tests/fixtures/fake_enclave.sol | 0 .../indexer/tests/helpers.rs | 0 .../indexer/tests/indexer.rs | 0 .../ciphernode => crates}/init/Cargo.toml | 0 .../ciphernode => crates}/init/src/lib.rs | 0 .../ciphernode => crates}/keyshare/Cargo.toml | 0 .../ciphernode => crates}/keyshare/src/ext.rs | 0 .../keyshare/src/keyshare.rs | 0 .../ciphernode => crates}/keyshare/src/lib.rs | 0 .../keyshare/src/repo.rs | 0 .../ciphernode => crates}/logger/Cargo.toml | 0 .../ciphernode => crates}/logger/src/lib.rs | 0 .../logger/src/logger.rs | 0 .../ciphernode => crates}/net/Cargo.toml | 2 +- .../net/src/bin/p2p_test.rs | 0 .../net/src/correlation_id.rs | 0 .../ciphernode => crates}/net/src/dialer.rs | 0 .../ciphernode => crates}/net/src/events.rs | 0 .../ciphernode => crates}/net/src/lib.rs | 0 .../net/src/network_manager.rs | 0 .../net/src/network_peer.rs | 0 .../ciphernode => crates}/net/src/repo.rs | 0 .../ciphernode => crates}/net/src/retry.rs | 0 .../net/tests/Dockerfile | 0 .../net/tests/docker-compose.yaml | 12 +- .../ciphernode => crates}/net/tests/run.sh | 0 .../ciphernode => crates}/request/Cargo.toml | 0 .../request/src/context.rs | 0 .../request/src/hetrogenous_map.rs | 0 .../ciphernode => crates}/request/src/lib.rs | 0 .../ciphernode => crates}/request/src/meta.rs | 0 .../ciphernode => crates}/request/src/repo.rs | 0 .../request/src/router.rs | 0 .../scripts/build_fixtures.sh | 0 .../ciphernode => crates}/scripts/launch.sh | 0 .../ciphernode => crates}/scripts/lint.sh | 0 .../ciphernode => crates}/scripts/test.sh | 0 .../scripts/test_encryptor.sh | 0 .../ciphernode => crates}/sdk/Cargo.toml | 0 .../ciphernode => crates}/sdk/src/lib.rs | 0 .../sortition/Cargo.toml | 2 +- .../sortition/src/ciphernode_selector.rs | 0 .../sortition/src/distance.rs | 0 .../sortition/src/index.rs | 0 .../sortition/src/lib.rs | 0 .../sortition/src/repo.rs | 0 .../sortition/src/sortition.rs | 0 .../test-helpers/Cargo.toml | 0 .../test-helpers/src/bin/fake_encrypt.rs | 0 .../test-helpers/src/bin/pack_e3_params.rs | 0 .../test-helpers/src/lib.rs | 0 .../test-helpers/src/plaintext_writer.rs | 0 .../test-helpers/src/public_key_writer.rs | 0 .../test-helpers/src/utils.rs | 0 .../ciphernode => crates}/tests/Cargo.toml | 0 .../ciphernode => crates}/tests/src/main.rs | 0 .../tests/test_aggregation_and_decryption.rs | 0 deploy/build.sh | 2 +- docs/pages/compute-provider.mdx | 2 +- docs/pages/write-secure-program.mdx | 2 +- examples/CRISP/apps/program/Cargo.toml | 2 +- examples/CRISP/apps/program/core/Cargo.toml | 4 +- examples/CRISP/apps/program/host/Cargo.toml | 2 +- .../apps/program/methods/guest/Cargo.toml | 2 +- examples/CRISP/apps/server/Cargo.toml | 4 +- examples/CRISP/apps/server/Dockerfile | 56 +++++----- examples/CRISP/apps/wasm-crypto/Cargo.toml | 2 +- examples/CRISP/scripts/tasks/setup.sh | 2 +- package.json | 4 +- packages/ciphernode/Dockerfile | 99 ----------------- tests/integration/lib/prebuild.sh | 2 +- tests/integration/net.sh | 2 +- 249 files changed, 217 insertions(+), 213 deletions(-) rename {packages/ciphernode => crates}/.dockerignore (100%) create mode 100644 crates/Dockerfile rename {packages/ciphernode => crates}/README.md (100%) rename {packages/ciphernode => crates}/aggregator/Cargo.toml (100%) rename {packages/ciphernode => crates}/aggregator/src/ext.rs (100%) rename {packages/ciphernode => crates}/aggregator/src/lib.rs (100%) rename {packages/ciphernode => crates}/aggregator/src/plaintext_aggregator.rs (100%) rename {packages/ciphernode => crates}/aggregator/src/publickey_aggregator.rs (100%) rename {packages/ciphernode => crates}/aggregator/src/repo.rs (100%) rename {packages/ciphernode => crates}/bfv-helpers/Cargo.toml (100%) rename {packages/ciphernode => crates}/bfv-helpers/src/lib.rs (100%) rename {packages/ciphernode => crates}/ciphernode-entrypoint.sh (100%) rename {packages/ciphernode => crates}/cli/Cargo.toml (100%) rename {packages/ciphernode => crates}/cli/src/cli.rs (100%) rename {packages/ciphernode => crates}/cli/src/helpers/compile_id.rs (100%) rename {packages/ciphernode => crates}/cli/src/helpers/mod.rs (100%) rename {packages/ciphernode => crates}/cli/src/helpers/prompt_password.rs (100%) rename {packages/ciphernode => crates}/cli/src/helpers/telemetry.rs (100%) rename {packages/ciphernode => crates}/cli/src/init.rs (100%) rename {packages/ciphernode => crates}/cli/src/main.rs (100%) rename {packages/ciphernode => crates}/cli/src/net.rs (100%) rename {packages/ciphernode => crates}/cli/src/net_generate.rs (100%) rename {packages/ciphernode => crates}/cli/src/net_purge.rs (100%) rename {packages/ciphernode => crates}/cli/src/net_set.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_daemon.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_down.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_ps.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_restart.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_start.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_status.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_stop.rs (100%) rename {packages/ciphernode => crates}/cli/src/nodes_up.rs (100%) rename {packages/ciphernode => crates}/cli/src/password.rs (100%) rename {packages/ciphernode => crates}/cli/src/password_delete.rs (100%) rename {packages/ciphernode => crates}/cli/src/password_set.rs (100%) rename {packages/ciphernode => crates}/cli/src/start.rs (100%) rename {packages/ciphernode => crates}/cli/src/wallet.rs (100%) rename {packages/ciphernode => crates}/cli/src/wallet_set.rs (100%) rename {packages/ciphernode => crates}/cli/src/wizard.rs (100%) rename {packages/ciphernode => crates}/compute-provider/.gitignore (100%) rename {packages/ciphernode => crates}/compute-provider/Cargo.toml (100%) rename {packages/ciphernode => crates}/compute-provider/Readme.md (98%) rename {packages/ciphernode => crates}/compute-provider/src/ciphertext_output.rs (100%) rename {packages/ciphernode => crates}/compute-provider/src/compute_input.rs (100%) rename {packages/ciphernode => crates}/compute-provider/src/compute_manager.rs (100%) rename {packages/ciphernode => crates}/compute-provider/src/lib.rs (100%) rename {packages/ciphernode => crates}/compute-provider/src/merkle_tree.rs (100%) rename {packages/ciphernode => crates}/config/Cargo.toml (100%) rename {packages/ciphernode => crates}/config/src/app_config.rs (100%) rename {packages/ciphernode => crates}/config/src/chain_config.rs (100%) rename {packages/ciphernode => crates}/config/src/contract.rs (100%) rename {packages/ciphernode => crates}/config/src/lib.rs (100%) rename {packages/ciphernode => crates}/config/src/load_config.rs (100%) rename {packages/ciphernode => crates}/config/src/paths_engine.rs (100%) rename {packages/ciphernode => crates}/config/src/rpc.rs (100%) rename {packages/ciphernode => crates}/config/src/store_keys.rs (100%) rename {packages/ciphernode => crates}/config/src/validation.rs (100%) rename {packages/ciphernode => crates}/config/src/yaml.rs (100%) rename {packages/ciphernode => crates}/crypto/Cargo.toml (100%) rename {packages/ciphernode => crates}/crypto/src/cipher.rs (100%) rename {packages/ciphernode => crates}/crypto/src/lib.rs (100%) rename {packages/ciphernode => crates}/crypto/src/password_manager.rs (100%) rename {packages/ciphernode => crates}/data/Cargo.toml (85%) rename {packages/ciphernode => crates}/data/README.md (89%) rename {packages/ciphernode => crates}/data/src/data_store.rs (100%) rename {packages/ciphernode => crates}/data/src/in_mem.rs (100%) rename {packages/ciphernode => crates}/data/src/into_key.rs (100%) rename {packages/ciphernode => crates}/data/src/lib.rs (100%) rename {packages/ciphernode => crates}/data/src/persistable.rs (100%) rename {packages/ciphernode => crates}/data/src/repositories.rs (100%) rename {packages/ciphernode => crates}/data/src/repository.rs (100%) rename {packages/ciphernode => crates}/data/src/sled_store.rs (100%) rename {packages/ciphernode => crates}/data/src/snapshot.rs (100%) rename {packages/ciphernode => crates}/docs/user_guide.md (100%) rename {packages/ciphernode => crates}/entrypoint/Cargo.toml (94%) rename {packages/ciphernode => crates}/entrypoint/README.md (100%) rename {packages/ciphernode => crates}/entrypoint/build.rs (93%) rename {packages/ciphernode => crates}/entrypoint/src/helpers/datastore.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/helpers/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/helpers/rand.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/helpers/shutdown.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/helpers/termtable.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/lib.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/keypair/generate.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/keypair/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/keypair/set.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/peer_id/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/net/peer_id/purge.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/client.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/daemon.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/down.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/nodes.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/process_manager.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/ps.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/restart.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/server.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/start.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/status.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/stop.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/nodes/up.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/password/delete.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/password/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/password/set.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/start/aggregator_start.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/start/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/start/start.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/wallet/mod.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/wallet/set.rs (100%) rename {packages/ciphernode => crates}/entrypoint/src/wizard/mod.rs (100%) rename {packages/ciphernode => crates}/events/Cargo.toml (90%) rename {packages/ciphernode => crates}/events/src/e3id.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/ciphernode_added.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/ciphernode_removed.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/ciphernode_selected.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/ciphertext_output_published.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/decryptionshare_created.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/die.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/e3_request_complete.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/e3_requested.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/enclave_error.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/keyshare_created.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/mod.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/plaintext_aggregated.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/publickey_aggregated.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/shutdown.rs (100%) rename {packages/ciphernode => crates}/events/src/enclave_event/test_event.rs (100%) rename {packages/ciphernode => crates}/events/src/event_id.rs (100%) rename {packages/ciphernode => crates}/events/src/eventbus.rs (100%) rename {packages/ciphernode => crates}/events/src/eventbus_factory.rs (100%) rename {packages/ciphernode => crates}/events/src/lib.rs (100%) rename {packages/ciphernode => crates}/events/src/ordered_set.rs (100%) rename {packages/ciphernode => crates}/events/src/seed.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/Cargo.toml (100%) rename {packages/ciphernode => crates}/evm-helpers/scripts/build_fixtures.sh (100%) rename {packages/ciphernode => crates}/evm-helpers/src/contracts.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/src/events.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/src/lib.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/src/listener.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/tests/fixtures/.gitignore (100%) rename {packages/ciphernode => crates}/evm-helpers/tests/fixtures/emit_logs.sol (100%) rename {packages/ciphernode => crates}/evm-helpers/tests/fixtures/fake_enclave.sol (100%) rename {packages/ciphernode => crates}/evm-helpers/tests/helpers.rs (100%) rename {packages/ciphernode => crates}/evm-helpers/tests/listener.rs (100%) rename {packages/ciphernode => crates}/evm/Cargo.toml (100%) rename {packages/ciphernode => crates}/evm/scripts/build_fixtures.sh (100%) rename {packages/ciphernode => crates}/evm/src/ciphernode_registry_sol.rs (97%) rename {packages/ciphernode => crates}/evm/src/enclave_sol.rs (100%) rename {packages/ciphernode => crates}/evm/src/enclave_sol_reader.rs (97%) rename {packages/ciphernode => crates}/evm/src/enclave_sol_writer.rs (97%) rename {packages/ciphernode => crates}/evm/src/event_reader.rs (100%) rename {packages/ciphernode => crates}/evm/src/helpers.rs (100%) rename {packages/ciphernode => crates}/evm/src/lib.rs (100%) rename {packages/ciphernode => crates}/evm/src/registry_filter_sol.rs (97%) rename {packages/ciphernode => crates}/evm/src/repo.rs (100%) rename {packages/ciphernode => crates}/evm/tests/evm_reader.rs (100%) rename {packages/ciphernode => crates}/evm/tests/fixtures/.gitignore (100%) rename {packages/ciphernode => crates}/evm/tests/fixtures/emit_logs.sol (100%) rename {packages/ciphernode => crates}/fhe/Cargo.toml (100%) rename {packages/ciphernode => crates}/fhe/src/ext.rs (100%) rename {packages/ciphernode => crates}/fhe/src/fhe.rs (100%) rename {packages/ciphernode => crates}/fhe/src/lib.rs (100%) rename {packages/ciphernode => crates}/fhe/src/repo.rs (100%) rename {packages/ciphernode => crates}/fhe/src/utils.rs (100%) rename {packages/ciphernode => crates}/indexer/Cargo.toml (100%) rename {packages/ciphernode => crates}/indexer/scripts/build_fixtures.sh (100%) rename {packages/ciphernode => crates}/indexer/src/indexer.rs (100%) rename {packages/ciphernode => crates}/indexer/src/lib.rs (100%) rename {packages/ciphernode => crates}/indexer/src/models.rs (100%) rename {packages/ciphernode => crates}/indexer/src/repo.rs (100%) rename {packages/ciphernode => crates}/indexer/src/traits.rs (100%) rename {packages/ciphernode => crates}/indexer/tests/fixtures/.gitignore (100%) rename {packages/ciphernode => crates}/indexer/tests/fixtures/emit_logs.sol (100%) rename {packages/ciphernode => crates}/indexer/tests/fixtures/fake_enclave.sol (100%) rename {packages/ciphernode => crates}/indexer/tests/helpers.rs (100%) rename {packages/ciphernode => crates}/indexer/tests/indexer.rs (100%) rename {packages/ciphernode => crates}/init/Cargo.toml (100%) rename {packages/ciphernode => crates}/init/src/lib.rs (100%) rename {packages/ciphernode => crates}/keyshare/Cargo.toml (100%) rename {packages/ciphernode => crates}/keyshare/src/ext.rs (100%) rename {packages/ciphernode => crates}/keyshare/src/keyshare.rs (100%) rename {packages/ciphernode => crates}/keyshare/src/lib.rs (100%) rename {packages/ciphernode => crates}/keyshare/src/repo.rs (100%) rename {packages/ciphernode => crates}/logger/Cargo.toml (100%) rename {packages/ciphernode => crates}/logger/src/lib.rs (100%) rename {packages/ciphernode => crates}/logger/src/logger.rs (100%) rename {packages/ciphernode => crates}/net/Cargo.toml (90%) rename {packages/ciphernode => crates}/net/src/bin/p2p_test.rs (100%) rename {packages/ciphernode => crates}/net/src/correlation_id.rs (100%) rename {packages/ciphernode => crates}/net/src/dialer.rs (100%) rename {packages/ciphernode => crates}/net/src/events.rs (100%) rename {packages/ciphernode => crates}/net/src/lib.rs (100%) rename {packages/ciphernode => crates}/net/src/network_manager.rs (100%) rename {packages/ciphernode => crates}/net/src/network_peer.rs (100%) rename {packages/ciphernode => crates}/net/src/repo.rs (100%) rename {packages/ciphernode => crates}/net/src/retry.rs (100%) rename {packages/ciphernode => crates}/net/tests/Dockerfile (100%) rename {packages/ciphernode => crates}/net/tests/docker-compose.yaml (72%) rename {packages/ciphernode => crates}/net/tests/run.sh (100%) rename {packages/ciphernode => crates}/request/Cargo.toml (100%) rename {packages/ciphernode => crates}/request/src/context.rs (100%) rename {packages/ciphernode => crates}/request/src/hetrogenous_map.rs (100%) rename {packages/ciphernode => crates}/request/src/lib.rs (100%) rename {packages/ciphernode => crates}/request/src/meta.rs (100%) rename {packages/ciphernode => crates}/request/src/repo.rs (100%) rename {packages/ciphernode => crates}/request/src/router.rs (100%) rename {packages/ciphernode => crates}/scripts/build_fixtures.sh (100%) rename {packages/ciphernode => crates}/scripts/launch.sh (100%) rename {packages/ciphernode => crates}/scripts/lint.sh (100%) rename {packages/ciphernode => crates}/scripts/test.sh (100%) rename {packages/ciphernode => crates}/scripts/test_encryptor.sh (100%) rename {packages/ciphernode => crates}/sdk/Cargo.toml (100%) rename {packages/ciphernode => crates}/sdk/src/lib.rs (100%) rename {packages/ciphernode => crates}/sortition/Cargo.toml (89%) rename {packages/ciphernode => crates}/sortition/src/ciphernode_selector.rs (100%) rename {packages/ciphernode => crates}/sortition/src/distance.rs (100%) rename {packages/ciphernode => crates}/sortition/src/index.rs (100%) rename {packages/ciphernode => crates}/sortition/src/lib.rs (100%) rename {packages/ciphernode => crates}/sortition/src/repo.rs (100%) rename {packages/ciphernode => crates}/sortition/src/sortition.rs (100%) rename {packages/ciphernode => crates}/test-helpers/Cargo.toml (100%) rename {packages/ciphernode => crates}/test-helpers/src/bin/fake_encrypt.rs (100%) rename {packages/ciphernode => crates}/test-helpers/src/bin/pack_e3_params.rs (100%) rename {packages/ciphernode => crates}/test-helpers/src/lib.rs (100%) rename {packages/ciphernode => crates}/test-helpers/src/plaintext_writer.rs (100%) rename {packages/ciphernode => crates}/test-helpers/src/public_key_writer.rs (100%) rename {packages/ciphernode => crates}/test-helpers/src/utils.rs (100%) rename {packages/ciphernode => crates}/tests/Cargo.toml (100%) rename {packages/ciphernode => crates}/tests/src/main.rs (100%) rename {packages/ciphernode => crates}/tests/tests/test_aggregation_and_decryption.rs (100%) delete mode 100644 packages/ciphernode/Dockerfile diff --git a/.github/workflows/ec2-deployment.yml b/.github/workflows/ec2-deployment.yml index e95aca9034..3b3fca5b54 100644 --- a/.github/workflows/ec2-deployment.yml +++ b/.github/workflows/ec2-deployment.yml @@ -7,7 +7,7 @@ on: - hacknet paths: - "Cargo.*" - - "packages/ciphernode/**" + - "crates/**" - "packages/evm/contracts/**" pull_request: branches: @@ -16,11 +16,11 @@ on: - hacknet paths: - "Cargo.*" - - "packages/ciphernode/**" + - "crates/**" - "packages/evm/contracts/**" env: - DOCKERFILE_PATH: packages/ciphernode/Dockerfile + DOCKERFILE_PATH: crates/Dockerfile IMAGE_NAME: ghcr.io/gnosisguild/ciphernode permissions: diff --git a/Cargo.toml b/Cargo.toml index f85be60359..706138244c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,27 +1,27 @@ [workspace] members = [ - "packages/ciphernode/aggregator", - "packages/ciphernode/config", - "packages/ciphernode/crypto", - "packages/ciphernode/compute-provider", - "packages/ciphernode/data", - "packages/ciphernode/bfv-helpers", - "packages/ciphernode/evm-helpers", - "packages/ciphernode/indexer", - "packages/ciphernode/request", - "packages/ciphernode/cli", - "packages/ciphernode/entrypoint", - "packages/ciphernode/events", - "packages/ciphernode/evm", - "packages/ciphernode/fhe", - "packages/ciphernode/init", - "packages/ciphernode/keyshare", - "packages/ciphernode/logger", - "packages/ciphernode/net", - "packages/ciphernode/sdk", - "packages/ciphernode/sortition", - "packages/ciphernode/test-helpers", - "packages/ciphernode/tests", + "crates/aggregator", + "crates/config", + "crates/crypto", + "crates/compute-provider", + "crates/data", + "crates/bfv-helpers", + "crates/evm-helpers", + "crates/indexer", + "crates/request", + "crates/cli", + "crates/entrypoint", + "crates/events", + "crates/evm", + "crates/fhe", + "crates/init", + "crates/keyshare", + "crates/logger", + "crates/net", + "crates/sdk", + "crates/sortition", + "crates/test-helpers", + "crates/tests", ] exclude = [ "examples/CRISP/apps/server", @@ -35,27 +35,27 @@ version = "0.1.0" edition = "2021" [workspace.dependencies] -e3-aggregator = { path = "./packages/ciphernode/aggregator" } -e3-bfv-helpers = { path = "./packages/ciphernode/bfv-helpers" } -e3-config = { path = "./packages/ciphernode/config" } -e3-crypto = { path = "./packages/ciphernode/crypto" } -e3-data = { path = "./packages/ciphernode/data" } -e3-request = { path = "./packages/ciphernode/request" } -e3-sdk = { path = "./packages/ciphernode/sdk" } -e3-cli = { path = "./packages/ciphernode/cli" } -e3-entrypoint = { path = "./packages/ciphernode/entrypoint" } -e3-init = { path = "./packages/ciphernode/init" } -e3-events = { path = "./packages/ciphernode/events" } -e3-evm = { path = "./packages/ciphernode/evm" } -e3-evm-helpers = { path = "./packages/ciphernode/evm-helpers" } -e3-fhe = { path = "./packages/ciphernode/fhe" } -e3-indexer = { path = "./packages/ciphernode/indexer" } -e3-keyshare = { path = "./packages/ciphernode/keyshare" } -e3-logger = { path = "./packages/ciphernode/logger" } -e3-net = { path = "./packages/ciphernode/net" } -e3-sortition = { path = "./packages/ciphernode/sortition" } -e3-test-helpers = { path = "./packages/ciphernode/test-helpers" } -e3-tests = { path = "./packages/ciphernode/tests" } +e3-aggregator = { path = "./crates/aggregator" } +e3-bfv-helpers = { path = "./crates/bfv-helpers" } +e3-config = { path = "./crates/config" } +e3-crypto = { path = "./crates/crypto" } +e3-data = { path = "./crates/data" } +e3-request = { path = "./crates/request" } +e3-sdk = { path = "./crates/sdk" } +e3-cli = { path = "./crates/cli" } +e3-entrypoint = { path = "./crates/entrypoint" } +e3-init = { path = "./crates/init" } +e3-events = { path = "./crates/events" } +e3-evm = { path = "./crates/evm" } +e3-evm-helpers = { path = "./crates/evm-helpers" } +e3-fhe = { path = "./crates/fhe" } +e3-indexer = { path = "./crates/indexer" } +e3-keyshare = { path = "./crates/keyshare" } +e3-logger = { path = "./crates/logger" } +e3-net = { path = "./crates/net" } +e3-sortition = { path = "./crates/sortition" } +e3-test-helpers = { path = "./crates/test-helpers" } +e3-tests = { path = "./crates/tests" } actix = "0.13.5" actix-web = "4.10.2" diff --git a/packages/ciphernode/.dockerignore b/crates/.dockerignore similarity index 100% rename from packages/ciphernode/.dockerignore rename to crates/.dockerignore diff --git a/crates/Dockerfile b/crates/Dockerfile new file mode 100644 index 0000000000..5af7ad6739 --- /dev/null +++ b/crates/Dockerfile @@ -0,0 +1,104 @@ +FROM node:22 AS evm-builder + +WORKDIR /build/packages/evm +COPY ./packages/evm ./ + +RUN npm install -g corepack +RUN corepack enable + +RUN pnpm install && pnpm compile + +# Build stage +FROM rust:1.81 AS ciphernode-builder + +# Force incremental +ENV CARGO_INCREMENTAL=1 +ENV RUSTC_FORCE_INCREMENTAL=1 +ENV CARGO_BUILD_JOBS=8 + +# Create build directory + +WORKDIR /build +COPY Cargo.lock ./Cargo.lock +COPY Cargo.toml ./Cargo.toml +COPY ./rust-toolchain.toml . + +WORKDIR /build/crates +COPY --from=evm-builder /build/packages/evm/artifacts ../packages/evm/artifacts +COPY --from=evm-builder /build/packages/evm/deployments ../packages/evm/deployments + +# find crates/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) crates/|COPY \1 ./|' +COPY crates/aggregator/Cargo.toml ./aggregator/Cargo.toml +COPY crates/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml +COPY crates/cli/Cargo.toml ./cli/Cargo.toml +COPY crates/compute-provider/Cargo.toml ./compute-provider/Cargo.toml +COPY crates/config/Cargo.toml ./config/Cargo.toml +COPY crates/crypto/Cargo.toml ./crypto/Cargo.toml +COPY crates/data/Cargo.toml ./data/Cargo.toml +COPY crates/entrypoint/Cargo.toml ./entrypoint/Cargo.toml +COPY crates/events/Cargo.toml ./events/Cargo.toml +COPY crates/evm/Cargo.toml ./evm/Cargo.toml +COPY crates/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml +COPY crates/fhe/Cargo.toml ./fhe/Cargo.toml +COPY crates/indexer/Cargo.toml ./indexer/Cargo.toml +COPY crates/init/Cargo.toml ./init/Cargo.toml +COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml +COPY crates/logger/Cargo.toml ./logger/Cargo.toml +COPY crates/net/Cargo.toml ./net/Cargo.toml +COPY crates/request/Cargo.toml ./request/Cargo.toml +COPY crates/sdk/Cargo.toml ./sdk/Cargo.toml +COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml +COPY crates/test-helpers/Cargo.toml ./test-helpers/Cargo.toml +COPY crates/tests/Cargo.toml ./tests/Cargo.toml + +# COPY ./crates/entrypoint/build.rs ./entrypoint/build.rs +RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./entrypoint/build.rs +RUN for d in ./*/ ; do \ + if [ -f "$d/Cargo.toml" ]; then \ + if [ "$d" = "./cli/" ]; then \ + mkdir -p "$d/src" && \ + echo "fn main() {}" > "$d/src/main.rs"; \ + else \ + mkdir -p "$d/src" && \ + echo "pub fn main() {}" > "$d/src/lib.rs"; \ + fi \ + fi \ + done + +RUN cargo build --release + +COPY ./crates . + +RUN find . -name "*.rs" -exec touch {} + +RUN cargo build --release -p e3-cli + +# Runtime stage +FROM debian:stable-slim + +# Install runtime dependencies +RUN apt-get update && apt-get install -y --no-install-recommends iptables dnsutils iputils-ping ca-certificates jq && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +# Create non-root user +RUN useradd -m -u 1000 -s /bin/bash ciphernode + +# Create necessary directories with proper permissions +RUN mkdir -p /home/ciphernode/.config/enclave \ + /home/ciphernode/.local/share/enclave \ + /run/secrets && \ + chown -R ciphernode:ciphernode /home/ciphernode /run/secrets + +# Switch to non-root user +USER ciphernode +WORKDIR /home/ciphernode + +# Copy binary from builder +COPY --from=ciphernode-builder --chown=ciphernode:ciphernode /build/target/release/enclave /usr/local/bin/ +COPY --from=ciphernode-builder --chmod=755 --chown=ciphernode:ciphernode /build/crates/ciphernode-entrypoint.sh /usr/local/bin/ + +# Environment variables for configuration +ENV CONFIG_DIR=/home/ciphernode/.config/enclave +ENV DATA_DIR=/home/ciphernode/.local/share/enclave + +# Add entrypoint script +ENTRYPOINT ["ciphernode-entrypoint.sh"] diff --git a/packages/ciphernode/README.md b/crates/README.md similarity index 100% rename from packages/ciphernode/README.md rename to crates/README.md diff --git a/packages/ciphernode/aggregator/Cargo.toml b/crates/aggregator/Cargo.toml similarity index 100% rename from packages/ciphernode/aggregator/Cargo.toml rename to crates/aggregator/Cargo.toml diff --git a/packages/ciphernode/aggregator/src/ext.rs b/crates/aggregator/src/ext.rs similarity index 100% rename from packages/ciphernode/aggregator/src/ext.rs rename to crates/aggregator/src/ext.rs diff --git a/packages/ciphernode/aggregator/src/lib.rs b/crates/aggregator/src/lib.rs similarity index 100% rename from packages/ciphernode/aggregator/src/lib.rs rename to crates/aggregator/src/lib.rs diff --git a/packages/ciphernode/aggregator/src/plaintext_aggregator.rs b/crates/aggregator/src/plaintext_aggregator.rs similarity index 100% rename from packages/ciphernode/aggregator/src/plaintext_aggregator.rs rename to crates/aggregator/src/plaintext_aggregator.rs diff --git a/packages/ciphernode/aggregator/src/publickey_aggregator.rs b/crates/aggregator/src/publickey_aggregator.rs similarity index 100% rename from packages/ciphernode/aggregator/src/publickey_aggregator.rs rename to crates/aggregator/src/publickey_aggregator.rs diff --git a/packages/ciphernode/aggregator/src/repo.rs b/crates/aggregator/src/repo.rs similarity index 100% rename from packages/ciphernode/aggregator/src/repo.rs rename to crates/aggregator/src/repo.rs diff --git a/packages/ciphernode/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml similarity index 100% rename from packages/ciphernode/bfv-helpers/Cargo.toml rename to crates/bfv-helpers/Cargo.toml diff --git a/packages/ciphernode/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs similarity index 100% rename from packages/ciphernode/bfv-helpers/src/lib.rs rename to crates/bfv-helpers/src/lib.rs diff --git a/packages/ciphernode/ciphernode-entrypoint.sh b/crates/ciphernode-entrypoint.sh similarity index 100% rename from packages/ciphernode/ciphernode-entrypoint.sh rename to crates/ciphernode-entrypoint.sh diff --git a/packages/ciphernode/cli/Cargo.toml b/crates/cli/Cargo.toml similarity index 100% rename from packages/ciphernode/cli/Cargo.toml rename to crates/cli/Cargo.toml diff --git a/packages/ciphernode/cli/src/cli.rs b/crates/cli/src/cli.rs similarity index 100% rename from packages/ciphernode/cli/src/cli.rs rename to crates/cli/src/cli.rs diff --git a/packages/ciphernode/cli/src/helpers/compile_id.rs b/crates/cli/src/helpers/compile_id.rs similarity index 100% rename from packages/ciphernode/cli/src/helpers/compile_id.rs rename to crates/cli/src/helpers/compile_id.rs diff --git a/packages/ciphernode/cli/src/helpers/mod.rs b/crates/cli/src/helpers/mod.rs similarity index 100% rename from packages/ciphernode/cli/src/helpers/mod.rs rename to crates/cli/src/helpers/mod.rs diff --git a/packages/ciphernode/cli/src/helpers/prompt_password.rs b/crates/cli/src/helpers/prompt_password.rs similarity index 100% rename from packages/ciphernode/cli/src/helpers/prompt_password.rs rename to crates/cli/src/helpers/prompt_password.rs diff --git a/packages/ciphernode/cli/src/helpers/telemetry.rs b/crates/cli/src/helpers/telemetry.rs similarity index 100% rename from packages/ciphernode/cli/src/helpers/telemetry.rs rename to crates/cli/src/helpers/telemetry.rs diff --git a/packages/ciphernode/cli/src/init.rs b/crates/cli/src/init.rs similarity index 100% rename from packages/ciphernode/cli/src/init.rs rename to crates/cli/src/init.rs diff --git a/packages/ciphernode/cli/src/main.rs b/crates/cli/src/main.rs similarity index 100% rename from packages/ciphernode/cli/src/main.rs rename to crates/cli/src/main.rs diff --git a/packages/ciphernode/cli/src/net.rs b/crates/cli/src/net.rs similarity index 100% rename from packages/ciphernode/cli/src/net.rs rename to crates/cli/src/net.rs diff --git a/packages/ciphernode/cli/src/net_generate.rs b/crates/cli/src/net_generate.rs similarity index 100% rename from packages/ciphernode/cli/src/net_generate.rs rename to crates/cli/src/net_generate.rs diff --git a/packages/ciphernode/cli/src/net_purge.rs b/crates/cli/src/net_purge.rs similarity index 100% rename from packages/ciphernode/cli/src/net_purge.rs rename to crates/cli/src/net_purge.rs diff --git a/packages/ciphernode/cli/src/net_set.rs b/crates/cli/src/net_set.rs similarity index 100% rename from packages/ciphernode/cli/src/net_set.rs rename to crates/cli/src/net_set.rs diff --git a/packages/ciphernode/cli/src/nodes.rs b/crates/cli/src/nodes.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes.rs rename to crates/cli/src/nodes.rs diff --git a/packages/ciphernode/cli/src/nodes_daemon.rs b/crates/cli/src/nodes_daemon.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_daemon.rs rename to crates/cli/src/nodes_daemon.rs diff --git a/packages/ciphernode/cli/src/nodes_down.rs b/crates/cli/src/nodes_down.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_down.rs rename to crates/cli/src/nodes_down.rs diff --git a/packages/ciphernode/cli/src/nodes_ps.rs b/crates/cli/src/nodes_ps.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_ps.rs rename to crates/cli/src/nodes_ps.rs diff --git a/packages/ciphernode/cli/src/nodes_restart.rs b/crates/cli/src/nodes_restart.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_restart.rs rename to crates/cli/src/nodes_restart.rs diff --git a/packages/ciphernode/cli/src/nodes_start.rs b/crates/cli/src/nodes_start.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_start.rs rename to crates/cli/src/nodes_start.rs diff --git a/packages/ciphernode/cli/src/nodes_status.rs b/crates/cli/src/nodes_status.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_status.rs rename to crates/cli/src/nodes_status.rs diff --git a/packages/ciphernode/cli/src/nodes_stop.rs b/crates/cli/src/nodes_stop.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_stop.rs rename to crates/cli/src/nodes_stop.rs diff --git a/packages/ciphernode/cli/src/nodes_up.rs b/crates/cli/src/nodes_up.rs similarity index 100% rename from packages/ciphernode/cli/src/nodes_up.rs rename to crates/cli/src/nodes_up.rs diff --git a/packages/ciphernode/cli/src/password.rs b/crates/cli/src/password.rs similarity index 100% rename from packages/ciphernode/cli/src/password.rs rename to crates/cli/src/password.rs diff --git a/packages/ciphernode/cli/src/password_delete.rs b/crates/cli/src/password_delete.rs similarity index 100% rename from packages/ciphernode/cli/src/password_delete.rs rename to crates/cli/src/password_delete.rs diff --git a/packages/ciphernode/cli/src/password_set.rs b/crates/cli/src/password_set.rs similarity index 100% rename from packages/ciphernode/cli/src/password_set.rs rename to crates/cli/src/password_set.rs diff --git a/packages/ciphernode/cli/src/start.rs b/crates/cli/src/start.rs similarity index 100% rename from packages/ciphernode/cli/src/start.rs rename to crates/cli/src/start.rs diff --git a/packages/ciphernode/cli/src/wallet.rs b/crates/cli/src/wallet.rs similarity index 100% rename from packages/ciphernode/cli/src/wallet.rs rename to crates/cli/src/wallet.rs diff --git a/packages/ciphernode/cli/src/wallet_set.rs b/crates/cli/src/wallet_set.rs similarity index 100% rename from packages/ciphernode/cli/src/wallet_set.rs rename to crates/cli/src/wallet_set.rs diff --git a/packages/ciphernode/cli/src/wizard.rs b/crates/cli/src/wizard.rs similarity index 100% rename from packages/ciphernode/cli/src/wizard.rs rename to crates/cli/src/wizard.rs diff --git a/packages/ciphernode/compute-provider/.gitignore b/crates/compute-provider/.gitignore similarity index 100% rename from packages/ciphernode/compute-provider/.gitignore rename to crates/compute-provider/.gitignore diff --git a/packages/ciphernode/compute-provider/Cargo.toml b/crates/compute-provider/Cargo.toml similarity index 100% rename from packages/ciphernode/compute-provider/Cargo.toml rename to crates/compute-provider/Cargo.toml diff --git a/packages/ciphernode/compute-provider/Readme.md b/crates/compute-provider/Readme.md similarity index 98% rename from packages/ciphernode/compute-provider/Readme.md rename to crates/compute-provider/Readme.md index d1574779d1..3cd615cd62 100644 --- a/packages/ciphernode/compute-provider/Readme.md +++ b/crates/compute-provider/Readme.md @@ -15,7 +15,7 @@ To use this library, add it to your `Cargo.toml`: ```toml [dependencies] -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave.git", path = "packages/ciphernode/compute-provider"} +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave.git", path = "crates/compute-provider"} ``` ## Usage diff --git a/packages/ciphernode/compute-provider/src/ciphertext_output.rs b/crates/compute-provider/src/ciphertext_output.rs similarity index 100% rename from packages/ciphernode/compute-provider/src/ciphertext_output.rs rename to crates/compute-provider/src/ciphertext_output.rs diff --git a/packages/ciphernode/compute-provider/src/compute_input.rs b/crates/compute-provider/src/compute_input.rs similarity index 100% rename from packages/ciphernode/compute-provider/src/compute_input.rs rename to crates/compute-provider/src/compute_input.rs diff --git a/packages/ciphernode/compute-provider/src/compute_manager.rs b/crates/compute-provider/src/compute_manager.rs similarity index 100% rename from packages/ciphernode/compute-provider/src/compute_manager.rs rename to crates/compute-provider/src/compute_manager.rs diff --git a/packages/ciphernode/compute-provider/src/lib.rs b/crates/compute-provider/src/lib.rs similarity index 100% rename from packages/ciphernode/compute-provider/src/lib.rs rename to crates/compute-provider/src/lib.rs diff --git a/packages/ciphernode/compute-provider/src/merkle_tree.rs b/crates/compute-provider/src/merkle_tree.rs similarity index 100% rename from packages/ciphernode/compute-provider/src/merkle_tree.rs rename to crates/compute-provider/src/merkle_tree.rs diff --git a/packages/ciphernode/config/Cargo.toml b/crates/config/Cargo.toml similarity index 100% rename from packages/ciphernode/config/Cargo.toml rename to crates/config/Cargo.toml diff --git a/packages/ciphernode/config/src/app_config.rs b/crates/config/src/app_config.rs similarity index 100% rename from packages/ciphernode/config/src/app_config.rs rename to crates/config/src/app_config.rs diff --git a/packages/ciphernode/config/src/chain_config.rs b/crates/config/src/chain_config.rs similarity index 100% rename from packages/ciphernode/config/src/chain_config.rs rename to crates/config/src/chain_config.rs diff --git a/packages/ciphernode/config/src/contract.rs b/crates/config/src/contract.rs similarity index 100% rename from packages/ciphernode/config/src/contract.rs rename to crates/config/src/contract.rs diff --git a/packages/ciphernode/config/src/lib.rs b/crates/config/src/lib.rs similarity index 100% rename from packages/ciphernode/config/src/lib.rs rename to crates/config/src/lib.rs diff --git a/packages/ciphernode/config/src/load_config.rs b/crates/config/src/load_config.rs similarity index 100% rename from packages/ciphernode/config/src/load_config.rs rename to crates/config/src/load_config.rs diff --git a/packages/ciphernode/config/src/paths_engine.rs b/crates/config/src/paths_engine.rs similarity index 100% rename from packages/ciphernode/config/src/paths_engine.rs rename to crates/config/src/paths_engine.rs diff --git a/packages/ciphernode/config/src/rpc.rs b/crates/config/src/rpc.rs similarity index 100% rename from packages/ciphernode/config/src/rpc.rs rename to crates/config/src/rpc.rs diff --git a/packages/ciphernode/config/src/store_keys.rs b/crates/config/src/store_keys.rs similarity index 100% rename from packages/ciphernode/config/src/store_keys.rs rename to crates/config/src/store_keys.rs diff --git a/packages/ciphernode/config/src/validation.rs b/crates/config/src/validation.rs similarity index 100% rename from packages/ciphernode/config/src/validation.rs rename to crates/config/src/validation.rs diff --git a/packages/ciphernode/config/src/yaml.rs b/crates/config/src/yaml.rs similarity index 100% rename from packages/ciphernode/config/src/yaml.rs rename to crates/config/src/yaml.rs diff --git a/packages/ciphernode/crypto/Cargo.toml b/crates/crypto/Cargo.toml similarity index 100% rename from packages/ciphernode/crypto/Cargo.toml rename to crates/crypto/Cargo.toml diff --git a/packages/ciphernode/crypto/src/cipher.rs b/crates/crypto/src/cipher.rs similarity index 100% rename from packages/ciphernode/crypto/src/cipher.rs rename to crates/crypto/src/cipher.rs diff --git a/packages/ciphernode/crypto/src/lib.rs b/crates/crypto/src/lib.rs similarity index 100% rename from packages/ciphernode/crypto/src/lib.rs rename to crates/crypto/src/lib.rs diff --git a/packages/ciphernode/crypto/src/password_manager.rs b/crates/crypto/src/password_manager.rs similarity index 100% rename from packages/ciphernode/crypto/src/password_manager.rs rename to crates/crypto/src/password_manager.rs diff --git a/packages/ciphernode/data/Cargo.toml b/crates/data/Cargo.toml similarity index 85% rename from packages/ciphernode/data/Cargo.toml rename to crates/data/Cargo.toml index cdad02f33e..d7b98c2db3 100644 --- a/packages/ciphernode/data/Cargo.toml +++ b/crates/data/Cargo.toml @@ -3,7 +3,7 @@ name = "e3-data" version.workspace = true edition.workspace = true description = "Data persistence for enclave" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave/crates" [dependencies] actix = { workspace = true } diff --git a/packages/ciphernode/data/README.md b/crates/data/README.md similarity index 89% rename from packages/ciphernode/data/README.md rename to crates/data/README.md index 490de7fa05..5894700a37 100644 --- a/packages/ciphernode/data/README.md +++ b/crates/data/README.md @@ -68,7 +68,6 @@ graph LR SledStore --> DB ``` - | Layer | Functionality | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | `Repository` | Strongly typed Data persistence for a single item. Configured to know how to save its data. | @@ -79,9 +78,9 @@ graph LR We had a way to save bytes data with the `DataStore` and had a way to specify where that could be saved but actors need to be restartable and be able to be hydrated and we needed a standard way to accomplish this. To do this in typical Rust fashion we created a set of traits: -- [`Snapshot`](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/data/src/snapshot.rs) for defining how an object can create a snapshot of it's state -- [`Checkpoint`](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/data/src/snapshot.rs) for defining how to save that snapshot to a repository -- [`FromSnapshot`](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/data/src/snapshot.rs) and [`FromSnapshotWithParams`](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/data/src/snapshot.rs) for defining how an object could be reconstituted from a snapshot +- [`Snapshot`](https://github.com/gnosisguild/enclave/blob/main/crates/data/src/snapshot.rs) for defining how an object can create a snapshot of it's state +- [`Checkpoint`](https://github.com/gnosisguild/enclave/blob/main/crates/data/src/snapshot.rs) for defining how to save that snapshot to a repository +- [`FromSnapshot`](https://github.com/gnosisguild/enclave/blob/main/crates/data/src/snapshot.rs) and [`FromSnapshotWithParams`](https://github.com/gnosisguild/enclave/blob/main/crates/data/src/snapshot.rs) for defining how an object could be reconstituted from a snapshot This worked well especially for objects who's persistable state needs to be derived from a subset of the saved state however there are a couple of problems: @@ -137,4 +136,4 @@ struct MyActor { } ``` -We have also extracted the key calculation mechanism to a [`StoreKeys`](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/config/src/store_keys.rs) struct. This is used in various places when creating repsitory factories for example [here](https://github.com/gnosisguild/enclave/blob/main/packages/ciphernode/aggregator/src/repositories.rs) +We have also extracted the key calculation mechanism to a [`StoreKeys`](https://github.com/gnosisguild/enclave/blob/main/crates/config/src/store_keys.rs) struct. This is used in various places when creating repsitory factories for example [here](https://github.com/gnosisguild/enclave/blob/main/crates/aggregator/src/repositories.rs) diff --git a/packages/ciphernode/data/src/data_store.rs b/crates/data/src/data_store.rs similarity index 100% rename from packages/ciphernode/data/src/data_store.rs rename to crates/data/src/data_store.rs diff --git a/packages/ciphernode/data/src/in_mem.rs b/crates/data/src/in_mem.rs similarity index 100% rename from packages/ciphernode/data/src/in_mem.rs rename to crates/data/src/in_mem.rs diff --git a/packages/ciphernode/data/src/into_key.rs b/crates/data/src/into_key.rs similarity index 100% rename from packages/ciphernode/data/src/into_key.rs rename to crates/data/src/into_key.rs diff --git a/packages/ciphernode/data/src/lib.rs b/crates/data/src/lib.rs similarity index 100% rename from packages/ciphernode/data/src/lib.rs rename to crates/data/src/lib.rs diff --git a/packages/ciphernode/data/src/persistable.rs b/crates/data/src/persistable.rs similarity index 100% rename from packages/ciphernode/data/src/persistable.rs rename to crates/data/src/persistable.rs diff --git a/packages/ciphernode/data/src/repositories.rs b/crates/data/src/repositories.rs similarity index 100% rename from packages/ciphernode/data/src/repositories.rs rename to crates/data/src/repositories.rs diff --git a/packages/ciphernode/data/src/repository.rs b/crates/data/src/repository.rs similarity index 100% rename from packages/ciphernode/data/src/repository.rs rename to crates/data/src/repository.rs diff --git a/packages/ciphernode/data/src/sled_store.rs b/crates/data/src/sled_store.rs similarity index 100% rename from packages/ciphernode/data/src/sled_store.rs rename to crates/data/src/sled_store.rs diff --git a/packages/ciphernode/data/src/snapshot.rs b/crates/data/src/snapshot.rs similarity index 100% rename from packages/ciphernode/data/src/snapshot.rs rename to crates/data/src/snapshot.rs diff --git a/packages/ciphernode/docs/user_guide.md b/crates/docs/user_guide.md similarity index 100% rename from packages/ciphernode/docs/user_guide.md rename to crates/docs/user_guide.md diff --git a/packages/ciphernode/entrypoint/Cargo.toml b/crates/entrypoint/Cargo.toml similarity index 94% rename from packages/ciphernode/entrypoint/Cargo.toml rename to crates/entrypoint/Cargo.toml index 1361e3ad28..900502a43a 100644 --- a/packages/ciphernode/entrypoint/Cargo.toml +++ b/crates/entrypoint/Cargo.toml @@ -3,7 +3,7 @@ name = "e3-entrypoint" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave" build = "build.rs" [dependencies] diff --git a/packages/ciphernode/entrypoint/README.md b/crates/entrypoint/README.md similarity index 100% rename from packages/ciphernode/entrypoint/README.md rename to crates/entrypoint/README.md diff --git a/packages/ciphernode/entrypoint/build.rs b/crates/entrypoint/build.rs similarity index 93% rename from packages/ciphernode/entrypoint/build.rs rename to crates/entrypoint/build.rs index 01a47dd1eb..9044f74f1e 100644 --- a/packages/ciphernode/entrypoint/build.rs +++ b/crates/entrypoint/build.rs @@ -12,8 +12,9 @@ fn main() -> std::io::Result<()> { // Path to deployment artifacts let deployments_path = Path::new(&manifest_dir) - .join("..") // Adjust based on your actual path structure .join("..") + .join("..") + .join("packages") .join("evm") .join("deployments") .join("sepolia"); @@ -56,8 +57,7 @@ fn main() -> std::io::Result<()> { let out_dir = env::var("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("contract_deployments.rs"); fs::write(dest_path, contract_info)?; - - println!("cargo:rerun-if-changed=../packages/evm/deployments/sepolia"); + println!("cargo:rerun-if-changed=../../packages/evm/deployments/sepolia"); Ok(()) } diff --git a/packages/ciphernode/entrypoint/src/helpers/datastore.rs b/crates/entrypoint/src/helpers/datastore.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/helpers/datastore.rs rename to crates/entrypoint/src/helpers/datastore.rs diff --git a/packages/ciphernode/entrypoint/src/helpers/mod.rs b/crates/entrypoint/src/helpers/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/helpers/mod.rs rename to crates/entrypoint/src/helpers/mod.rs diff --git a/packages/ciphernode/entrypoint/src/helpers/rand.rs b/crates/entrypoint/src/helpers/rand.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/helpers/rand.rs rename to crates/entrypoint/src/helpers/rand.rs diff --git a/packages/ciphernode/entrypoint/src/helpers/shutdown.rs b/crates/entrypoint/src/helpers/shutdown.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/helpers/shutdown.rs rename to crates/entrypoint/src/helpers/shutdown.rs diff --git a/packages/ciphernode/entrypoint/src/helpers/termtable.rs b/crates/entrypoint/src/helpers/termtable.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/helpers/termtable.rs rename to crates/entrypoint/src/helpers/termtable.rs diff --git a/packages/ciphernode/entrypoint/src/lib.rs b/crates/entrypoint/src/lib.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/lib.rs rename to crates/entrypoint/src/lib.rs diff --git a/packages/ciphernode/entrypoint/src/net/keypair/generate.rs b/crates/entrypoint/src/net/keypair/generate.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/keypair/generate.rs rename to crates/entrypoint/src/net/keypair/generate.rs diff --git a/packages/ciphernode/entrypoint/src/net/keypair/mod.rs b/crates/entrypoint/src/net/keypair/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/keypair/mod.rs rename to crates/entrypoint/src/net/keypair/mod.rs diff --git a/packages/ciphernode/entrypoint/src/net/keypair/set.rs b/crates/entrypoint/src/net/keypair/set.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/keypair/set.rs rename to crates/entrypoint/src/net/keypair/set.rs diff --git a/packages/ciphernode/entrypoint/src/net/mod.rs b/crates/entrypoint/src/net/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/mod.rs rename to crates/entrypoint/src/net/mod.rs diff --git a/packages/ciphernode/entrypoint/src/net/peer_id/mod.rs b/crates/entrypoint/src/net/peer_id/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/peer_id/mod.rs rename to crates/entrypoint/src/net/peer_id/mod.rs diff --git a/packages/ciphernode/entrypoint/src/net/peer_id/purge.rs b/crates/entrypoint/src/net/peer_id/purge.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/net/peer_id/purge.rs rename to crates/entrypoint/src/net/peer_id/purge.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/client.rs b/crates/entrypoint/src/nodes/client.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/client.rs rename to crates/entrypoint/src/nodes/client.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/daemon.rs b/crates/entrypoint/src/nodes/daemon.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/daemon.rs rename to crates/entrypoint/src/nodes/daemon.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/down.rs b/crates/entrypoint/src/nodes/down.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/down.rs rename to crates/entrypoint/src/nodes/down.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/mod.rs b/crates/entrypoint/src/nodes/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/mod.rs rename to crates/entrypoint/src/nodes/mod.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/nodes.rs b/crates/entrypoint/src/nodes/nodes.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/nodes.rs rename to crates/entrypoint/src/nodes/nodes.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/process_manager.rs b/crates/entrypoint/src/nodes/process_manager.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/process_manager.rs rename to crates/entrypoint/src/nodes/process_manager.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/ps.rs b/crates/entrypoint/src/nodes/ps.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/ps.rs rename to crates/entrypoint/src/nodes/ps.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/restart.rs b/crates/entrypoint/src/nodes/restart.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/restart.rs rename to crates/entrypoint/src/nodes/restart.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/server.rs b/crates/entrypoint/src/nodes/server.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/server.rs rename to crates/entrypoint/src/nodes/server.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/start.rs b/crates/entrypoint/src/nodes/start.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/start.rs rename to crates/entrypoint/src/nodes/start.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/status.rs b/crates/entrypoint/src/nodes/status.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/status.rs rename to crates/entrypoint/src/nodes/status.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/stop.rs b/crates/entrypoint/src/nodes/stop.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/stop.rs rename to crates/entrypoint/src/nodes/stop.rs diff --git a/packages/ciphernode/entrypoint/src/nodes/up.rs b/crates/entrypoint/src/nodes/up.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/nodes/up.rs rename to crates/entrypoint/src/nodes/up.rs diff --git a/packages/ciphernode/entrypoint/src/password/delete.rs b/crates/entrypoint/src/password/delete.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/password/delete.rs rename to crates/entrypoint/src/password/delete.rs diff --git a/packages/ciphernode/entrypoint/src/password/mod.rs b/crates/entrypoint/src/password/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/password/mod.rs rename to crates/entrypoint/src/password/mod.rs diff --git a/packages/ciphernode/entrypoint/src/password/set.rs b/crates/entrypoint/src/password/set.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/password/set.rs rename to crates/entrypoint/src/password/set.rs diff --git a/packages/ciphernode/entrypoint/src/start/aggregator_start.rs b/crates/entrypoint/src/start/aggregator_start.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/start/aggregator_start.rs rename to crates/entrypoint/src/start/aggregator_start.rs diff --git a/packages/ciphernode/entrypoint/src/start/mod.rs b/crates/entrypoint/src/start/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/start/mod.rs rename to crates/entrypoint/src/start/mod.rs diff --git a/packages/ciphernode/entrypoint/src/start/start.rs b/crates/entrypoint/src/start/start.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/start/start.rs rename to crates/entrypoint/src/start/start.rs diff --git a/packages/ciphernode/entrypoint/src/wallet/mod.rs b/crates/entrypoint/src/wallet/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/wallet/mod.rs rename to crates/entrypoint/src/wallet/mod.rs diff --git a/packages/ciphernode/entrypoint/src/wallet/set.rs b/crates/entrypoint/src/wallet/set.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/wallet/set.rs rename to crates/entrypoint/src/wallet/set.rs diff --git a/packages/ciphernode/entrypoint/src/wizard/mod.rs b/crates/entrypoint/src/wizard/mod.rs similarity index 100% rename from packages/ciphernode/entrypoint/src/wizard/mod.rs rename to crates/entrypoint/src/wizard/mod.rs diff --git a/packages/ciphernode/events/Cargo.toml b/crates/events/Cargo.toml similarity index 90% rename from packages/ciphernode/events/Cargo.toml rename to crates/events/Cargo.toml index 9e1153a74b..fe2f4b9769 100644 --- a/packages/ciphernode/events/Cargo.toml +++ b/crates/events/Cargo.toml @@ -4,7 +4,7 @@ name = "e3-events" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave/crates" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/ciphernode/events/src/e3id.rs b/crates/events/src/e3id.rs similarity index 100% rename from packages/ciphernode/events/src/e3id.rs rename to crates/events/src/e3id.rs diff --git a/packages/ciphernode/events/src/enclave_event/ciphernode_added.rs b/crates/events/src/enclave_event/ciphernode_added.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/ciphernode_added.rs rename to crates/events/src/enclave_event/ciphernode_added.rs diff --git a/packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs b/crates/events/src/enclave_event/ciphernode_removed.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/ciphernode_removed.rs rename to crates/events/src/enclave_event/ciphernode_removed.rs diff --git a/packages/ciphernode/events/src/enclave_event/ciphernode_selected.rs b/crates/events/src/enclave_event/ciphernode_selected.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/ciphernode_selected.rs rename to crates/events/src/enclave_event/ciphernode_selected.rs diff --git a/packages/ciphernode/events/src/enclave_event/ciphertext_output_published.rs b/crates/events/src/enclave_event/ciphertext_output_published.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/ciphertext_output_published.rs rename to crates/events/src/enclave_event/ciphertext_output_published.rs diff --git a/packages/ciphernode/events/src/enclave_event/decryptionshare_created.rs b/crates/events/src/enclave_event/decryptionshare_created.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/decryptionshare_created.rs rename to crates/events/src/enclave_event/decryptionshare_created.rs diff --git a/packages/ciphernode/events/src/enclave_event/die.rs b/crates/events/src/enclave_event/die.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/die.rs rename to crates/events/src/enclave_event/die.rs diff --git a/packages/ciphernode/events/src/enclave_event/e3_request_complete.rs b/crates/events/src/enclave_event/e3_request_complete.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/e3_request_complete.rs rename to crates/events/src/enclave_event/e3_request_complete.rs diff --git a/packages/ciphernode/events/src/enclave_event/e3_requested.rs b/crates/events/src/enclave_event/e3_requested.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/e3_requested.rs rename to crates/events/src/enclave_event/e3_requested.rs diff --git a/packages/ciphernode/events/src/enclave_event/enclave_error.rs b/crates/events/src/enclave_event/enclave_error.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/enclave_error.rs rename to crates/events/src/enclave_event/enclave_error.rs diff --git a/packages/ciphernode/events/src/enclave_event/keyshare_created.rs b/crates/events/src/enclave_event/keyshare_created.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/keyshare_created.rs rename to crates/events/src/enclave_event/keyshare_created.rs diff --git a/packages/ciphernode/events/src/enclave_event/mod.rs b/crates/events/src/enclave_event/mod.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/mod.rs rename to crates/events/src/enclave_event/mod.rs diff --git a/packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs b/crates/events/src/enclave_event/plaintext_aggregated.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/plaintext_aggregated.rs rename to crates/events/src/enclave_event/plaintext_aggregated.rs diff --git a/packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs b/crates/events/src/enclave_event/publickey_aggregated.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/publickey_aggregated.rs rename to crates/events/src/enclave_event/publickey_aggregated.rs diff --git a/packages/ciphernode/events/src/enclave_event/shutdown.rs b/crates/events/src/enclave_event/shutdown.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/shutdown.rs rename to crates/events/src/enclave_event/shutdown.rs diff --git a/packages/ciphernode/events/src/enclave_event/test_event.rs b/crates/events/src/enclave_event/test_event.rs similarity index 100% rename from packages/ciphernode/events/src/enclave_event/test_event.rs rename to crates/events/src/enclave_event/test_event.rs diff --git a/packages/ciphernode/events/src/event_id.rs b/crates/events/src/event_id.rs similarity index 100% rename from packages/ciphernode/events/src/event_id.rs rename to crates/events/src/event_id.rs diff --git a/packages/ciphernode/events/src/eventbus.rs b/crates/events/src/eventbus.rs similarity index 100% rename from packages/ciphernode/events/src/eventbus.rs rename to crates/events/src/eventbus.rs diff --git a/packages/ciphernode/events/src/eventbus_factory.rs b/crates/events/src/eventbus_factory.rs similarity index 100% rename from packages/ciphernode/events/src/eventbus_factory.rs rename to crates/events/src/eventbus_factory.rs diff --git a/packages/ciphernode/events/src/lib.rs b/crates/events/src/lib.rs similarity index 100% rename from packages/ciphernode/events/src/lib.rs rename to crates/events/src/lib.rs diff --git a/packages/ciphernode/events/src/ordered_set.rs b/crates/events/src/ordered_set.rs similarity index 100% rename from packages/ciphernode/events/src/ordered_set.rs rename to crates/events/src/ordered_set.rs diff --git a/packages/ciphernode/events/src/seed.rs b/crates/events/src/seed.rs similarity index 100% rename from packages/ciphernode/events/src/seed.rs rename to crates/events/src/seed.rs diff --git a/packages/ciphernode/evm-helpers/Cargo.toml b/crates/evm-helpers/Cargo.toml similarity index 100% rename from packages/ciphernode/evm-helpers/Cargo.toml rename to crates/evm-helpers/Cargo.toml diff --git a/packages/ciphernode/evm-helpers/scripts/build_fixtures.sh b/crates/evm-helpers/scripts/build_fixtures.sh similarity index 100% rename from packages/ciphernode/evm-helpers/scripts/build_fixtures.sh rename to crates/evm-helpers/scripts/build_fixtures.sh diff --git a/packages/ciphernode/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs similarity index 100% rename from packages/ciphernode/evm-helpers/src/contracts.rs rename to crates/evm-helpers/src/contracts.rs diff --git a/packages/ciphernode/evm-helpers/src/events.rs b/crates/evm-helpers/src/events.rs similarity index 100% rename from packages/ciphernode/evm-helpers/src/events.rs rename to crates/evm-helpers/src/events.rs diff --git a/packages/ciphernode/evm-helpers/src/lib.rs b/crates/evm-helpers/src/lib.rs similarity index 100% rename from packages/ciphernode/evm-helpers/src/lib.rs rename to crates/evm-helpers/src/lib.rs diff --git a/packages/ciphernode/evm-helpers/src/listener.rs b/crates/evm-helpers/src/listener.rs similarity index 100% rename from packages/ciphernode/evm-helpers/src/listener.rs rename to crates/evm-helpers/src/listener.rs diff --git a/packages/ciphernode/evm-helpers/tests/fixtures/.gitignore b/crates/evm-helpers/tests/fixtures/.gitignore similarity index 100% rename from packages/ciphernode/evm-helpers/tests/fixtures/.gitignore rename to crates/evm-helpers/tests/fixtures/.gitignore diff --git a/packages/ciphernode/evm-helpers/tests/fixtures/emit_logs.sol b/crates/evm-helpers/tests/fixtures/emit_logs.sol similarity index 100% rename from packages/ciphernode/evm-helpers/tests/fixtures/emit_logs.sol rename to crates/evm-helpers/tests/fixtures/emit_logs.sol diff --git a/packages/ciphernode/evm-helpers/tests/fixtures/fake_enclave.sol b/crates/evm-helpers/tests/fixtures/fake_enclave.sol similarity index 100% rename from packages/ciphernode/evm-helpers/tests/fixtures/fake_enclave.sol rename to crates/evm-helpers/tests/fixtures/fake_enclave.sol diff --git a/packages/ciphernode/evm-helpers/tests/helpers.rs b/crates/evm-helpers/tests/helpers.rs similarity index 100% rename from packages/ciphernode/evm-helpers/tests/helpers.rs rename to crates/evm-helpers/tests/helpers.rs diff --git a/packages/ciphernode/evm-helpers/tests/listener.rs b/crates/evm-helpers/tests/listener.rs similarity index 100% rename from packages/ciphernode/evm-helpers/tests/listener.rs rename to crates/evm-helpers/tests/listener.rs diff --git a/packages/ciphernode/evm/Cargo.toml b/crates/evm/Cargo.toml similarity index 100% rename from packages/ciphernode/evm/Cargo.toml rename to crates/evm/Cargo.toml diff --git a/packages/ciphernode/evm/scripts/build_fixtures.sh b/crates/evm/scripts/build_fixtures.sh similarity index 100% rename from packages/ciphernode/evm/scripts/build_fixtures.sh rename to crates/evm/scripts/build_fixtures.sh diff --git a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs b/crates/evm/src/ciphernode_registry_sol.rs similarity index 97% rename from packages/ciphernode/evm/src/ciphernode_registry_sol.rs rename to crates/evm/src/ciphernode_registry_sol.rs index 826412c5ee..e59b9015ca 100644 --- a/packages/ciphernode/evm/src/ciphernode_registry_sol.rs +++ b/crates/evm/src/ciphernode_registry_sol.rs @@ -19,7 +19,7 @@ sol!( #[sol(rpc)] #[derive(Debug)] ICiphernodeRegistry, - "../../evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json" + "../../packages/evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json" ); struct CiphernodeAddedWithChainId(pub ICiphernodeRegistry::CiphernodeAdded, pub u64); diff --git a/packages/ciphernode/evm/src/enclave_sol.rs b/crates/evm/src/enclave_sol.rs similarity index 100% rename from packages/ciphernode/evm/src/enclave_sol.rs rename to crates/evm/src/enclave_sol.rs diff --git a/packages/ciphernode/evm/src/enclave_sol_reader.rs b/crates/evm/src/enclave_sol_reader.rs similarity index 97% rename from packages/ciphernode/evm/src/enclave_sol_reader.rs rename to crates/evm/src/enclave_sol_reader.rs index d332310745..933eb07fc2 100644 --- a/packages/ciphernode/evm/src/enclave_sol_reader.rs +++ b/crates/evm/src/enclave_sol_reader.rs @@ -13,7 +13,7 @@ use tracing::{error, info, trace}; sol!( #[sol(rpc)] IEnclave, - "../../evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json" + "../../packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json" ); struct E3RequestedWithChainId(pub IEnclave::E3Requested, pub u64); diff --git a/packages/ciphernode/evm/src/enclave_sol_writer.rs b/crates/evm/src/enclave_sol_writer.rs similarity index 97% rename from packages/ciphernode/evm/src/enclave_sol_writer.rs rename to crates/evm/src/enclave_sol_writer.rs index f7e3918849..e67bbd727c 100644 --- a/packages/ciphernode/evm/src/enclave_sol_writer.rs +++ b/crates/evm/src/enclave_sol_writer.rs @@ -15,7 +15,7 @@ use tracing::info; sol!( #[sol(rpc)] IEnclave, - "../../evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json" + "../../packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json" ); /// Consumes events from the event bus and calls EVM methods on the Enclave.sol contract diff --git a/packages/ciphernode/evm/src/event_reader.rs b/crates/evm/src/event_reader.rs similarity index 100% rename from packages/ciphernode/evm/src/event_reader.rs rename to crates/evm/src/event_reader.rs diff --git a/packages/ciphernode/evm/src/helpers.rs b/crates/evm/src/helpers.rs similarity index 100% rename from packages/ciphernode/evm/src/helpers.rs rename to crates/evm/src/helpers.rs diff --git a/packages/ciphernode/evm/src/lib.rs b/crates/evm/src/lib.rs similarity index 100% rename from packages/ciphernode/evm/src/lib.rs rename to crates/evm/src/lib.rs diff --git a/packages/ciphernode/evm/src/registry_filter_sol.rs b/crates/evm/src/registry_filter_sol.rs similarity index 97% rename from packages/ciphernode/evm/src/registry_filter_sol.rs rename to crates/evm/src/registry_filter_sol.rs index b9a0df8eff..345c2eacd3 100644 --- a/packages/ciphernode/evm/src/registry_filter_sol.rs +++ b/crates/evm/src/registry_filter_sol.rs @@ -15,7 +15,7 @@ use tracing::info; sol!( #[sol(rpc)] NaiveRegistryFilter, - "../../evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json" + "../../packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json" ); pub struct RegistryFilterSolWriter { diff --git a/packages/ciphernode/evm/src/repo.rs b/crates/evm/src/repo.rs similarity index 100% rename from packages/ciphernode/evm/src/repo.rs rename to crates/evm/src/repo.rs diff --git a/packages/ciphernode/evm/tests/evm_reader.rs b/crates/evm/tests/evm_reader.rs similarity index 100% rename from packages/ciphernode/evm/tests/evm_reader.rs rename to crates/evm/tests/evm_reader.rs diff --git a/packages/ciphernode/evm/tests/fixtures/.gitignore b/crates/evm/tests/fixtures/.gitignore similarity index 100% rename from packages/ciphernode/evm/tests/fixtures/.gitignore rename to crates/evm/tests/fixtures/.gitignore diff --git a/packages/ciphernode/evm/tests/fixtures/emit_logs.sol b/crates/evm/tests/fixtures/emit_logs.sol similarity index 100% rename from packages/ciphernode/evm/tests/fixtures/emit_logs.sol rename to crates/evm/tests/fixtures/emit_logs.sol diff --git a/packages/ciphernode/fhe/Cargo.toml b/crates/fhe/Cargo.toml similarity index 100% rename from packages/ciphernode/fhe/Cargo.toml rename to crates/fhe/Cargo.toml diff --git a/packages/ciphernode/fhe/src/ext.rs b/crates/fhe/src/ext.rs similarity index 100% rename from packages/ciphernode/fhe/src/ext.rs rename to crates/fhe/src/ext.rs diff --git a/packages/ciphernode/fhe/src/fhe.rs b/crates/fhe/src/fhe.rs similarity index 100% rename from packages/ciphernode/fhe/src/fhe.rs rename to crates/fhe/src/fhe.rs diff --git a/packages/ciphernode/fhe/src/lib.rs b/crates/fhe/src/lib.rs similarity index 100% rename from packages/ciphernode/fhe/src/lib.rs rename to crates/fhe/src/lib.rs diff --git a/packages/ciphernode/fhe/src/repo.rs b/crates/fhe/src/repo.rs similarity index 100% rename from packages/ciphernode/fhe/src/repo.rs rename to crates/fhe/src/repo.rs diff --git a/packages/ciphernode/fhe/src/utils.rs b/crates/fhe/src/utils.rs similarity index 100% rename from packages/ciphernode/fhe/src/utils.rs rename to crates/fhe/src/utils.rs diff --git a/packages/ciphernode/indexer/Cargo.toml b/crates/indexer/Cargo.toml similarity index 100% rename from packages/ciphernode/indexer/Cargo.toml rename to crates/indexer/Cargo.toml diff --git a/packages/ciphernode/indexer/scripts/build_fixtures.sh b/crates/indexer/scripts/build_fixtures.sh similarity index 100% rename from packages/ciphernode/indexer/scripts/build_fixtures.sh rename to crates/indexer/scripts/build_fixtures.sh diff --git a/packages/ciphernode/indexer/src/indexer.rs b/crates/indexer/src/indexer.rs similarity index 100% rename from packages/ciphernode/indexer/src/indexer.rs rename to crates/indexer/src/indexer.rs diff --git a/packages/ciphernode/indexer/src/lib.rs b/crates/indexer/src/lib.rs similarity index 100% rename from packages/ciphernode/indexer/src/lib.rs rename to crates/indexer/src/lib.rs diff --git a/packages/ciphernode/indexer/src/models.rs b/crates/indexer/src/models.rs similarity index 100% rename from packages/ciphernode/indexer/src/models.rs rename to crates/indexer/src/models.rs diff --git a/packages/ciphernode/indexer/src/repo.rs b/crates/indexer/src/repo.rs similarity index 100% rename from packages/ciphernode/indexer/src/repo.rs rename to crates/indexer/src/repo.rs diff --git a/packages/ciphernode/indexer/src/traits.rs b/crates/indexer/src/traits.rs similarity index 100% rename from packages/ciphernode/indexer/src/traits.rs rename to crates/indexer/src/traits.rs diff --git a/packages/ciphernode/indexer/tests/fixtures/.gitignore b/crates/indexer/tests/fixtures/.gitignore similarity index 100% rename from packages/ciphernode/indexer/tests/fixtures/.gitignore rename to crates/indexer/tests/fixtures/.gitignore diff --git a/packages/ciphernode/indexer/tests/fixtures/emit_logs.sol b/crates/indexer/tests/fixtures/emit_logs.sol similarity index 100% rename from packages/ciphernode/indexer/tests/fixtures/emit_logs.sol rename to crates/indexer/tests/fixtures/emit_logs.sol diff --git a/packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol b/crates/indexer/tests/fixtures/fake_enclave.sol similarity index 100% rename from packages/ciphernode/indexer/tests/fixtures/fake_enclave.sol rename to crates/indexer/tests/fixtures/fake_enclave.sol diff --git a/packages/ciphernode/indexer/tests/helpers.rs b/crates/indexer/tests/helpers.rs similarity index 100% rename from packages/ciphernode/indexer/tests/helpers.rs rename to crates/indexer/tests/helpers.rs diff --git a/packages/ciphernode/indexer/tests/indexer.rs b/crates/indexer/tests/indexer.rs similarity index 100% rename from packages/ciphernode/indexer/tests/indexer.rs rename to crates/indexer/tests/indexer.rs diff --git a/packages/ciphernode/init/Cargo.toml b/crates/init/Cargo.toml similarity index 100% rename from packages/ciphernode/init/Cargo.toml rename to crates/init/Cargo.toml diff --git a/packages/ciphernode/init/src/lib.rs b/crates/init/src/lib.rs similarity index 100% rename from packages/ciphernode/init/src/lib.rs rename to crates/init/src/lib.rs diff --git a/packages/ciphernode/keyshare/Cargo.toml b/crates/keyshare/Cargo.toml similarity index 100% rename from packages/ciphernode/keyshare/Cargo.toml rename to crates/keyshare/Cargo.toml diff --git a/packages/ciphernode/keyshare/src/ext.rs b/crates/keyshare/src/ext.rs similarity index 100% rename from packages/ciphernode/keyshare/src/ext.rs rename to crates/keyshare/src/ext.rs diff --git a/packages/ciphernode/keyshare/src/keyshare.rs b/crates/keyshare/src/keyshare.rs similarity index 100% rename from packages/ciphernode/keyshare/src/keyshare.rs rename to crates/keyshare/src/keyshare.rs diff --git a/packages/ciphernode/keyshare/src/lib.rs b/crates/keyshare/src/lib.rs similarity index 100% rename from packages/ciphernode/keyshare/src/lib.rs rename to crates/keyshare/src/lib.rs diff --git a/packages/ciphernode/keyshare/src/repo.rs b/crates/keyshare/src/repo.rs similarity index 100% rename from packages/ciphernode/keyshare/src/repo.rs rename to crates/keyshare/src/repo.rs diff --git a/packages/ciphernode/logger/Cargo.toml b/crates/logger/Cargo.toml similarity index 100% rename from packages/ciphernode/logger/Cargo.toml rename to crates/logger/Cargo.toml diff --git a/packages/ciphernode/logger/src/lib.rs b/crates/logger/src/lib.rs similarity index 100% rename from packages/ciphernode/logger/src/lib.rs rename to crates/logger/src/lib.rs diff --git a/packages/ciphernode/logger/src/logger.rs b/crates/logger/src/logger.rs similarity index 100% rename from packages/ciphernode/logger/src/logger.rs rename to crates/logger/src/logger.rs diff --git a/packages/ciphernode/net/Cargo.toml b/crates/net/Cargo.toml similarity index 90% rename from packages/ciphernode/net/Cargo.toml rename to crates/net/Cargo.toml index 4193cdead7..2b977984cc 100644 --- a/packages/ciphernode/net/Cargo.toml +++ b/crates/net/Cargo.toml @@ -3,7 +3,7 @@ name = "e3-net" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/ciphernode/net/src/bin/p2p_test.rs b/crates/net/src/bin/p2p_test.rs similarity index 100% rename from packages/ciphernode/net/src/bin/p2p_test.rs rename to crates/net/src/bin/p2p_test.rs diff --git a/packages/ciphernode/net/src/correlation_id.rs b/crates/net/src/correlation_id.rs similarity index 100% rename from packages/ciphernode/net/src/correlation_id.rs rename to crates/net/src/correlation_id.rs diff --git a/packages/ciphernode/net/src/dialer.rs b/crates/net/src/dialer.rs similarity index 100% rename from packages/ciphernode/net/src/dialer.rs rename to crates/net/src/dialer.rs diff --git a/packages/ciphernode/net/src/events.rs b/crates/net/src/events.rs similarity index 100% rename from packages/ciphernode/net/src/events.rs rename to crates/net/src/events.rs diff --git a/packages/ciphernode/net/src/lib.rs b/crates/net/src/lib.rs similarity index 100% rename from packages/ciphernode/net/src/lib.rs rename to crates/net/src/lib.rs diff --git a/packages/ciphernode/net/src/network_manager.rs b/crates/net/src/network_manager.rs similarity index 100% rename from packages/ciphernode/net/src/network_manager.rs rename to crates/net/src/network_manager.rs diff --git a/packages/ciphernode/net/src/network_peer.rs b/crates/net/src/network_peer.rs similarity index 100% rename from packages/ciphernode/net/src/network_peer.rs rename to crates/net/src/network_peer.rs diff --git a/packages/ciphernode/net/src/repo.rs b/crates/net/src/repo.rs similarity index 100% rename from packages/ciphernode/net/src/repo.rs rename to crates/net/src/repo.rs diff --git a/packages/ciphernode/net/src/retry.rs b/crates/net/src/retry.rs similarity index 100% rename from packages/ciphernode/net/src/retry.rs rename to crates/net/src/retry.rs diff --git a/packages/ciphernode/net/tests/Dockerfile b/crates/net/tests/Dockerfile similarity index 100% rename from packages/ciphernode/net/tests/Dockerfile rename to crates/net/tests/Dockerfile diff --git a/packages/ciphernode/net/tests/docker-compose.yaml b/crates/net/tests/docker-compose.yaml similarity index 72% rename from packages/ciphernode/net/tests/docker-compose.yaml rename to crates/net/tests/docker-compose.yaml index e599898ae8..9ed9fe3e02 100644 --- a/packages/ciphernode/net/tests/docker-compose.yaml +++ b/crates/net/tests/docker-compose.yaml @@ -1,8 +1,8 @@ services: alice: build: - dockerfile: packages/ciphernode/net/tests/Dockerfile - context: ../../../.. + dockerfile: crates/net/tests/Dockerfile + context: ../../.. command: ["/app/p2p_test", "alice"] environment: QUIC_PORT: 9091 @@ -13,8 +13,8 @@ services: bob: build: - dockerfile: packages/ciphernode/net/tests/Dockerfile - context: ../../../.. + dockerfile: crates/net/tests/Dockerfile + context: ../../.. command: ["/app/p2p_test", "bob"] environment: QUIC_PORT: 9091 @@ -25,8 +25,8 @@ services: charlie: build: - dockerfile: packages/ciphernode/net/tests/Dockerfile - context: ../../../.. + dockerfile: crates/net/tests/Dockerfile + context: ../../.. command: ["/app/p2p_test", "charlie"] environment: QUIC_PORT: 9091 diff --git a/packages/ciphernode/net/tests/run.sh b/crates/net/tests/run.sh similarity index 100% rename from packages/ciphernode/net/tests/run.sh rename to crates/net/tests/run.sh diff --git a/packages/ciphernode/request/Cargo.toml b/crates/request/Cargo.toml similarity index 100% rename from packages/ciphernode/request/Cargo.toml rename to crates/request/Cargo.toml diff --git a/packages/ciphernode/request/src/context.rs b/crates/request/src/context.rs similarity index 100% rename from packages/ciphernode/request/src/context.rs rename to crates/request/src/context.rs diff --git a/packages/ciphernode/request/src/hetrogenous_map.rs b/crates/request/src/hetrogenous_map.rs similarity index 100% rename from packages/ciphernode/request/src/hetrogenous_map.rs rename to crates/request/src/hetrogenous_map.rs diff --git a/packages/ciphernode/request/src/lib.rs b/crates/request/src/lib.rs similarity index 100% rename from packages/ciphernode/request/src/lib.rs rename to crates/request/src/lib.rs diff --git a/packages/ciphernode/request/src/meta.rs b/crates/request/src/meta.rs similarity index 100% rename from packages/ciphernode/request/src/meta.rs rename to crates/request/src/meta.rs diff --git a/packages/ciphernode/request/src/repo.rs b/crates/request/src/repo.rs similarity index 100% rename from packages/ciphernode/request/src/repo.rs rename to crates/request/src/repo.rs diff --git a/packages/ciphernode/request/src/router.rs b/crates/request/src/router.rs similarity index 100% rename from packages/ciphernode/request/src/router.rs rename to crates/request/src/router.rs diff --git a/packages/ciphernode/scripts/build_fixtures.sh b/crates/scripts/build_fixtures.sh similarity index 100% rename from packages/ciphernode/scripts/build_fixtures.sh rename to crates/scripts/build_fixtures.sh diff --git a/packages/ciphernode/scripts/launch.sh b/crates/scripts/launch.sh similarity index 100% rename from packages/ciphernode/scripts/launch.sh rename to crates/scripts/launch.sh diff --git a/packages/ciphernode/scripts/lint.sh b/crates/scripts/lint.sh similarity index 100% rename from packages/ciphernode/scripts/lint.sh rename to crates/scripts/lint.sh diff --git a/packages/ciphernode/scripts/test.sh b/crates/scripts/test.sh similarity index 100% rename from packages/ciphernode/scripts/test.sh rename to crates/scripts/test.sh diff --git a/packages/ciphernode/scripts/test_encryptor.sh b/crates/scripts/test_encryptor.sh similarity index 100% rename from packages/ciphernode/scripts/test_encryptor.sh rename to crates/scripts/test_encryptor.sh diff --git a/packages/ciphernode/sdk/Cargo.toml b/crates/sdk/Cargo.toml similarity index 100% rename from packages/ciphernode/sdk/Cargo.toml rename to crates/sdk/Cargo.toml diff --git a/packages/ciphernode/sdk/src/lib.rs b/crates/sdk/src/lib.rs similarity index 100% rename from packages/ciphernode/sdk/src/lib.rs rename to crates/sdk/src/lib.rs diff --git a/packages/ciphernode/sortition/Cargo.toml b/crates/sortition/Cargo.toml similarity index 89% rename from packages/ciphernode/sortition/Cargo.toml rename to crates/sortition/Cargo.toml index 20f9a620f2..9e5a2621f4 100644 --- a/packages/ciphernode/sortition/Cargo.toml +++ b/crates/sortition/Cargo.toml @@ -3,7 +3,7 @@ name = "e3-sortition" version.workspace = true edition.workspace = true description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/packages/ciphernode" +repository = "https://github.com/gnosisguild/enclave/crates" path = "src/lib.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/ciphernode/sortition/src/ciphernode_selector.rs b/crates/sortition/src/ciphernode_selector.rs similarity index 100% rename from packages/ciphernode/sortition/src/ciphernode_selector.rs rename to crates/sortition/src/ciphernode_selector.rs diff --git a/packages/ciphernode/sortition/src/distance.rs b/crates/sortition/src/distance.rs similarity index 100% rename from packages/ciphernode/sortition/src/distance.rs rename to crates/sortition/src/distance.rs diff --git a/packages/ciphernode/sortition/src/index.rs b/crates/sortition/src/index.rs similarity index 100% rename from packages/ciphernode/sortition/src/index.rs rename to crates/sortition/src/index.rs diff --git a/packages/ciphernode/sortition/src/lib.rs b/crates/sortition/src/lib.rs similarity index 100% rename from packages/ciphernode/sortition/src/lib.rs rename to crates/sortition/src/lib.rs diff --git a/packages/ciphernode/sortition/src/repo.rs b/crates/sortition/src/repo.rs similarity index 100% rename from packages/ciphernode/sortition/src/repo.rs rename to crates/sortition/src/repo.rs diff --git a/packages/ciphernode/sortition/src/sortition.rs b/crates/sortition/src/sortition.rs similarity index 100% rename from packages/ciphernode/sortition/src/sortition.rs rename to crates/sortition/src/sortition.rs diff --git a/packages/ciphernode/test-helpers/Cargo.toml b/crates/test-helpers/Cargo.toml similarity index 100% rename from packages/ciphernode/test-helpers/Cargo.toml rename to crates/test-helpers/Cargo.toml diff --git a/packages/ciphernode/test-helpers/src/bin/fake_encrypt.rs b/crates/test-helpers/src/bin/fake_encrypt.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/bin/fake_encrypt.rs rename to crates/test-helpers/src/bin/fake_encrypt.rs diff --git a/packages/ciphernode/test-helpers/src/bin/pack_e3_params.rs b/crates/test-helpers/src/bin/pack_e3_params.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/bin/pack_e3_params.rs rename to crates/test-helpers/src/bin/pack_e3_params.rs diff --git a/packages/ciphernode/test-helpers/src/lib.rs b/crates/test-helpers/src/lib.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/lib.rs rename to crates/test-helpers/src/lib.rs diff --git a/packages/ciphernode/test-helpers/src/plaintext_writer.rs b/crates/test-helpers/src/plaintext_writer.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/plaintext_writer.rs rename to crates/test-helpers/src/plaintext_writer.rs diff --git a/packages/ciphernode/test-helpers/src/public_key_writer.rs b/crates/test-helpers/src/public_key_writer.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/public_key_writer.rs rename to crates/test-helpers/src/public_key_writer.rs diff --git a/packages/ciphernode/test-helpers/src/utils.rs b/crates/test-helpers/src/utils.rs similarity index 100% rename from packages/ciphernode/test-helpers/src/utils.rs rename to crates/test-helpers/src/utils.rs diff --git a/packages/ciphernode/tests/Cargo.toml b/crates/tests/Cargo.toml similarity index 100% rename from packages/ciphernode/tests/Cargo.toml rename to crates/tests/Cargo.toml diff --git a/packages/ciphernode/tests/src/main.rs b/crates/tests/src/main.rs similarity index 100% rename from packages/ciphernode/tests/src/main.rs rename to crates/tests/src/main.rs diff --git a/packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs b/crates/tests/tests/test_aggregation_and_decryption.rs similarity index 100% rename from packages/ciphernode/tests/tests/test_aggregation_and_decryption.rs rename to crates/tests/tests/test_aggregation_and_decryption.rs diff --git a/deploy/build.sh b/deploy/build.sh index a68aa2b229..d1abece205 100755 --- a/deploy/build.sh +++ b/deploy/build.sh @@ -9,4 +9,4 @@ time docker buildx build \ --cache-from=type=local,src=/tmp/docker-cache \ --cache-to=type=local,dest=/tmp/docker-cache \ --load \ - -t ${1:-ghcr.io/gnosisguild/ciphernode} -f ./packages/ciphernode/Dockerfile . + -t ${1:-ghcr.io/gnosisguild/ciphernode} -f ./crates/Dockerfile . diff --git a/docs/pages/compute-provider.mdx b/docs/pages/compute-provider.mdx index f1602ecca6..e2ee3c0479 100644 --- a/docs/pages/compute-provider.mdx +++ b/docs/pages/compute-provider.mdx @@ -46,7 +46,7 @@ Select a CP that suits your needs. Options include: - **Language Support**: Choose a CP that supports the programming languages you're comfortable with. Enclave provides a -[Compute Provider package](https://github.com/gnosisguild/CRISP/tree/main/packages/ciphernode/compute-provider) +[Compute Provider package](https://github.com/gnosisguild/CRISP/tree/main/crates/compute-provider) to simplify the integration, letting you focus on computation logic. More details can be found in the [Writing the Secure Process](./write-secure-program.mdx) guide. diff --git a/docs/pages/write-secure-program.mdx b/docs/pages/write-secure-program.mdx index b733234a47..34b60cc5bd 100644 --- a/docs/pages/write-secure-program.mdx +++ b/docs/pages/write-secure-program.mdx @@ -8,7 +8,7 @@ description: '' The Secure Process is the core FHE logic for your E3 Program. It runs within your selected Compute Provider's environment, ultimately producing and publishing a ciphertext output that is decrypted by your Ciphernode Committee. To facilitate this, Enclave provides a -[Compute Provider package](https://github.com/gnosisguild/enclave/tree/main/packages/ciphernode/compute-provider) +[Compute Provider package](https://github.com/gnosisguild/enclave/tree/main/crates/compute-provider) to simplify writing the Secure Process with any Compute Provider. ### Using the Compute Provider Package diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index d87cad2aab..f0e480cedc 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -37,7 +37,7 @@ serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -e3-compute-provider = { path = "../../../../packages/ciphernode/compute-provider" } +e3-compute-provider = { path = "../../../../crates/compute-provider" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/examples/CRISP/apps/program/core/Cargo.toml b/examples/CRISP/apps/program/core/Cargo.toml index d43573c2ce..29866db4db 100644 --- a/examples/CRISP/apps/program/core/Cargo.toml +++ b/examples/CRISP/apps/program/core/Cargo.toml @@ -6,5 +6,5 @@ edition = { workspace = true } [dependencies] fhe_rs = { workspace = true } fhe-traits = { workspace = true } -e3-compute-provider = { path = "../../../../../packages/ciphernode/compute-provider" } -e3-bfv-helpers = { path = "../../../../../packages/ciphernode/bfv-helpers" } +e3-compute-provider = { path = "../../../../../crates/compute-provider" } +e3-bfv-helpers = { path = "../../../../../crates/bfv-helpers" } diff --git a/examples/CRISP/apps/program/host/Cargo.toml b/examples/CRISP/apps/program/host/Cargo.toml index 0fd2a77005..eec2096415 100644 --- a/examples/CRISP/apps/program/host/Cargo.toml +++ b/examples/CRISP/apps/program/host/Cargo.toml @@ -15,7 +15,7 @@ methods = { workspace = true } risc0-ethereum-contracts = { workspace = true } risc0-zkvm = { workspace = true } tokio = { workspace = true } -e3-compute-provider = { path = "../../../../../packages/ciphernode/compute-provider" } +e3-compute-provider = { path = "../../../../../crates/compute-provider" } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.toml b/examples/CRISP/apps/program/methods/guest/Cargo.toml index 89ae4aee9c..012dd45458 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.toml +++ b/examples/CRISP/apps/program/methods/guest/Cargo.toml @@ -13,7 +13,7 @@ path = "src/bin/voting.rs" alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" risc0-zkvm = { version = "2.0.0", default-features = false, features = ['std'] } -e3-compute-provider = { path = "../../../../../../packages/ciphernode/compute-provider" } +e3-compute-provider = { path = "../../../../../../crates/compute-provider" } voting-core = { path = "../../core" } bincode = "1.3.3" anyhow = "1.0.86" diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index 3df5b524ae..08d9cc40f6 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -37,8 +37,8 @@ jwt = "0.16.0" sha2 = "0.10.8" # Local dependencies -e3-compute-provider = { path = "../../../../packages/ciphernode/compute-provider" } -e3-sdk = { path = "../../../../packages/ciphernode/sdk" } +e3-compute-provider = { path = "../../../../crates/compute-provider" } +e3-sdk = { path = "../../../../crates/sdk" } program-client = { path = "../program/client" } # CLI and user interaction diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index b24945c6b4..8f12d51c60 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -31,9 +31,9 @@ COPY examples/CRISP/apps/program/Cargo.toml examples/CRISP/apps/program/ COPY examples/CRISP/apps/program/host/Cargo.toml examples/CRISP/apps/program/host/ COPY examples/CRISP/apps/program/core/Cargo.toml examples/CRISP/apps/program/core/ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/methods/ -COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/ +COPY crates/sdk/Cargo.toml crates/sdk/ COPY Cargo.toml Cargo.lock ./ -COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/ +COPY crates/compute-provider/Cargo.toml crates/compute-provider/ WORKDIR /app/examples/CRISP/apps/server RUN cargo chef prepare --recipe-path recipe.json @@ -57,34 +57,34 @@ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/ COPY Cargo.lock ./Cargo.lock COPY Cargo.toml ./Cargo.toml -# find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" -COPY packages/ciphernode/aggregator/Cargo.toml packages/ciphernode/aggregator/Cargo.toml -COPY packages/ciphernode/bfv-helpers/Cargo.toml packages/ciphernode/bfv-helpers/Cargo.toml -COPY packages/ciphernode/cli/Cargo.toml packages/ciphernode/cli/Cargo.toml -COPY packages/ciphernode/compute-provider/Cargo.toml packages/ciphernode/compute-provider/Cargo.toml -COPY packages/ciphernode/config/Cargo.toml packages/ciphernode/config/Cargo.toml -COPY packages/ciphernode/crypto/Cargo.toml packages/ciphernode/crypto/Cargo.toml -COPY packages/ciphernode/data/Cargo.toml packages/ciphernode/data/Cargo.toml -COPY packages/ciphernode/entrypoint/Cargo.toml packages/ciphernode/entrypoint/Cargo.toml -COPY packages/ciphernode/events/Cargo.toml packages/ciphernode/events/Cargo.toml -COPY packages/ciphernode/evm/Cargo.toml packages/ciphernode/evm/Cargo.toml -COPY packages/ciphernode/evm-helpers/Cargo.toml packages/ciphernode/evm-helpers/Cargo.toml -COPY packages/ciphernode/fhe/Cargo.toml packages/ciphernode/fhe/Cargo.toml -COPY packages/ciphernode/indexer/Cargo.toml packages/ciphernode/indexer/Cargo.toml -COPY packages/ciphernode/init/Cargo.toml packages/ciphernode/init/Cargo.toml -COPY packages/ciphernode/keyshare/Cargo.toml packages/ciphernode/keyshare/Cargo.toml -COPY packages/ciphernode/logger/Cargo.toml packages/ciphernode/logger/Cargo.toml -COPY packages/ciphernode/net/Cargo.toml packages/ciphernode/net/Cargo.toml -COPY packages/ciphernode/request/Cargo.toml packages/ciphernode/request/Cargo.toml -COPY packages/ciphernode/sdk/Cargo.toml packages/ciphernode/sdk/Cargo.toml -COPY packages/ciphernode/sortition/Cargo.toml packages/ciphernode/sortition/Cargo.toml -COPY packages/ciphernode/test-helpers/Cargo.toml packages/ciphernode/test-helpers/Cargo.toml -COPY packages/ciphernode/tests/Cargo.toml packages/ciphernode/tests/Cargo.toml +# find crates/* -name "Cargo.*" -printf "COPY %p %p\n" +COPY crates/aggregator/Cargo.toml crates/aggregator/Cargo.toml +COPY crates/bfv-helpers/Cargo.toml crates/bfv-helpers/Cargo.toml +COPY crates/cli/Cargo.toml crates/cli/Cargo.toml +COPY crates/compute-provider/Cargo.toml crates/compute-provider/Cargo.toml +COPY crates/config/Cargo.toml crates/config/Cargo.toml +COPY crates/crypto/Cargo.toml crates/crypto/Cargo.toml +COPY crates/data/Cargo.toml crates/data/Cargo.toml +COPY crates/entrypoint/Cargo.toml crates/entrypoint/Cargo.toml +COPY crates/events/Cargo.toml crates/events/Cargo.toml +COPY crates/evm/Cargo.toml crates/evm/Cargo.toml +COPY crates/evm-helpers/Cargo.toml crates/evm-helpers/Cargo.toml +COPY crates/fhe/Cargo.toml crates/fhe/Cargo.toml +COPY crates/indexer/Cargo.toml crates/indexer/Cargo.toml +COPY crates/init/Cargo.toml crates/init/Cargo.toml +COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml +COPY crates/logger/Cargo.toml crates/logger/Cargo.toml +COPY crates/net/Cargo.toml crates/net/Cargo.toml +COPY crates/request/Cargo.toml crates/request/Cargo.toml +COPY crates/sdk/Cargo.toml crates/sdk/Cargo.toml +COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml +COPY crates/test-helpers/Cargo.toml crates/test-helpers/Cargo.toml +COPY crates/tests/Cargo.toml crates/tests/Cargo.toml RUN set -eux; \ find \ examples/CRISP/apps/program \ - packages/ciphernode \ + crates \ -type f -name Cargo.toml ! -path '*/target/*' -print0 \ | while IFS= read -r -d '' manifest_path; do \ crate_dir="$(dirname "$manifest_path")"; \ @@ -114,8 +114,8 @@ WORKDIR /app COPY examples/CRISP/apps/server/ examples/CRISP/apps/server/ COPY examples/CRISP/apps/program/ examples/CRISP/apps/program/ COPY Cargo.* ./ -COPY packages/ciphernode/ packages/ciphernode/ -COPY packages/ciphernode/compute-provider/ packages/ciphernode/compute-provider/ +COPY crates/ crates/ +COPY crates/compute-provider/ crates/compute-provider/ WORKDIR /app/examples/CRISP/apps/server RUN --mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index a6f087024c..9f3fbc4bec 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -e3-bfv-helpers = { path = "../../../../packages/ciphernode/bfv-helpers" } +e3-bfv-helpers = { path = "../../../../crates/bfv-helpers" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/examples/CRISP/scripts/tasks/setup.sh b/examples/CRISP/scripts/tasks/setup.sh index 9e65be128d..0ac2e08d74 100755 --- a/examples/CRISP/scripts/tasks/setup.sh +++ b/examples/CRISP/scripts/tasks/setup.sh @@ -12,7 +12,7 @@ echo "pnpm install" echo "evm" (cd /app/packages/evm && pnpm compile) echo "ciphernode" -(cd /app && cargo build -p e3-cli && cargo install --path packages/ciphernode/cli) +(cd /app && cargo build -p e3-cli && cargo install --path crates/cli) echo "program" (cd ./apps/program && cargo build --bin crisp-program) echo "server" diff --git a/package.json b/package.json index 6e0d957f43..eaa03f35f5 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "test:integration": "cd ./tests/integration && ./test.sh", "coverage": "pnpm evm:coverage", "prepare": "husky", - "enclave": "cd packages/ciphernode && ./scripts/launch.sh", + "enclave": "cd crates && ./scripts/launch.sh", "ciphernode:lint": "cargo fmt -- --check", "ciphernode:add": "cd packages/evm && pnpm ciphernode:add", "ciphernode:remove": "cd packages/evm && pnpm ciphernode:remove", - "ciphernode:test": "cd packages/ciphernode && ./scripts/test.sh", + "ciphernode:test": "cd crates && ./scripts/test.sh", "ciphernode:build": "cargo build --release", "preciphernode:build": "pnpm evm:compile", "committee:new": "cd packages/evm && pnpm committee:new", diff --git a/packages/ciphernode/Dockerfile b/packages/ciphernode/Dockerfile deleted file mode 100644 index 8bc9384827..0000000000 --- a/packages/ciphernode/Dockerfile +++ /dev/null @@ -1,99 +0,0 @@ -FROM node:22 AS evm-builder - -WORKDIR /build/packages/evm -COPY ./packages/evm ./ - -RUN npm install -g corepack -RUN corepack enable - -RUN pnpm install && pnpm compile - -# Build stage -FROM rust:1.81 AS ciphernode-builder - -# Force incremental -ENV CARGO_INCREMENTAL=1 -ENV RUSTC_FORCE_INCREMENTAL=1 -ENV CARGO_BUILD_JOBS=8 - -# Create build directory - -WORKDIR /build -COPY Cargo.lock ./Cargo.lock -COPY Cargo.toml ./Cargo.toml -COPY ./rust-toolchain.toml . - -WORKDIR /build/packages/ciphernode -COPY --from=evm-builder /build/packages/evm/artifacts ../evm/artifacts -COPY --from=evm-builder /build/packages/evm/deployments ../evm/deployments - -# find packages/ciphernode/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) packages/ciphernode/|COPY \1 ./|' -COPY packages/ciphernode/aggregator/Cargo.toml ./aggregator/Cargo.toml -COPY packages/ciphernode/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml -COPY packages/ciphernode/cli/Cargo.toml ./cli/Cargo.toml -COPY packages/ciphernode/compute-provider/Cargo.toml ./compute-provider/Cargo.toml -COPY packages/ciphernode/config/Cargo.toml ./config/Cargo.toml -COPY packages/ciphernode/crypto/Cargo.toml ./crypto/Cargo.toml -COPY packages/ciphernode/data/Cargo.toml ./data/Cargo.toml -COPY packages/ciphernode/entrypoint/Cargo.toml ./entrypoint/Cargo.toml -COPY packages/ciphernode/events/Cargo.toml ./events/Cargo.toml -COPY packages/ciphernode/evm/Cargo.toml ./evm/Cargo.toml -COPY packages/ciphernode/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml -COPY packages/ciphernode/fhe/Cargo.toml ./fhe/Cargo.toml -COPY packages/ciphernode/indexer/Cargo.toml ./indexer/Cargo.toml -COPY packages/ciphernode/init/Cargo.toml ./init/Cargo.toml -COPY packages/ciphernode/keyshare/Cargo.toml ./keyshare/Cargo.toml -COPY packages/ciphernode/logger/Cargo.toml ./logger/Cargo.toml -COPY packages/ciphernode/net/Cargo.toml ./net/Cargo.toml -COPY packages/ciphernode/request/Cargo.toml ./request/Cargo.toml -COPY packages/ciphernode/sdk/Cargo.toml ./sdk/Cargo.toml -COPY packages/ciphernode/sortition/Cargo.toml ./sortition/Cargo.toml -COPY packages/ciphernode/test-helpers/Cargo.toml ./test-helpers/Cargo.toml -COPY packages/ciphernode/tests/Cargo.toml ./tests/Cargo.toml - -COPY ./packages/ciphernode/entrypoint/build.rs ./entrypoint/build.rs - -RUN for d in ./*/ ; do \ - if [ -f "$d/Cargo.toml" ]; then \ - mkdir -p "$d/src" && \ - echo "fn main() {}" > "$d/src/main.rs"; \ - fi \ - done - -RUN cargo build --release - -COPY ./packages/ciphernode . - -RUN find . -name "*.rs" -exec touch {} + -RUN cargo build --release -p e3-cli - -# Runtime stage -FROM debian:stable-slim - -# Install runtime dependencies -RUN apt-get update && apt-get install -y --no-install-recommends iptables dnsutils iputils-ping ca-certificates jq && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -# Create non-root user -RUN useradd -m -u 1000 -s /bin/bash ciphernode - -# Create necessary directories with proper permissions -RUN mkdir -p /home/ciphernode/.config/enclave \ - /home/ciphernode/.local/share/enclave \ - /run/secrets && \ - chown -R ciphernode:ciphernode /home/ciphernode /run/secrets - -# Switch to non-root user -USER ciphernode -WORKDIR /home/ciphernode - -# Copy binary from builder -COPY --from=ciphernode-builder --chown=ciphernode:ciphernode /build/target/release/enclave /usr/local/bin/ -COPY --from=ciphernode-builder --chmod=755 --chown=ciphernode:ciphernode /build/packages/ciphernode/ciphernode-entrypoint.sh /usr/local/bin/ - -# Environment variables for configuration -ENV CONFIG_DIR=/home/ciphernode/.config/enclave -ENV DATA_DIR=/home/ciphernode/.local/share/enclave - -# Add entrypoint script -ENTRYPOINT ["ciphernode-entrypoint.sh"] diff --git a/tests/integration/lib/prebuild.sh b/tests/integration/lib/prebuild.sh index da0254551d..29c96f179d 100755 --- a/tests/integration/lib/prebuild.sh +++ b/tests/integration/lib/prebuild.sh @@ -3,7 +3,7 @@ set -eu # Exit immediately if a command exits with a non-zero status echo "" echo "PREBUILDING BINARIES..." echo "" -cd ../../packages/ciphernode && cargo build --bin fake_encrypt --bin enclave --bin pack_e3_params; +cd ../../crates && cargo build --bin fake_encrypt --bin enclave --bin pack_e3_params; echo "" echo "FINISHED PREBUILDING BINARIES" echo "" diff --git a/tests/integration/net.sh b/tests/integration/net.sh index 8b2304629e..20dba05ceb 100755 --- a/tests/integration/net.sh +++ b/tests/integration/net.sh @@ -2,4 +2,4 @@ set -eu -cd ../../packages/ciphernode/net/tests && ./run.sh +cd ../../crates/net/tests && ./run.sh From 18b7a935826e1a83885bdbf81d230f1c0f21bcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 2 Jun 2025 09:04:05 +0000 Subject: [PATCH 034/106] `enclave init` template (#462) * Merge from 389-enclave-init-3 * Lint * Update metadata * Add README * Update lockfile * Remove bad config * Update versions * Update cargo versions * Tidy up workspace versions * Add version in workspace dependencies * Fix bad merge --- Cargo.lock | 3 + Cargo.toml | 55 +-- crates/aggregator/Cargo.toml | 5 +- crates/bfv-helpers/Cargo.toml | 5 +- crates/cli/Cargo.toml | 7 +- crates/cli/README.md | 1 + crates/cli/src/cli.rs | 9 +- crates/cli/src/init.rs | 6 +- crates/compute-provider/Cargo.toml | 5 +- crates/config/Cargo.toml | 5 +- crates/crypto/Cargo.toml | 5 +- crates/data/Cargo.toml | 7 +- crates/entrypoint/Cargo.toml | 7 +- crates/events/Cargo.toml | 10 +- crates/evm-helpers/Cargo.toml | 5 +- crates/evm/Cargo.toml | 5 +- crates/fhe/Cargo.toml | 5 +- crates/indexer/Cargo.toml | 5 +- crates/init/Cargo.toml | 8 +- crates/init/src/copy.rs | 118 +++++++ crates/init/src/file_utils.rs | 37 ++ crates/init/src/git.rs | 93 +++++ crates/init/src/lib.rs | 238 ++++--------- crates/init/src/package_json.rs | 71 ++++ crates/init/src/pkgman.rs | 97 ++++++ crates/init/templates/support/app/Cargo.toml | 14 + crates/init/templates/support/app/src/main.rs | 45 +++ crates/init/templates/support/host/Cargo.toml | 24 ++ crates/init/templates/support/host/README.md | 3 + crates/init/templates/support/host/src/lib.rs | 88 +++++ crates/keyshare/Cargo.toml | 5 +- crates/logger/Cargo.toml | 5 +- crates/net/Cargo.toml | 7 +- crates/request/Cargo.toml | 5 +- crates/sdk/Cargo.toml | 5 +- crates/sortition/Cargo.toml | 8 +- crates/test-helpers/Cargo.toml | 5 +- crates/tests/Cargo.toml | 5 +- examples/basic/.gitignore | 2 + examples/basic/README.md | 43 ++- examples/basic/contracts/Lock.sol | 34 -- examples/basic/contracts/MyProgram.sol | 98 ++++++ examples/basic/deploy/enclave.ts | 3 + examples/basic/deploy/main.ts | 16 + examples/basic/hardhat.config.ts | 31 +- examples/basic/package.json | 12 + examples/basic/scripts/deploy-local.ts | 53 +++ examples/basic/scripts/interact.ts | 183 ++++++++++ examples/basic/test/Lock.ts | 127 ------- packages/evm/deploy/enclave.ts | 6 +- packages/evm/package.json | 16 +- packages/evm/tsconfig.json | 1 + pnpm-lock.yaml | 324 +++++++++++++++++- pnpm-workspace.yaml | 1 + 54 files changed, 1561 insertions(+), 420 deletions(-) create mode 100644 crates/cli/README.md create mode 100644 crates/init/src/copy.rs create mode 100644 crates/init/src/file_utils.rs create mode 100644 crates/init/src/git.rs create mode 100644 crates/init/src/package_json.rs create mode 100644 crates/init/src/pkgman.rs create mode 100644 crates/init/templates/support/app/Cargo.toml create mode 100644 crates/init/templates/support/app/src/main.rs create mode 100644 crates/init/templates/support/host/Cargo.toml create mode 100644 crates/init/templates/support/host/README.md create mode 100644 crates/init/templates/support/host/src/lib.rs delete mode 100644 examples/basic/contracts/Lock.sol create mode 100644 examples/basic/contracts/MyProgram.sol create mode 100644 examples/basic/deploy/enclave.ts create mode 100644 examples/basic/deploy/main.ts create mode 100644 examples/basic/scripts/deploy-local.ts create mode 100644 examples/basic/scripts/interact.ts delete mode 100644 examples/basic/test/Lock.ts diff --git a/Cargo.lock b/Cargo.lock index 3267ce84ad..972c78b07f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2564,7 +2564,10 @@ version = "0.1.0" dependencies = [ "anyhow", "async-recursion", + "async-trait", "git2", + "serde", + "serde_json", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 706138244c..7126fcdde0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,33 +29,46 @@ exclude = [ "examples/CRISP/apps/wasm-crypto" ] resolver = "2" +shared-version = true +pre-release-commit-message = "chore: Release {{crate_name}} v{{version}}" +pre-release-replacements = [ + {file="CHANGELOG.md", search="## \\[Unreleased\\]", replace="## [Unreleased]\n\n## [{{version}}] - {{date}}", min=1}, +] +post-release-commit-message = "chore: Bump {{crate_name}} to {{next_version}}" +sign-commit = true +sign-tag = true +push-remote = "origin" +publish = true [workspace.package] version = "0.1.0" edition = "2021" +license = "LGPL-3.0-only" +description = "E3 — Encrypted Execution Environments" +repository = "https://github.com/gnosisguild/enclave" [workspace.dependencies] -e3-aggregator = { path = "./crates/aggregator" } -e3-bfv-helpers = { path = "./crates/bfv-helpers" } -e3-config = { path = "./crates/config" } -e3-crypto = { path = "./crates/crypto" } -e3-data = { path = "./crates/data" } -e3-request = { path = "./crates/request" } -e3-sdk = { path = "./crates/sdk" } -e3-cli = { path = "./crates/cli" } -e3-entrypoint = { path = "./crates/entrypoint" } -e3-init = { path = "./crates/init" } -e3-events = { path = "./crates/events" } -e3-evm = { path = "./crates/evm" } -e3-evm-helpers = { path = "./crates/evm-helpers" } -e3-fhe = { path = "./crates/fhe" } -e3-indexer = { path = "./crates/indexer" } -e3-keyshare = { path = "./crates/keyshare" } -e3-logger = { path = "./crates/logger" } -e3-net = { path = "./crates/net" } -e3-sortition = { path = "./crates/sortition" } -e3-test-helpers = { path = "./crates/test-helpers" } -e3-tests = { path = "./crates/tests" } +e3-aggregator = { version = "0.1.0", path = "./crates/aggregator" } +e3-bfv-helpers = { version = "0.1.0", path = "./crates/bfv-helpers" } +e3-config = { version = "0.1.0", path = "./crates/config" } +e3-crypto = { version = "0.1.0", path = "./crates/crypto" } +e3-data = { version = "0.1.0", path = "./crates/data" } +e3-request = { version = "0.1.0", path = "./crates/request" } +e3-sdk = { version = "0.1.0", path = "./crates/sdk" } +e3-cli = { version = "0.1.0", path = "./crates/cli" } +e3-entrypoint = { version = "0.1.0", path = "./crates/entrypoint" } +e3-init = { version = "0.1.0", path = "./crates/init" } +e3-events = { version = "0.1.0", path = "./crates/events" } +e3-evm = { version = "0.1.0", path = "./crates/evm" } +e3-evm-helpers = { version = "0.1.0", path = "./crates/evm-helpers" } +e3-fhe = { version = "0.1.0", path = "./crates/fhe" } +e3-indexer = { version = "0.1.0", path = "./crates/indexer" } +e3-keyshare = { version = "0.1.0", path = "./crates/keyshare" } +e3-logger = { version = "0.1.0", path = "./crates/logger" } +e3-net = { version = "0.1.0", path = "./crates/net" } +e3-sortition = { version = "0.1.0", path = "./crates/sortition" } +e3-test-helpers = { version = "0.1.0", path = "./crates/test-helpers" } +e3-tests = { version = "0.1.0", path = "./crates/tests" } actix = "0.13.5" actix-web = "4.10.2" diff --git a/crates/aggregator/Cargo.toml b/crates/aggregator/Cargo.toml index 37217bdc0e..7c1707e58d 100644 --- a/crates/aggregator/Cargo.toml +++ b/crates/aggregator/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-aggregator" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Aggregators" +repository = "https://github.com/gnosisguild/enclave/crates/aggregator" [dependencies] actix = { workspace = true } diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index 296d1ea397..54d2ee900f 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-bfv-helpers" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave BFV Helpers" +repository = "https://github.com/gnosisguild/enclave/crates/bfv-helpers" [dependencies] alloy = { version = "0.8.3" , features = ["dyn-abi", "rlp", "serde"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 6faa20c370..1c87fcbb88 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "e3-cli" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave" +license.workspace = true +description = "E3 - Enclave CLI" +repository = "https://github.com/gnosisguild/enclave/crates/cli" [[bin]] name = "enclave" diff --git a/crates/cli/README.md b/crates/cli/README.md new file mode 100644 index 0000000000..a9e279a561 --- /dev/null +++ b/crates/cli/README.md @@ -0,0 +1 @@ +# Enclave diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index b4d82713cd..df567b9cf4 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use crate::helpers::telemetry::setup_tracing; use crate::net::NetCommands; use crate::nodes::{self, NodeCommands}; @@ -81,7 +83,7 @@ impl Cli { { // Existing init branch match self.command { - Commands::Init => init::execute().await?, + Commands::Init {path} => init::execute(path).await?, Commands::Wizard { rpc_url, eth_address, @@ -182,7 +184,10 @@ pub enum Commands { }, /// Initialize an enclave project - Init, + Init { + /// Path to the location where the project should be initialized + path: Option, + }, /// Password management commands Password { diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index da0c897235..3fd330b977 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -1,5 +1,7 @@ +use std::path::PathBuf; + use anyhow::Result; -pub async fn execute() -> Result<()> { - e3_init::execute().await +pub async fn execute(location: Option) -> Result<()> { + e3_init::execute(location).await } diff --git a/crates/compute-provider/Cargo.toml b/crates/compute-provider/Cargo.toml index 736a021b7c..63365f6791 100644 --- a/crates/compute-provider/Cargo.toml +++ b/crates/compute-provider/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-compute-provider" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +description = "E3 - Enclave Copmute Provider" +repository = "https://github.com/gnosisguild/enclave/crates/compute-provider" [dependencies] serde = { workspace = true, features = ["derive", "std"] } diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 74c6cd1cd5..82113a09ab 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-config" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Configuration" +repository = "https://github.com/gnosisguild/enclave/crates/config" [dependencies] alloy = { workspace = true } diff --git a/crates/crypto/Cargo.toml b/crates/crypto/Cargo.toml index 1a5220555d..d663b13195 100644 --- a/crates/crypto/Cargo.toml +++ b/crates/crypto/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-crypto" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Cryptography Library" +repository = "https://github.com/gnosisguild/enclave/crates/cryptography" [dependencies] aes-gcm = { workspace = true } diff --git a/crates/data/Cargo.toml b/crates/data/Cargo.toml index d7b98c2db3..766fd7eda6 100644 --- a/crates/data/Cargo.toml +++ b/crates/data/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "e3-data" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = "Data persistence for enclave" -repository = "https://github.com/gnosisguild/enclave/crates" +license.workspace = true +description = "E3 - Ciphernode Data persistence" +repository = "https://github.com/gnosisguild/enclave/crates/data" [dependencies] actix = { workspace = true } diff --git a/crates/entrypoint/Cargo.toml b/crates/entrypoint/Cargo.toml index 900502a43a..05516495c0 100644 --- a/crates/entrypoint/Cargo.toml +++ b/crates/entrypoint/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "e3-entrypoint" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave" +license.workspace = true +description = "E3 - CLI Entrypoints" +repository = "https://github.com/gnosisguild/enclave/crates/entrypoint" build = "build.rs" [dependencies] diff --git a/crates/events/Cargo.toml b/crates/events/Cargo.toml index fe2f4b9769..464501c419 100644 --- a/crates/events/Cargo.toml +++ b/crates/events/Cargo.toml @@ -1,12 +1,10 @@ [package] -# we have to name this other than core for disambiguation name = "e3-events" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/crates" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +license.workspace = true +description = "Event management for E3 Ciphernodes" +repository = "https://github.com/gnosisguild/enclave/crates/events" [dependencies] actix = { workspace = true } diff --git a/crates/evm-helpers/Cargo.toml b/crates/evm-helpers/Cargo.toml index 0540c5a23d..fc62de17f7 100644 --- a/crates/evm-helpers/Cargo.toml +++ b/crates/evm-helpers/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-evm-helpers" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave EVM Helpers" +repository = "https://github.com/gnosisguild/enclave/crates/evm-helpers" [dependencies] alloy.workspace = true diff --git a/crates/evm/Cargo.toml b/crates/evm/Cargo.toml index 0b508d879d..29eb0ecaa5 100644 --- a/crates/evm/Cargo.toml +++ b/crates/evm/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-evm" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode EVM Connectors" +repository = "https://github.com/gnosisguild/enclave/crates/evm" [dependencies] actix = { workspace = true } diff --git a/crates/fhe/Cargo.toml b/crates/fhe/Cargo.toml index 566d5254d7..10b24a6957 100644 --- a/crates/fhe/Cargo.toml +++ b/crates/fhe/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-fhe" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode FHE Actors" +repository = "https://github.com/gnosisguild/enclave/crates/fhe" [dependencies] actix = { workspace = true } diff --git a/crates/indexer/Cargo.toml b/crates/indexer/Cargo.toml index 7a00553a2d..392c3cb075 100644 --- a/crates/indexer/Cargo.toml +++ b/crates/indexer/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-indexer" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - A indexer for Enclave" +repository = "https://github.com/gnosisguild/enclave/crates/indexer" [dependencies] alloy.workspace = true diff --git a/crates/init/Cargo.toml b/crates/init/Cargo.toml index 7fad37ed02..d54176ac8b 100644 --- a/crates/init/Cargo.toml +++ b/crates/init/Cargo.toml @@ -1,10 +1,16 @@ [package] name = "e3-init" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Init Function" +repository = "https://github.com/gnosisguild/enclave/crates/init" [dependencies] anyhow.workspace = true tokio.workspace = true git2.workspace = true async-recursion.workspace = true +serde_json.workspace = true +serde.workspace = true +async-trait.workspace = true diff --git a/crates/init/src/copy.rs b/crates/init/src/copy.rs new file mode 100644 index 0000000000..0749484fe0 --- /dev/null +++ b/crates/init/src/copy.rs @@ -0,0 +1,118 @@ +use anyhow::{bail, Context, Result}; +use std::{ffi::OsStr, path::Path}; +use tokio::process::Command; + +#[derive(Debug, Clone)] +pub struct Filter { + pub glob_pattern: String, + pub search_pattern: String, + pub replacement: String, +} + +impl Filter { + pub fn new(glob_pattern: &str, search_pattern: &str, replacement: &str) -> Self { + Filter { + glob_pattern: glob_pattern.to_string(), + search_pattern: search_pattern.to_string(), + replacement: replacement.to_string(), + } + } +} + +pub async fn copy_with_filters( + src_path: P1, + dest_path: P2, + filters: &[Filter], +) -> Result<()> +where + P1: AsRef, + P2: AsRef, +{ + let src_path = src_path.as_ref(); + let dest_path = dest_path.as_ref(); + + // Create destination directory and copy contents in one shell command + let combined_command = format!( + "mkdir -p {} && cp -r {}/. {}", + dest_path.to_string_lossy(), + src_path.to_string_lossy(), + dest_path.to_string_lossy() + ); + + let output = Command::new("sh") + .arg("-c") + .arg(&combined_command) + .output() + .await + .context("Failed to execute mkdir and cp commands")?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + bail!("mkdir and cp commands failed: {}", stderr); + } + + // Then apply filters to matching files + for filter in filters { + apply_filter_to_files(dest_path.as_os_str(), filter).await?; + } + Ok(()) +} + +async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> Result<()> { + // Find files matching the glob pattern + let find_output = Command::new("find") + .arg(base_path) + .arg("-name") + .arg(&filter.glob_pattern) + .arg("-type") + .arg("f") + .output() + .await + .context("Failed to execute find command")?; + + if !find_output.status.success() { + let stderr = String::from_utf8_lossy(&find_output.stderr); + bail!("find command failed: {}", stderr); + } + + let files = String::from_utf8_lossy(&find_output.stdout); + + // Apply sed replacement to each matching file + for file_path in files.lines().filter(|line| !line.is_empty()) { + let sed_cmd = format!( + "s/{}/{}/g", + escape_sed_pattern(&filter.search_pattern), + escape_sed_replacement(&filter.replacement) + ); + let sed_output = Command::new("sed") + .arg("-i") + .arg(sed_cmd) + .arg(file_path) + .output() + .await + .context("Failed to execute sed command")?; + + if !sed_output.status.success() { + let stderr = String::from_utf8_lossy(&sed_output.stderr); + bail!("sed command failed on {}: {}", file_path, stderr); + } + } + + Ok(()) +} + +fn escape_sed_pattern(pattern: &str) -> String { + // Escape special sed characters in the search pattern + pattern + .replace('\\', r"\\") + .replace('/', r"\/") + .replace('&', r"\&") +} + +fn escape_sed_replacement(replacement: &str) -> String { + // Escape special sed characters in the replacement string + replacement + .replace('\\', r"\\") + .replace('/', r"\/") + .replace('&', r"\&") +} diff --git a/crates/init/src/file_utils.rs b/crates/init/src/file_utils.rs new file mode 100644 index 0000000000..03e8b2a14e --- /dev/null +++ b/crates/init/src/file_utils.rs @@ -0,0 +1,37 @@ +use std::path::Path; + +use anyhow::{bail, Result}; +use tokio::fs; + +pub async fn ensure_empty_folder>(path: P) -> Result<()> { + let path = path.as_ref(); + + if !path.exists() { + fs::create_dir(path).await?; + } + + if !path.is_dir() { + bail!("Path '{}' is not a directory", path.display()); + } + + let mut entries = std::fs::read_dir(path) + .map_err(|e| anyhow::anyhow!("Failed to read directory '{}': {}", path.display(), e))?; + + if entries.next().is_some() { + bail!("Directory '{}' is not empty", path.display()); + } + + Ok(()) +} + +pub async fn delete_path>(path: P) -> Result<()> { + let path = path.as_ref(); + + if path.is_dir() { + fs::remove_dir_all(path).await?; + } else { + fs::remove_file(path).await?; + } + + Ok(()) +} diff --git a/crates/init/src/git.rs b/crates/init/src/git.rs new file mode 100644 index 0000000000..5007a4c819 --- /dev/null +++ b/crates/init/src/git.rs @@ -0,0 +1,93 @@ +use std::path::Path; + +use anyhow::{Context, Result}; +use tokio::process::Command; + +pub async fn shallow_clone(git_repo: &str, branch: &str, target_folder: &str) -> Result<()> { + Command::new("git") + .args([ + "clone", + "--depth", + "1", + "--branch", + branch, + git_repo, + target_folder, + ]) + .status() + .await?; + Ok(()) +} + +pub async fn init(path: impl AsRef) -> Result<()> { + let path = path.as_ref(); + Command::new("git") + .arg("init") + .arg("-b") + .arg("main") + .current_dir(path) + .output() + .await + .with_context(|| { + format!( + "Failed to execute git init in directory: {}", + path.display() + ) + })?; + Ok(()) +} + +pub async fn add_all(path: impl AsRef) -> Result<()> { + let path = path.as_ref(); + Command::new("git") + .arg("add") + .arg(".") + .current_dir(path) + .output() + .await + .with_context(|| format!("Failed to execute git add in directory: {}", path.display()))?; + Ok(()) +} + +pub async fn commit(path: impl AsRef, message: &str) -> Result<()> { + let path = path.as_ref(); + Command::new("git") + .arg("commit") + .arg("-m") + .arg(message) + .current_dir(path) + .output() + .await + .with_context(|| { + format!( + "Failed to execute git commit in directory: {}", + path.display() + ) + })?; + Ok(()) +} + +pub async fn add_submodule( + repo_path: impl AsRef, + submodule_url: &str, + submodule_path: &str, +) -> Result<()> { + let repo_path = repo_path.as_ref(); + Command::new("git") + .arg("submodule") + .arg("add") + .arg(submodule_url) + .arg(submodule_path) + .current_dir(repo_path) + .output() + .await + .with_context(|| { + format!( + "Failed to add git submodule '{}' at '{}' in directory: {}", + submodule_url, + submodule_path, + repo_path.display() + ) + })?; + Ok(()) +} diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 244c99ea32..75197c930f 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -1,180 +1,76 @@ -use anyhow::{bail, Result}; -use async_recursion::async_recursion; -use git2::{FetchOptions, IndexAddOption, Repository, Signature}; +mod copy; +mod file_utils; +mod git; +mod package_json; +mod pkgman; + +use anyhow::Result; +use copy::Filter; +use package_json::DependencyType; +use pkgman::PkgMan; use std::env; -use std::path::Path; -use tokio::process::Command as TokioCommand; +use std::path::PathBuf; +use tokio::fs; -pub async fn execute() -> Result<()> { +// Updated execute function to include workspace dependency substitution +pub async fn execute(location: Option) -> Result<()> { let github_repo = "https://github.com/gnosisguild/enclave.git"; let template_folder = "examples/basic"; - let branch = "ry/389-enclave-init-crisp"; + let branch = "ry/389-enclave-init-3"; let temp_dir = "/tmp/enclave-basic-example"; - let cwd = env::current_dir()?; - check_empty_folder(&cwd)?; - clone_repo(github_repo, template_folder, branch, temp_dir).await?; - Pnpm::run(&["install"]).await?; - init_git_repo_if_needed(&cwd).await?; - Ok(()) -} - -pub struct Pnpm; - -impl Pnpm { - pub async fn is_available() -> bool { - TokioCommand::new("pnpm") - .arg("--version") - .output() - .await - .map(|output| output.status.success()) - .unwrap_or(false) - } - - pub async fn run(args: &[&str]) -> Result<()> { - let cwd = env::current_dir()?; - Self::run_in_dir(&cwd, args).await - } - - pub async fn run_in_dir>(dir: P, args: &[&str]) -> Result<()> { - if !Self::is_available().await { - bail!("pnpm is not installed or not available in PATH"); - } - - let status = TokioCommand::new("pnpm") - .args(args) - .current_dir(dir) - .status() - .await?; - - if status.success() { - Ok(()) - } else { - bail!("pnpm command failed with exit code: {:?}", status.code()); - } - } -} - -fn is_git_repository>(dir: P) -> bool { - Repository::open(dir.as_ref()).is_ok() -} - -async fn init_git_repo_if_needed>(dir: P) -> Result<()> { - let dir = dir.as_ref(); - - // Check if directory is already a git repository - if is_git_repository(dir) { - println!("Directory is already a git repository, skipping initialization."); - return Ok(()); - } - - println!("Initializing git repository..."); - - // Initialize new git repository - let repo = Repository::init(dir)?; - - // Get the repository index - let mut index = repo.index()?; - - // Add all files to the index - index.add_all(["*"].iter(), IndexAddOption::DEFAULT, None)?; - index.write()?; - - // Create the tree from the index - let tree_id = index.write_tree()?; - let tree = repo.find_tree(tree_id)?; - - // Create signature for the commit - let signature = Signature::now("Enclave Init", "developers@enclave.gg")?; - - // Create the initial commit - repo.commit( - Some("HEAD"), - &signature, - &signature, - "Initial commit", - &tree, - &[], - )?; - - println!("Git repository initialized with initial commit."); - Ok(()) -} - -pub fn check_empty_folder>(path: P) -> Result<()> { - let path = path.as_ref(); - - if !path.exists() { - bail!("Path '{}' does not exist", path.display()); - } - if !path.is_dir() { - bail!("Path '{}' is not a directory", path.display()); - } - - let mut entries = std::fs::read_dir(path) - .map_err(|e| anyhow::anyhow!("Failed to read directory '{}': {}", path.display(), e))?; - - if entries.next().is_some() { - bail!("Directory '{}' is not empty", path.display()); - } - - Ok(()) -} -async fn clone_repo( - github_repo: &str, - template_folder: &str, - branch: &str, - temp_dir: &str, -) -> Result<()> { - if Path::new(temp_dir).exists() { - tokio::fs::remove_dir_all(temp_dir).await?; - } - - println!("Cloning repository..."); - let mut fetch_options = FetchOptions::new(); - fetch_options.download_tags(git2::AutotagOption::None); - - let mut builder = git2::build::RepoBuilder::new(); - builder.fetch_options(fetch_options); - builder.branch(branch); - builder.clone(github_repo, Path::new(temp_dir))?; - - let source_path = Path::new(temp_dir).join(template_folder); - - if !source_path.exists() { - anyhow::bail!( - "Template folder '{}' not found in repository", - template_folder - ); - } - - // Get current working directory - let cwd = std::env::current_dir()?; - - // Copy contents using async filesystem operations - println!("Copying template contents to current directory..."); - copy_dir_contents_async(&source_path, &cwd).await?; - - // Clean up temporary directory - tokio::fs::remove_dir_all(temp_dir).await?; - - println!("Template copied successfully!"); - Ok(()) -} - -#[async_recursion] -async fn copy_dir_contents_async(src: &Path, dst: &Path) -> Result<()> { - let mut entries = tokio::fs::read_dir(src).await?; - while let Some(entry) = entries.next_entry().await? { - let src_path = entry.path(); - let dst_path = dst.join(entry.file_name()); + let cwd = match location { + Some(loc) => loc, + None => env::current_dir()?, + }; + fs::remove_dir_all(temp_dir).await?; + file_utils::ensure_empty_folder(&cwd).await?; + git::shallow_clone(github_repo, branch, temp_dir).await?; + + let version = package_json::get_version_from_package_json( + &PathBuf::from(temp_dir).join("packages/evm/package.json"), + ) + .await?; + + copy::copy_with_filters( + &PathBuf::from(temp_dir).join(template_folder), + &cwd, + &vec![ + Filter::new(".gitignore", "/deployments$", ""), + Filter::new("package.json", "workspace:\\*", &version), + ], + ) + .await?; + + copy::copy_with_filters( + &PathBuf::from(temp_dir).join("packages/ciphernode/init/templates/support"), + &cwd.join(".enclave/support"), + &vec![], + ) + .await?; + + git::init(&cwd).await?; + + git::add_submodule( + &cwd, + "https://github.com/gnosisguild/risc0-ethereum", + "lib/risc0-ethereum", + ) + .await?; + + package_json::add_package_to_json( + &cwd.join("package.json"), + "@risc0/ethereum", + "file:lib/risc0-ethereum", + DependencyType::DevDependencies, + ) + .await?; + + let npm = PkgMan::new(pkgman::PkgManKind::PNPM)?.with_cwd(&cwd); + npm.run(&["install"]).await?; + + git::add_all(&cwd).await?; + git::commit(&cwd, "Initial Commit").await?; - if src_path.is_dir() { - tokio::fs::create_dir_all(&dst_path).await?; - copy_dir_contents_async(&src_path, &dst_path).await?; - } else { - tokio::fs::copy(&src_path, &dst_path).await?; - } - } Ok(()) } diff --git a/crates/init/src/package_json.rs b/crates/init/src/package_json.rs new file mode 100644 index 0000000000..9b66f3bffc --- /dev/null +++ b/crates/init/src/package_json.rs @@ -0,0 +1,71 @@ +use std::path::PathBuf; + +use anyhow::Result; +use serde_json::{Map, Value}; +use tokio::fs; + +#[derive(Debug, Clone)] +pub enum DependencyType { + Dependencies, + DevDependencies, + PeerDependencies, +} + +impl DependencyType { + fn as_key(&self) -> &'static str { + match self { + DependencyType::Dependencies => "dependencies", + DependencyType::DevDependencies => "devDependencies", + DependencyType::PeerDependencies => "peerDependencies", + } + } +} + +pub async fn get_version_from_package_json(file_path: &PathBuf) -> Result { + let content = fs::read_to_string(file_path).await?; + let json: Value = serde_json::from_str(&content)?; + + json["version"] + .as_str() + .map(|s| s.to_string()) + .ok_or_else(|| anyhow::anyhow!("version field not found or not a string")) +} + +fn validate_dependency_type(dep_type: &str) -> Result<()> { + match dep_type { + "dependencies" | "devDependencies" | "peerDependencies" => Ok(()), + _ => Err(anyhow::anyhow!( + "Invalid dependency type '{}'. Must be one of: dependencies, devDependencies, peerDependencies", + dep_type + )), + } +} + +pub async fn add_package_to_json( + file_path: &PathBuf, + package_name: &str, + version: &str, + dep_type: DependencyType, +) -> Result<()> { + let dep_key = dep_type.as_key(); + let content = fs::read_to_string(file_path).await?; + + let mut json: Value = serde_json::from_str(&content)?; + + let obj = json + .as_object_mut() + .ok_or_else(|| anyhow::anyhow!("package.json root is not an object"))?; + + let deps = obj + .entry(dep_key) + .or_insert_with(|| Value::Object(Map::new())) + .as_object_mut() + .ok_or_else(|| anyhow::anyhow!("{} is not an object", dep_key))?; + + deps.insert(package_name.to_string(), Value::String(version.to_string())); + + let formatted_json = serde_json::to_string_pretty(&json)?; + fs::write(file_path, formatted_json).await?; + + Ok(()) +} diff --git a/crates/init/src/pkgman.rs b/crates/init/src/pkgman.rs new file mode 100644 index 0000000000..067cef7828 --- /dev/null +++ b/crates/init/src/pkgman.rs @@ -0,0 +1,97 @@ +use anyhow::{bail, Result}; +use std::{env, path::PathBuf}; +use tokio::process::Command as TokioCommand; + +#[async_trait::async_trait] +pub trait PkgStrategy { + fn cmd(&self) -> &'static str; + + async fn available(&self) -> bool { + TokioCommand::new(self.cmd()) + .arg("--version") + .output() + .await + .map(|output| output.status.success()) + .unwrap_or(false) + } + + async fn run(&self, cwd: &PathBuf, args: &[&str]) -> Result<()> { + if !self.available().await { + bail!("{} is not installed or not available in PATH", self.cmd()); + } + + let status = TokioCommand::new(self.cmd()) + .args(args) + .current_dir(cwd) + .status() + .await?; + + if status.success() { + Ok(()) + } else { + bail!( + "{} command failed with exit code: {:?}", + self.cmd(), + status.code() + ); + } + } +} + +struct Npm; + +#[async_trait::async_trait] +impl PkgStrategy for Npm { + fn cmd(&self) -> &'static str { + "npm" + } +} + +struct Pnpm; + +#[async_trait::async_trait] +impl PkgStrategy for Pnpm { + fn cmd(&self) -> &'static str { + "pnpm" + } +} + +type PkgType = dyn PkgStrategy + Send + Sync; + +pub struct PkgMan { + strategy: Box, + cwd: PathBuf, +} + +pub enum PkgManKind { + NPM, + PNPM, +} + +impl PkgMan { + pub fn new(kind: PkgManKind) -> Result { + let strategy: Box = match kind { + PkgManKind::NPM => Box::new(Npm), + PkgManKind::PNPM => Box::new(Pnpm), + // TODO: yarn + }; + + Ok(Self { + strategy, + cwd: env::current_dir()?, + }) + } + + pub fn with_cwd(mut self, cwd: impl Into) -> Self { + self.cwd = cwd.into(); + self + } + + pub async fn available(&self) -> bool { + self.strategy.available().await + } + + pub async fn run(&self, args: &[&str]) -> Result<()> { + self.strategy.run(&self.cwd, args).await + } +} diff --git a/crates/init/templates/support/app/Cargo.toml b/crates/init/templates/support/app/Cargo.toml new file mode 100644 index 0000000000..dac3386f6c --- /dev/null +++ b/crates/init/templates/support/app/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "crisp-program" +version = "0.1.0" +edition.workspace = true + +[dependencies] +actix-web.workspace = true +env_logger.workspace = true +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +compute-provider.workspace = true +voting-host.workspace = true +program-client.workspace = true diff --git a/crates/init/templates/support/app/src/main.rs b/crates/init/templates/support/app/src/main.rs new file mode 100644 index 0000000000..9dd8d7a76f --- /dev/null +++ b/crates/init/templates/support/app/src/main.rs @@ -0,0 +1,45 @@ +use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result}; +use compute_provider::FHEInputs; +use program_client::{ComputeRequest, ComputeResponse}; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +// Run compute handler +async fn run_compute(req: web::Json) -> Result { + let fhe_inputs = FHEInputs { + params: req.params.clone(), + ciphertexts: req.ciphertext_inputs.clone(), + }; + let (risc0_output, ciphertext) = + tokio::task::spawn_blocking(move || voting_host::run_compute(fhe_inputs)) + .await + .map_err(|e| { + eprintln!("Task spawn error: {:?}", e); + actix_web::error::ErrorInternalServerError("Task execution failed") + })? + .map_err(|e| { + eprintln!("Compute function error: {:?}", e); + actix_web::error::ErrorInternalServerError("Computation failed") + })?; + + let proof: Vec = risc0_output.seal.into(); + let response = ComputeResponse { ciphertext, proof }; + + Ok(HttpResponse::Ok().json(response)) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + env_logger::init(); + let bind_addr = "0.0.0.0:4001"; + let server = HttpServer::new(|| { + App::new() + .wrap(Logger::default()) + .route("/run_compute", web::post().to(run_compute)) + }) + .bind(bind_addr)?; + + println!("'crisp-program' listening on http://{}", bind_addr); + + server.run().await +} diff --git a/crates/init/templates/support/host/Cargo.toml b/crates/init/templates/support/host/Cargo.toml new file mode 100644 index 0000000000..acd102ed48 --- /dev/null +++ b/crates/init/templates/support/host/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "voting-host" +version = { workspace = true } +edition = { workspace = true } + +[dependencies] +bincode = { workspace = true } +bytemuck = { workspace = true } +serde = { workspace = true } +alloy-primitives = { workspace = true } +alloy-sol-types = { workspace = true } +anyhow = { workspace = true } +log = { workspace = true } +methods = { workspace = true } +risc0-ethereum-contracts = { workspace = true } +risc0-zkvm = { workspace = true } +tokio = { workspace = true } +compute-provider = { path = "../../../../../packages/compute_provider" } +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +fhe-util = { workspace = true } +voting-core = { workspace = true } +rand = { workspace = true } +tracing-subscriber = { workspace = true } \ No newline at end of file diff --git a/crates/init/templates/support/host/README.md b/crates/init/templates/support/host/README.md new file mode 100644 index 0000000000..7dd618f26a --- /dev/null +++ b/crates/init/templates/support/host/README.md @@ -0,0 +1,3 @@ +# Risc0 Host + +Exposes a function to run the computation found in `voting-core::fhe_processor` whilst also generating a risc0 proof assuming `risc0_dev_mode` is _not_ set. diff --git a/crates/init/templates/support/host/src/lib.rs b/crates/init/templates/support/host/src/lib.rs new file mode 100644 index 0000000000..d9e3ac38a3 --- /dev/null +++ b/crates/init/templates/support/host/src/lib.rs @@ -0,0 +1,88 @@ +use anyhow::{Error, Result}; +use bincode::serialize; +use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; +use methods::VOTING_ELF; +use risc0_ethereum_contracts::groth16; +use risc0_zkvm::{default_prover, ExecutorEnv, ProverOpts, VerifierContext}; +use serde::{Deserialize, Serialize}; +use std::time::Instant; +use voting_core::fhe_processor; + +fn encode_input(input: &[u8]) -> Result, Error> { + Ok(bytemuck::pod_collect_to_vec(&risc0_zkvm::serde::to_vec( + input, + )?)) +} + +pub struct Risc0Provider; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Risc0Output { + pub result: ComputeResult, + pub bytes: Vec, + pub seal: Vec, +} + +impl ComputeProvider for Risc0Provider { + type Output = Risc0Output; + + fn prove(&self, input: &ComputeInput) -> Self::Output { + let encoded_input = encode_input(&serialize(input).unwrap()).unwrap(); + let env = ExecutorEnv::builder() + .write_slice(&encoded_input) + .build() + .unwrap(); + + let receipt = default_prover() + .prove_with_ctx( + env, + &VerifierContext::default(), + VOTING_ELF, + &ProverOpts::groth16(), + ) + .unwrap() + .receipt; + + let decoded_journal = receipt.journal.decode().unwrap(); + + let seal = if !std::env::var("RISC0_DEV_MODE") + .unwrap_or_default() + .is_empty() + { + vec![] + } else { + groth16::encode(receipt.inner.groth16().unwrap().seal.clone()).unwrap() + }; + + Risc0Output { + result: decoded_journal, + bytes: receipt.journal.bytes.clone(), + seal, + } + } +} + +pub fn run_compute(params: FHEInputs) -> Result<(Risc0Output, Vec)> { + let risc0_provider = Risc0Provider; + + let mut provider = ComputeManager::new(risc0_provider, params, fhe_processor, false, None); + + // Start timer + let start_time = Instant::now(); + + let output = provider.start(); + + // Capture end time and calculate the duration + let elapsed_time = start_time.elapsed(); + + // Convert the elapsed time to minutes and seconds + let minutes = elapsed_time.as_secs() / 60; + let seconds = elapsed_time.as_secs() % 60; + + println!( + "Prove function execution time: {} minutes and {} seconds", + minutes, seconds + ); + + Ok(output) +} diff --git a/crates/keyshare/Cargo.toml b/crates/keyshare/Cargo.toml index c992250a10..b283a085b6 100644 --- a/crates/keyshare/Cargo.toml +++ b/crates/keyshare/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-keyshare" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Keyshare Actors" +repository = "https://github.com/gnosisguild/enclave/crates/keyshare" [dependencies] actix = { workspace = true } diff --git a/crates/logger/Cargo.toml b/crates/logger/Cargo.toml index 91ea1a0bff..aea3f52604 100644 --- a/crates/logger/Cargo.toml +++ b/crates/logger/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-logger" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Logger" +repository = "https://github.com/gnosisguild/enclave/crates/logger" [dependencies] e3-events = { workspace = true } diff --git a/crates/net/Cargo.toml b/crates/net/Cargo.toml index 2b977984cc..d319f64c4c 100644 --- a/crates/net/Cargo.toml +++ b/crates/net/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "e3-net" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave" +license.workspace = true +description = "E3 - Enclave Ciphernode Networking Components" +repository = "https://github.com/gnosisguild/enclave/crates/net" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/request/Cargo.toml b/crates/request/Cargo.toml index 8cc8ab14eb..1a82c49bb5 100644 --- a/crates/request/Cargo.toml +++ b/crates/request/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-request" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode E3Request Handling Components" +repository = "https://github.com/gnosisguild/enclave/crates/request" [dependencies] actix = { workspace = true } diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index 289d7ffd70..6d4b0ec04e 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-sdk" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave SDK" +repository = "https://github.com/gnosisguild/enclave/crates/sdk" [dependencies] e3-evm-helpers.workspace = true diff --git a/crates/sortition/Cargo.toml b/crates/sortition/Cargo.toml index 9e5a2621f4..8283582123 100644 --- a/crates/sortition/Cargo.toml +++ b/crates/sortition/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "e3-sortition" -version.workspace = true +version = "0.1.0" edition.workspace = true -description = ": coordinates the encryption and decryption of enclave computations" -repository = "https://github.com/gnosisguild/enclave/crates" -path = "src/lib.rs" +license.workspace = true +description = "E3 - Enclave Ciphernode Sortition Components" +repository = "https://github.com/gnosisguild/enclave/crates/sortition" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/test-helpers/Cargo.toml b/crates/test-helpers/Cargo.toml index b616855313..590118d3ef 100644 --- a/crates/test-helpers/Cargo.toml +++ b/crates/test-helpers/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-test-helpers" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Test Helpers" +repository = "https://github.com/gnosisguild/enclave/crates/test-helpers" [dependencies] actix = { workspace = true } diff --git a/crates/tests/Cargo.toml b/crates/tests/Cargo.toml index db3cfa349d..c5cba634e1 100644 --- a/crates/tests/Cargo.toml +++ b/crates/tests/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-tests" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Enclave Ciphernode Tests" +repository = "https://github.com/gnosisguild/enclave/crates/tests" [dependencies] e3-net = { workspace = true } diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore index e8c12ff4fe..c964be9fe8 100644 --- a/examples/basic/.gitignore +++ b/examples/basic/.gitignore @@ -13,5 +13,7 @@ node_modules /coverage /coverage.json +/deployments + # Hardhat Ignition default folder for deployments against a local node ignition/deployments/chain-31337 diff --git a/examples/basic/README.md b/examples/basic/README.md index 17f8ed190d..3220a5bd17 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -1,13 +1,38 @@ -# Sample Hardhat Project +# Enclave Protocol Template Setup -This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a Hardhat Ignition module that deploys that contract. +This template allows you to deploy and interact with the Enclave protocol locally without copying the core contracts. -Try running some of the following tasks: +## Quick Start -```shell -npx hardhat help -npx hardhat test -REPORT_GAS=true npx hardhat test -npx hardhat node -npx hardhat ignition deploy ./ignition/modules/Lock.ts +### 1. Install Dependencies + +```bash +pnpm install +``` + +### 2. Start Local Hardhat Node + +```bash +# Terminal 1 +pnpm node +``` + +Enclave contracts should be automatically deployed. + +## Usage Commands + +### Ciphernode Management + +```bash +# Add a ciphernode +pnpm add-ciphernode 0x1234567890123456789012345678901234567890 +``` + +## Alternative: Direct Script Usage + +You can also run the scripts directly with custom parameters: + +```bash +# Add ciphernode +npx hardhat run scripts/interact.ts -- add-ciphernode 0x1234567890123456789012345678901234567890 ``` diff --git a/examples/basic/contracts/Lock.sol b/examples/basic/contracts/Lock.sol deleted file mode 100644 index 2f385f70ed..0000000000 --- a/examples/basic/contracts/Lock.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.28; - -// Uncomment this line to use console.log -// import "hardhat/console.sol"; - -contract Lock { - uint public unlockTime; - address payable public owner; - - event Withdrawal(uint amount, uint when); - - constructor(uint _unlockTime) payable { - require( - block.timestamp < _unlockTime, - "Unlock time should be in the future" - ); - - unlockTime = _unlockTime; - owner = payable(msg.sender); - } - - function withdraw() public { - // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal - // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); - - require(block.timestamp >= unlockTime, "You can't withdraw yet"); - require(msg.sender == owner, "You aren't the owner"); - - emit Withdrawal(address(this).balance, block.timestamp); - - owner.transfer(address(this).balance); - } -} diff --git a/examples/basic/contracts/MyProgram.sol b/examples/basic/contracts/MyProgram.sol new file mode 100644 index 0000000000..23abc4af33 --- /dev/null +++ b/examples/basic/contracts/MyProgram.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.27; + +import {IRiscZeroVerifier} from "@risc0/ethereum/contracts/src/IRiscZeroVerifier.sol"; +import {IE3Program} from "@gnosis-guild/enclave/contracts/interfaces/IE3Program.sol"; +import {IInputValidator} from "@gnosis-guild/enclave/contracts/interfaces/IInputValidator.sol"; +import {IEnclave} from "@gnosis-guild/enclave/contracts/interfaces/IEnclave.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +contract MyProgram is IE3Program, Ownable { + // Constants + bytes32 public constant ENCRYPTION_SCHEME_ID = keccak256("fhe.rs:BFV"); + + // State variables + IEnclave public enclave; + IRiscZeroVerifier public verifier; + bytes32 public imageId; + + // Mappings + mapping(address => bool) public authorizedContracts; + mapping(uint256 e3Id => bytes32 paramsHash) public paramsHashes; + + // Errors + error CallerNotAuthorized(); + error E3AlreadyInitialized(); + error E3DoesNotExist(); + error VerifierAddressZero(); + error AlreadyRegistered(); + + /// @notice Initialize the contract, binding it to a specified RISC Zero verifier. + /// @param _verifier The RISC Zero verifier address + /// @param _imageId The image ID for the guest program + constructor( + IRiscZeroVerifier _verifier, + bytes32 _imageId + ) Ownable(msg.sender) { + require(address(_verifier) != address(0), VerifierAddressZero()); + + verifier = _verifier; + imageId = _imageId; + } + + /// @notice Validate the E3 program parameters + /// @param e3Id The E3 program ID + /// @param e3ProgramParams The E3 program parameters + function validate( + uint256 e3Id, + uint256, + bytes calldata e3ProgramParams, + bytes calldata + ) external returns (bytes32, IInputValidator inputValidator) { + require( + authorizedContracts[msg.sender] || msg.sender == owner(), + CallerNotAuthorized() + ); + require(paramsHashes[e3Id] == bytes32(0), E3AlreadyInitialized()); + paramsHashes[e3Id] = keccak256(e3ProgramParams); + + return (ENCRYPTION_SCHEME_ID, inputValidator); + } + + /// @notice Verify the proof + /// @param e3Id The E3 program ID + /// @param ciphertextOutputHash The hash of the ciphertext output + /// @param proof The proof to verify + function verify( + uint256 e3Id, + bytes32 ciphertextOutputHash, + bytes memory proof + ) external view override returns (bool) { + require(paramsHashes[e3Id] != bytes32(0), E3DoesNotExist()); + bytes32 inputRoot = bytes32(enclave.getInputRoot(e3Id)); + bytes memory journal = new bytes(396); // (32 + 1) * 4 * 3 + + encodeLengthPrefixAndHash(journal, 0, ciphertextOutputHash); + encodeLengthPrefixAndHash(journal, 132, paramsHashes[e3Id]); + encodeLengthPrefixAndHash(journal, 264, inputRoot); + + verifier.verify(proof, imageId, sha256(journal)); + return true; + } + + /// @notice Encode length prefix and hash + /// @param journal The journal to encode into + /// @param startIndex The start index in the journal + /// @param hashVal The hash value to encode + function encodeLengthPrefixAndHash( + bytes memory journal, + uint256 startIndex, + bytes32 hashVal + ) internal pure { + journal[startIndex] = 0x20; + startIndex += 4; + for (uint256 i = 0; i < 32; i++) { + journal[startIndex + i * 4] = hashVal[i]; + } + } +} diff --git a/examples/basic/deploy/enclave.ts b/examples/basic/deploy/enclave.ts new file mode 100644 index 0000000000..44c17f31b3 --- /dev/null +++ b/examples/basic/deploy/enclave.ts @@ -0,0 +1,3 @@ +import script from "@gnosis-guild/enclave/deploy/enclave"; + +export default script; diff --git a/examples/basic/deploy/main.ts b/examples/basic/deploy/main.ts new file mode 100644 index 0000000000..862b2a6d4b --- /dev/null +++ b/examples/basic/deploy/main.ts @@ -0,0 +1,16 @@ +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { + const { deployer } = await hre.getNamedAccounts(); + const { deploy } = hre.deployments; + + const program = await deploy("MyProgram", { + from: deployer, + args: [], // verifier, imageId + log: true, + }); +}; + +export default func; +func.tags = ["main"]; diff --git a/examples/basic/hardhat.config.ts b/examples/basic/hardhat.config.ts index 0e8962a6ef..4da5b0fdb7 100644 --- a/examples/basic/hardhat.config.ts +++ b/examples/basic/hardhat.config.ts @@ -1,8 +1,35 @@ -import { HardhatUserConfig } from "hardhat/config"; import "@nomicfoundation/hardhat-toolbox"; +import "hardhat-deploy"; +import "@gnosis-guild/enclave/deploy/enclave"; +import type { HardhatUserConfig } from "hardhat/config"; const config: HardhatUserConfig = { - solidity: "0.8.28", + solidity: { + version: "0.8.27", + overrides: { + "node_modules/poseidon-solidity/PoseidonT3.sol": { + version: "0.7.0", + settings: { + optimizer: { + enabled: true, + runs: 2 ** 32 - 1, + }, + }, + }, + }, + }, + external: { + contracts: [ + { + artifacts: "node_modules/@gnosis-guild/enclave/artifacts", + }, + ], + }, + namedAccounts: { + deployer: { + default: 0, // Use the first account as deployer + }, + }, }; export default config; diff --git a/examples/basic/package.json b/examples/basic/package.json index e1608641f3..9aa8e8a3ae 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -1,6 +1,16 @@ { "name": "hardhat-project", + "scripts": { + "node": "hardhat node", + "deploy": "hardhat run scripts/deploy-local.ts --network localhost", + "deploy:dev": "hardhat run scripts/deploy-local.ts", + "add-ciphernode": "hardhat run scripts/interact.ts -- add-ciphernode", + "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", + "compile": "hardhat compile", + "test": "hardhat test" + }, "devDependencies": { + "@gnosis-guild/enclave": "workspace:*", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-ignition": "^0.15.0", @@ -8,6 +18,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.0", + "@openzeppelin/contracts": "5.3.0", "@typechain/ethers-v6": "^0.5.0", "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", @@ -16,6 +27,7 @@ "chai": "^4.2.0", "ethers": "^6.4.0", "hardhat": "^2.14.0", + "hardhat-deploy": "^0.12.1", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.8.0", "ts-node": ">=8.0.0", diff --git a/examples/basic/scripts/deploy-local.ts b/examples/basic/scripts/deploy-local.ts new file mode 100644 index 0000000000..8243a12069 --- /dev/null +++ b/examples/basic/scripts/deploy-local.ts @@ -0,0 +1,53 @@ +// scripts/deploy-local.ts +import { ethers } from "hardhat"; +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +// Import the deployment logic from your published package +// This assumes your package exports the deployment function +import deployEnclave from "@gnosis-guild/enclave/deploy/enclave"; + +async function main() { + console.log("🚀 Deploying Enclave protocol locally..."); + + // Get hardhat runtime environment + const hre = require("hardhat") as HardhatRuntimeEnvironment; + + // Get deployer account + const [deployer] = await ethers.getSigners(); + console.log("Deploying with account:", deployer.address); + console.log( + "Account balance:", + ethers.formatEther(await deployer.provider.getBalance(deployer.address)), + ); + + try { + // Execute the deployment + await deployEnclave(hre); + + console.log("✅ Enclave protocol deployed successfully!"); + + // Log deployed contract addresses + const enclave = await hre.deployments.get("Enclave"); + const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); + const filter = await hre.deployments.get("NaiveRegistryFilter"); + + console.log("\n📋 Deployed Contracts:"); + console.log("Enclave:", enclave.address); + console.log("CiphernodeRegistryOwnable:", registry.address); + console.log("NaiveRegistryFilter:", filter.address); + } catch (error) { + console.error("❌ Deployment failed:", error); + process.exit(1); + } +} + +// Execute the deployment +if (require.main === module) { + main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); +} diff --git a/examples/basic/scripts/interact.ts b/examples/basic/scripts/interact.ts new file mode 100644 index 0000000000..5644ecb049 --- /dev/null +++ b/examples/basic/scripts/interact.ts @@ -0,0 +1,183 @@ +// scripts/interact.ts +import { ethers } from "hardhat"; +import { LeanIMT } from "@zk-kit/lean-imt"; +import { poseidon2 } from "poseidon-lite"; + +async function main() { + const command = process.argv[2]; + const args = process.argv.slice(3); + + if (!command) { + console.log("Available commands:"); + console.log(" add-ciphernode
"); + console.log(" remove-ciphernode
"); + console.log(" get-siblings
"); + console.log(" new-committee [options]"); + process.exit(1); + } + + const hre = require("hardhat"); + + try { + switch (command) { + case "add-ciphernode": + await addCiphernode(hre, args[0]); + break; + case "remove-ciphernode": + await removeCiphernode(hre, args[0], args[1]); + break; + case "get-siblings": + await getSiblings(args[0], args[1]); + break; + case "new-committee": + await newCommittee(hre, args); + break; + default: + console.error("Unknown command:", command); + process.exit(1); + } + } catch (error) { + console.error("❌ Command failed:", error); + process.exit(1); + } +} + +async function addCiphernode(hre: any, ciphernodeAddress: string) { + if (!ciphernodeAddress) { + throw new Error("Ciphernode address is required"); + } + + console.log(`📝 Adding ciphernode: ${ciphernodeAddress}`); + + const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); + const registryContract = await ethers.getContractAt( + "CiphernodeRegistryOwnable", + registry.address, + ); + + const tx = await registryContract.addCiphernode(ciphernodeAddress); + console.log("Transaction hash:", tx.hash); + + await tx.wait(); + console.log(`✅ Ciphernode ${ciphernodeAddress} registered successfully`); +} + +async function removeCiphernode( + hre: any, + ciphernodeAddress: string, + siblingsStr: string, +) { + if (!ciphernodeAddress || !siblingsStr) { + throw new Error("Ciphernode address and siblings are required"); + } + + console.log(`🗑️ Removing ciphernode: ${ciphernodeAddress}`); + + const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); + const registryContract = await ethers.getContractAt( + "CiphernodeRegistryOwnable", + registry.address, + ); + + const siblings = siblingsStr.split(",").map((s: string) => BigInt(s.trim())); + + const tx = await registryContract.removeCiphernode( + ciphernodeAddress, + siblings, + ); + console.log("Transaction hash:", tx.hash); + + await tx.wait(); + console.log(`✅ Ciphernode ${ciphernodeAddress} removed successfully`); +} + +async function getSiblings(ciphernodeAddress: string, addressesStr: string) { + if (!ciphernodeAddress || !addressesStr) { + throw new Error("Ciphernode address and list of addresses are required"); + } + + console.log(`🔍 Getting siblings for: ${ciphernodeAddress}`); + + const hash = (a: bigint, b: bigint) => poseidon2([a, b]); + const tree = new LeanIMT(hash); + + const addresses = addressesStr.split(",").map((addr) => addr.trim()); + + for (const address of addresses) { + tree.insert(BigInt(address)); + } + + const index = tree.indexOf(BigInt(ciphernodeAddress)); + if (index === -1) { + throw new Error( + `Ciphernode ${ciphernodeAddress} not found in the provided list`, + ); + } + + const { siblings } = tree.generateProof(index); + console.log(`📋 Siblings: ${siblings.join(",")}`); +} + +async function newCommittee(hre: any, args: string[]) { + console.log("🏛️ Requesting new committee..."); + + const enclave = await hre.deployments.get("Enclave"); + const enclaveContract = await ethers.getContractAt( + "Enclave", + enclave.address, + ); + + // Default parameters (can be made configurable) + const thresholdQuorum = 2; + const thresholdTotal = 2; + const windowStart = Math.floor(Date.now() / 1000); + const windowEnd = windowStart + 86400; // 1 day + const duration = 86400; // 1 day + + // Get default addresses + const naiveRegistryFilter = await hre.deployments.get("NaiveRegistryFilter"); + + // For demo purposes, we'll need mock contracts + // In production, users would provide their own E3 program + let e3Address; + try { + const mockE3Program = await hre.deployments.get("MockE3Program"); + e3Address = mockE3Program.address; + } catch { + throw new Error( + "MockE3Program not deployed. You may need to deploy mocks first.", + ); + } + + // Enable E3 program + try { + const enableE3Tx = await enclaveContract.enableE3Program(e3Address); + await enableE3Tx.wait(); + console.log("E3 program enabled"); + } catch (e) { + console.log("E3 program already enabled or enabling failed"); + } + + // Request committee + const tx = await enclaveContract.request( + naiveRegistryFilter.address, + [thresholdQuorum, thresholdTotal], + [windowStart, windowEnd], + duration, + e3Address, + ethers.zeroPadValue("0x00", 32), // e3Params + ethers.zeroPadValue("0x00", 32), // computeParams + { value: ethers.parseEther("1.0") }, // 1 ETH + ); + + console.log("Transaction hash:", tx.hash); + await tx.wait(); + console.log("✅ Committee requested successfully"); +} + +if (require.main === module) { + main().catch((error) => { + console.error(error); + process.exit(1); + }); +} diff --git a/examples/basic/test/Lock.ts b/examples/basic/test/Lock.ts deleted file mode 100644 index 160dbfa163..0000000000 --- a/examples/basic/test/Lock.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { - time, - loadFixture, -} from "@nomicfoundation/hardhat-toolbox/network-helpers"; -import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; -import { expect } from "chai"; -import hre from "hardhat"; - -describe("Lock", function () { - // We define a fixture to reuse the same setup in every test. - // We use loadFixture to run this setup once, snapshot that state, - // and reset Hardhat Network to that snapshot in every test. - async function deployOneYearLockFixture() { - const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; - const ONE_GWEI = 1_000_000_000; - - const lockedAmount = ONE_GWEI; - const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; - - // Contracts are deployed using the first signer/account by default - const [owner, otherAccount] = await hre.ethers.getSigners(); - - const Lock = await hre.ethers.getContractFactory("Lock"); - const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); - - return { lock, unlockTime, lockedAmount, owner, otherAccount }; - } - - describe("Deployment", function () { - it("Should set the right unlockTime", async function () { - const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); - - expect(await lock.unlockTime()).to.equal(unlockTime); - }); - - it("Should set the right owner", async function () { - const { lock, owner } = await loadFixture(deployOneYearLockFixture); - - expect(await lock.owner()).to.equal(owner.address); - }); - - it("Should receive and store the funds to lock", async function () { - const { lock, lockedAmount } = await loadFixture( - deployOneYearLockFixture - ); - - expect(await hre.ethers.provider.getBalance(lock.target)).to.equal( - lockedAmount - ); - }); - - it("Should fail if the unlockTime is not in the future", async function () { - // We don't use the fixture here because we want a different deployment - const latestTime = await time.latest(); - const Lock = await hre.ethers.getContractFactory("Lock"); - await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( - "Unlock time should be in the future" - ); - }); - }); - - describe("Withdrawals", function () { - describe("Validations", function () { - it("Should revert with the right error if called too soon", async function () { - const { lock } = await loadFixture(deployOneYearLockFixture); - - await expect(lock.withdraw()).to.be.revertedWith( - "You can't withdraw yet" - ); - }); - - it("Should revert with the right error if called from another account", async function () { - const { lock, unlockTime, otherAccount } = await loadFixture( - deployOneYearLockFixture - ); - - // We can increase the time in Hardhat Network - await time.increaseTo(unlockTime); - - // We use lock.connect() to send a transaction from another account - await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( - "You aren't the owner" - ); - }); - - it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { - const { lock, unlockTime } = await loadFixture( - deployOneYearLockFixture - ); - - // Transactions are sent using the first signer by default - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()).not.to.be.reverted; - }); - }); - - describe("Events", function () { - it("Should emit an event on withdrawals", async function () { - const { lock, unlockTime, lockedAmount } = await loadFixture( - deployOneYearLockFixture - ); - - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()) - .to.emit(lock, "Withdrawal") - .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg - }); - }); - - describe("Transfers", function () { - it("Should transfer the funds to the owner", async function () { - const { lock, unlockTime, lockedAmount, owner } = await loadFixture( - deployOneYearLockFixture - ); - - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()).to.changeEtherBalances( - [owner, lock], - [lockedAmount, -lockedAmount] - ); - }); - }); - }); -}); diff --git a/packages/evm/deploy/enclave.ts b/packages/evm/deploy/enclave.ts index bcbdcc12a0..ad1e149937 100644 --- a/packages/evm/deploy/enclave.ts +++ b/packages/evm/deploy/enclave.ts @@ -85,9 +85,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { console.log(`NaiveRegistryFilter contract: `, naiveRegistryFilter.address); // set registry in enclave - const enclaveContract = await hre.ethers.getContractAt( - "Enclave", + const enclaveArtifact = await hre.deployments.getArtifact("Enclave"); + const enclaveContract = new hre.ethers.Contract( enclave.address, + enclaveArtifact.abi, + await hre.ethers.getSigner(deployer), ); const registryAddress = await enclaveContract.ciphernodeRegistry(); diff --git a/packages/evm/package.json b/packages/evm/package.json index 23861ad876..7b2a85d555 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,12 +1,17 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5", + "version": "0.0.5-test.8", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", "url": "https://github.com/gnosisguild" }, + "exports": { + "./deploy/enclave": "./dist/deploy/enclave.js", + "./contracts/*": "./contracts/*", + "./artifacts/*": "./artifacts/*" + }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.5", @@ -52,7 +57,9 @@ "typescript": "^5.3.3" }, "files": [ - "contracts" + "contracts", + "dist", + "artifacts" ], "keywords": [ "blockchain", @@ -70,7 +77,8 @@ }, "scripts": { "clean": "rimraf ./artifacts ./cache ./coverage ./types ./coverage.json && pnpm typechain", - "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", + "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile && pnpm compile:scripts", + "compile:scripts": "tsc --noEmitOnError false --noCheck", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && pnpm typechain", "deploy": "hardhat deploy --tags enclave", "deploy:mocks": "hardhat deploy --tags enclave,mocks", @@ -88,7 +96,7 @@ "test": "hardhat test", "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain", "prerelease": "pnpm clean && pnpm compile && pnpm typechain", - "release": "pnpm publish --non-interactive" + "release": "pnpm publish" }, "dependencies": { "@excubiae/contracts": "^0.4.0", diff --git a/packages/evm/tsconfig.json b/packages/evm/tsconfig.json index 734e21a248..bf2c2ef0ca 100644 --- a/packages/evm/tsconfig.json +++ b/packages/evm/tsconfig.json @@ -10,6 +10,7 @@ "module": "commonjs", "moduleResolution": "node", "noImplicitAny": true, + "outDir": "dist", "removeComments": true, "resolveJsonModule": true, "sourceMap": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a84d7f05b6..8aab62af59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -267,6 +267,78 @@ importers: specifier: ^3.3.0 version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + examples/basic: + devDependencies: + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../../packages/evm + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.0 + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.0 + version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers': + specifier: ^0.15.0 + version: 0.15.11(3c85381c0b45919662d061966161e2b7) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^5.0.0 + version: 5.0.0(248454f03b5d7796fe0b22b5b4b634ab) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.0 + version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': + specifier: 5.3.0 + version: 5.3.0 + '@typechain/ethers-v6': + specifier: ^0.5.0 + version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.20 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.10 + '@types/node': + specifier: '>=18.0.0' + version: 20.10.4 + chai: + specifier: ^4.2.0 + version: 4.5.0 + ethers: + specifier: ^6.4.0 + version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: + specifier: ^2.14.0 + version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-deploy: + specifier: ^0.12.1 + version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: + specifier: '>=8.0.0' + version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + typechain: + specifier: ^8.3.0 + version: 8.3.2(typescript@5.5.4) + typescript: + specifier: '>=4.5.0' + version: 5.5.4 + packages/evm: dependencies: '@excubiae/contracts': @@ -2327,6 +2399,9 @@ packages: '@openzeppelin/contracts@5.2.0': resolution: {integrity: sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==} + '@openzeppelin/contracts@5.3.0': + resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} + '@paulmillr/qr@0.2.1': resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' @@ -9847,7 +9922,7 @@ snapshots: '@excubiae/contracts@0.4.0': dependencies: - '@openzeppelin/contracts': 5.2.0 + '@openzeppelin/contracts': 5.3.0 '@semaphore-protocol/contracts': 4.9.2 solady: 0.1.4 @@ -10420,6 +10495,17 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@types/chai-as-promised': 7.1.8 + chai: 4.5.0 + chai-as-promised: 7.1.2(chai@4.5.0) + deep-eql: 4.1.4 + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ordinal: 1.0.3 + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10441,6 +10527,15 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.0(supports-color@5.5.0) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.0(supports-color@5.5.0) @@ -10463,6 +10558,14 @@ snapshots: hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) picocolors: 1.1.1 + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(3c85381c0b45919662d061966161e2b7)': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10470,6 +10573,22 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-ui': 0.15.11 + chalk: 4.1.2 + debug: 4.4.0(supports-color@5.5.0) + fs-extra: 10.1.0 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + json5: 2.2.3 + prompts: 2.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10486,6 +10605,11 @@ snapshots: - supports-color - utf-8-validate + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 @@ -10516,6 +10640,27 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 + '@nomicfoundation/hardhat-toolbox@5.0.0(248454f03b5d7796fe0b22b5b4b634ab)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(3c85381c0b45919662d061966161e2b7) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 20.10.4 + chai: 4.5.0 + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + '@nomicfoundation/hardhat-toolbox@5.0.0(a7f0110eca458f09074d1c2612ad945e)': dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) @@ -10536,6 +10681,21 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 + '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + cbor: 8.1.0 + debug: 4.4.0(supports-color@5.5.0) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + picocolors: 1.1.1 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color + '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 @@ -10621,6 +10781,8 @@ snapshots: '@openzeppelin/contracts@5.2.0': {} + '@openzeppelin/contracts@5.3.0': {} + '@paulmillr/qr@0.2.1': {} '@phosphor-icons/react@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -11258,6 +11420,14 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': + dependencies: + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': dependencies: ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11266,6 +11436,14 @@ snapshots: typechain: 8.3.2(typescript@5.8.2) typescript: 5.8.2 + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + fs-extra: 9.1.0 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.5.4) + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) @@ -11308,11 +11486,11 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/bn.js@5.1.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/chai-as-promised@7.1.8': dependencies: @@ -11322,7 +11500,7 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/d3-scale-chromatic@3.1.0': {} @@ -11344,7 +11522,7 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/fs-extra@11.0.4': dependencies: @@ -11354,7 +11532,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/hast@2.3.10': dependencies: @@ -11416,7 +11594,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/prettier@2.7.3': {} @@ -11443,7 +11621,7 @@ snapshots: '@types/secp256k1@4.0.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.10.4 '@types/tinycolor2@1.4.6': {} @@ -14233,6 +14411,18 @@ snapshots: - supports-color - utf-8-validate + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 @@ -14270,6 +14460,61 @@ snapshots: - utf-8-validate - zod + hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.8.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.8.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.6 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.0(supports-color@5.5.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.0) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.12 + tsort: 0.0.1 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 @@ -17221,6 +17466,29 @@ snapshots: transitivePeerDependencies: - typescript + solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + dependencies: + '@ethersproject/abi': 5.8.0 + '@solidity-parser/parser': 0.19.0 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + jsonschema: 1.5.0 + lodash: 4.17.21 + mocha: 10.8.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.7.1 + shelljs: 0.8.5 + web3-utils: 1.10.4 + solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 @@ -17647,6 +17915,10 @@ snapshots: ts-essentials@1.0.4: {} + ts-essentials@7.0.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + ts-essentials@7.0.3(typescript@5.8.2): dependencies: typescript: 5.8.2 @@ -17665,6 +17937,26 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.10.4 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.16(@swc/helpers@0.5.17) + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -17765,6 +18057,22 @@ snapshots: type-fest@1.4.0: {} + typechain@8.3.2(typescript@5.5.4): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.4.0(supports-color@5.5.0) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + typechain@8.3.2(typescript@5.8.2): dependencies: '@types/prettier': 2.7.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0a60b1c870..53e3d635ab 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - packages/evm - examples/CRISP + - examples/basic - examples/CRISP/apps/client - docs From 2ee401f759f530b14ddf6875cc055f4dffd83ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 2 Jun 2025 12:44:21 +0000 Subject: [PATCH 035/106] Add program client as a crate (#464) * Add program client package * Update workspace config * Update cargo lock * Add to dockerfiles --- Cargo.lock | 9 +++++++ Cargo.toml | 14 ++++++----- crates/Dockerfile | 1 + crates/program-client/Cargo.toml | 9 +++++++ crates/program-client/src/lib.rs | 34 +++++++++++++++++++++++++++ examples/CRISP/apps/server/Dockerfile | 1 + 6 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 crates/program-client/Cargo.toml create mode 100644 crates/program-client/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 972c78b07f..cca7c66e1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2618,6 +2618,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "e3-program-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "reqwest", + "serde", +] + [[package]] name = "e3-request" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 7126fcdde0..563200872a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,23 +1,24 @@ [workspace] members = [ "crates/aggregator", + "crates/bfv-helpers", + "crates/cli", + "crates/compute-provider", "crates/config", "crates/crypto", - "crates/compute-provider", "crates/data", - "crates/bfv-helpers", - "crates/evm-helpers", - "crates/indexer", - "crates/request", - "crates/cli", "crates/entrypoint", "crates/events", "crates/evm", + "crates/evm-helpers", "crates/fhe", + "crates/indexer", "crates/init", "crates/keyshare", "crates/logger", "crates/net", + "crates/program-client", + "crates/request", "crates/sdk", "crates/sortition", "crates/test-helpers", @@ -66,6 +67,7 @@ e3-indexer = { version = "0.1.0", path = "./crates/indexer" } e3-keyshare = { version = "0.1.0", path = "./crates/keyshare" } e3-logger = { version = "0.1.0", path = "./crates/logger" } e3-net = { version = "0.1.0", path = "./crates/net" } +e3-program-client = { version = "0.1.0", path = "./crates/program-client" } e3-sortition = { version = "0.1.0", path = "./crates/sortition" } e3-test-helpers = { version = "0.1.0", path = "./crates/test-helpers" } e3-tests = { version = "0.1.0", path = "./crates/tests" } diff --git a/crates/Dockerfile b/crates/Dockerfile index 5af7ad6739..63f5071f05 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -45,6 +45,7 @@ COPY crates/init/Cargo.toml ./init/Cargo.toml COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml COPY crates/logger/Cargo.toml ./logger/Cargo.toml COPY crates/net/Cargo.toml ./net/Cargo.toml +COPY crates/program-client/Cargo.toml ./program-client/Cargo.toml COPY crates/request/Cargo.toml ./request/Cargo.toml COPY crates/sdk/Cargo.toml ./sdk/Cargo.toml COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml diff --git a/crates/program-client/Cargo.toml b/crates/program-client/Cargo.toml new file mode 100644 index 0000000000..5154e8acee --- /dev/null +++ b/crates/program-client/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "e3-program-client" +version.workspace = true +edition.workspace = true + +[dependencies] +serde.workspace = true +reqwest.workspace = true +anyhow.workspace = true diff --git a/crates/program-client/src/lib.rs b/crates/program-client/src/lib.rs new file mode 100644 index 0000000000..c8edef8318 --- /dev/null +++ b/crates/program-client/src/lib.rs @@ -0,0 +1,34 @@ +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct ComputeRequest { + pub params: Vec, + pub ciphertext_inputs: Vec<(Vec, u64)>, +} + +#[derive(Deserialize, Serialize)] +pub struct ComputeResponse { + pub ciphertext: Vec, + pub proof: Vec, +} + +pub async fn run_compute( + params: Vec, + ciphertext_inputs: Vec<(Vec, u64)>, +) -> Result<(Vec, Vec)> { + let request = ComputeRequest { + params, + ciphertext_inputs, + }; + + let response: ComputeResponse = reqwest::Client::new() + .post("http://127.0.0.1:4001/run_compute") + .json(&request) + .send() + .await? + .json() + .await?; + + Ok((response.proof, response.ciphertext)) +} diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 8f12d51c60..04375a9118 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -75,6 +75,7 @@ COPY crates/init/Cargo.toml crates/init/Cargo.toml COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml COPY crates/logger/Cargo.toml crates/logger/Cargo.toml COPY crates/net/Cargo.toml crates/net/Cargo.toml +COPY crates/program-client/Cargo.toml crates/program-client/Cargo.toml COPY crates/request/Cargo.toml crates/request/Cargo.toml COPY crates/sdk/Cargo.toml crates/sdk/Cargo.toml COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml From b37a66b0e3c0b101cb9879da831b2c6a12b46d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 2 Jun 2025 23:00:37 +0000 Subject: [PATCH 036/106] Support cli (#465) * --wip-- [skip ci] * --wip-- [skip ci] * Extract to crate * Support builds! * Update ctrl scripts * Fix errors * Use next * setup support * draft * Tidy up scripts * Fix chmod * Update template * Change branch to hacknet * Remove test for now --- Cargo.toml | 3 +- crates/init/src/file_utils.rs | 12 +- crates/init/src/git_url.rs | 106 + crates/init/src/lib.rs | 30 +- crates/init/templates/support/host/README.md | 3 - crates/program-client/Cargo.toml | 5 +- crates/support/.dockerignore | 2 + crates/support/Cargo.lock | 6820 +++++++++++++++++ crates/support/Cargo.toml | 48 + crates/support/Dockerfile | 50 + .../templates => }/support/app/Cargo.toml | 8 +- .../templates => }/support/app/src/main.rs | 12 +- crates/support/contracts/.keep | 0 crates/support/contracts/ImageID.sol | 23 + crates/support/ctl/compile.sh | 4 + crates/support/ctl/container.sh | 17 + crates/support/ctl/run.sh | 4 + crates/support/ctl/shell.sh | 4 + .../templates => }/support/host/Cargo.toml | 8 +- crates/support/host/README.md | 3 + .../templates => }/support/host/src/lib.rs | 10 +- crates/support/methods/Cargo.toml | 18 + crates/support/methods/README.md | 31 + crates/support/methods/build.rs | 52 + crates/support/methods/guest/Cargo.lock | 4583 +++++++++++ crates/support/methods/guest/Cargo.toml | 22 + crates/support/methods/guest/README.md | 12 + .../support/methods/guest/src/bin/program.rs | 20 + crates/support/methods/src/lib.rs | 16 + crates/support/program/Cargo.toml | 10 + crates/support/program/src/lib.rs | 17 + crates/support/scripts/build.sh | 10 + crates/support/scripts/container/build.sh | 1 + crates/support/scripts/container/run.sh | 1 + crates/support/scripts/dev.sh | 12 + crates/support/tests/.keep | 0 crates/support/tests/Elf.sol | 24 + examples/basic/README.md | 44 +- examples/basic/contracts/.keep | 0 examples/basic/program/Cargo.toml | 10 + examples/basic/program/src/lib.rs | 17 + examples/basic/tests/.keep | 0 42 files changed, 12036 insertions(+), 36 deletions(-) create mode 100644 crates/init/src/git_url.rs delete mode 100644 crates/init/templates/support/host/README.md create mode 100644 crates/support/.dockerignore create mode 100644 crates/support/Cargo.lock create mode 100644 crates/support/Cargo.toml create mode 100644 crates/support/Dockerfile rename crates/{init/templates => }/support/app/Cargo.toml (60%) rename crates/{init/templates => }/support/app/src/main.rs (78%) create mode 100644 crates/support/contracts/.keep create mode 100644 crates/support/contracts/ImageID.sol create mode 100755 crates/support/ctl/compile.sh create mode 100755 crates/support/ctl/container.sh create mode 100755 crates/support/ctl/run.sh create mode 100755 crates/support/ctl/shell.sh rename crates/{init/templates => }/support/host/Cargo.toml (74%) create mode 100644 crates/support/host/README.md rename crates/{init/templates => }/support/host/src/lib.rs (92%) create mode 100644 crates/support/methods/Cargo.toml create mode 100644 crates/support/methods/README.md create mode 100644 crates/support/methods/build.rs create mode 100644 crates/support/methods/guest/Cargo.lock create mode 100644 crates/support/methods/guest/Cargo.toml create mode 100644 crates/support/methods/guest/README.md create mode 100644 crates/support/methods/guest/src/bin/program.rs create mode 100644 crates/support/methods/src/lib.rs create mode 100644 crates/support/program/Cargo.toml create mode 100644 crates/support/program/src/lib.rs create mode 100755 crates/support/scripts/build.sh create mode 100755 crates/support/scripts/container/build.sh create mode 100755 crates/support/scripts/container/run.sh create mode 100755 crates/support/scripts/dev.sh create mode 100644 crates/support/tests/.keep create mode 100644 crates/support/tests/Elf.sol create mode 100644 examples/basic/contracts/.keep create mode 100644 examples/basic/program/Cargo.toml create mode 100644 examples/basic/program/src/lib.rs create mode 100644 examples/basic/tests/.keep diff --git a/Cargo.toml b/Cargo.toml index 563200872a..c36e8b7701 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,8 @@ members = [ exclude = [ "examples/CRISP/apps/server", "examples/CRISP/apps/program", - "examples/CRISP/apps/wasm-crypto" + "examples/CRISP/apps/wasm-crypto", + "crates/support" # client needs to be able to build this independently ] resolver = "2" shared-version = true diff --git a/crates/init/src/file_utils.rs b/crates/init/src/file_utils.rs index 03e8b2a14e..e6afbfe00f 100644 --- a/crates/init/src/file_utils.rs +++ b/crates/init/src/file_utils.rs @@ -1,7 +1,7 @@ use std::path::Path; use anyhow::{bail, Result}; -use tokio::fs; +use tokio::{fs, process::Command}; pub async fn ensure_empty_folder>(path: P) -> Result<()> { let path = path.as_ref(); @@ -35,3 +35,13 @@ pub async fn delete_path>(path: P) -> Result<()> { Ok(()) } + +pub async fn chmod_recursive>(path: P, mode: &str) -> Result<()> { + Command::new("chmod") + .arg("-R") + .arg(mode) + .arg(path.as_ref()) + .status() + .await?; + Ok(()) +} diff --git a/crates/init/src/git_url.rs b/crates/init/src/git_url.rs new file mode 100644 index 0000000000..776b0d33be --- /dev/null +++ b/crates/init/src/git_url.rs @@ -0,0 +1,106 @@ +use anyhow::{anyhow, Result}; +use std::str::FromStr; + +#[derive(Debug)] +pub struct GitUrl { + pub repo_url: String, + pub host: String, + pub owner: String, + pub repo: String, + pub branch: String, +} + +impl FromStr for GitUrl { + type Err = anyhow::Error; + + fn from_str(url: &str) -> Result { + let (base, branch) = url + .split_once('#') + .map(|(b, r)| (b, r.to_string())) + .unwrap_or((url, "master".to_string())); + + let path = if base.contains("://") { + base.split("://") + .nth(1) + .ok_or_else(|| anyhow!("invalid url"))? + } else if base.starts_with("git@") { + &base[4..] + } else { + return Err(anyhow!("unsupported format")); + }; + + let (host, repo_path) = if path.contains(':') && !path.contains('/') { + path.split_once(':') + .ok_or_else(|| anyhow!("invalid ssh format"))? + } else { + path.split_once('/') + .ok_or_else(|| anyhow!("missing path"))? + }; + + let parts: Vec<&str> = repo_path.trim_end_matches(".git").split('/').collect(); + if parts.len() < 2 { + return Err(anyhow!("invalid repo path")); + } + + Ok(GitUrl { + repo_url: base.to_string(), + host: host.split('@').last().unwrap_or(host).to_string(), + owner: parts[parts.len() - 2].to_string(), + repo: parts[parts.len() - 1].to_string(), + branch, + }) + } +} + +// #[cfg(test)] +// mod tests { +// use super::*; +// +// #[test] +// fn test_parse() { +// let cases = [ +// ( +// "https://github.com/user/repo.git#main", +// "https://github.com/user/repo.git", +// "github.com", +// "user", +// "repo", +// "main", +// ), +// ( +// "git@github.com:user/repo.git", +// "git@github.com:user/repo.git", +// "github.com", +// "user", +// "repo", +// "master", +// ), +// ( +// "ssh://git@gitlab.com/group/project.git#v1.0", +// "ssh://git@gitlab.com/group/project.git", +// "gitlab.com", +// "group", +// "project", +// "v1.0", +// ), +// ]; +// +// for (url, repo_url, host, owner, repo, branch) in cases { +// let parsed: GitUrl = url.parse().unwrap(); +// assert_eq!(parsed.repo_url, repo_url); +// assert_eq!(parsed.host, host); +// assert_eq!(parsed.owner, owner); +// assert_eq!(parsed.repo, repo); +// assert_eq!(parsed.branch, branch); +// } +// +// // Test the specific example +// let u: GitUrl = "https://github.com/foo/bar#v1.2.3".parse().unwrap(); +// assert_eq!(u.repo_url, "https://github.com/foo/bar"); +// assert_eq!(u.branch, "v1.2.3"); +// +// // Test default branch +// let u: GitUrl = "https://github.com/foo/bar".parse().unwrap(); +// assert_eq!(u.branch, "master"); +// } +// } diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 75197c930f..77d8b518e6 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -1,39 +1,46 @@ mod copy; mod file_utils; mod git; +mod git_url; mod package_json; mod pkgman; use anyhow::Result; use copy::Filter; +use file_utils::chmod_recursive; +use git_url::GitUrl; use package_json::DependencyType; use pkgman::PkgMan; use std::env; use std::path::PathBuf; +use std::str::FromStr; use tokio::fs; +const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; +const TEMPLATE_FOLDER: &str = "examples/basic"; +const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; + // Updated execute function to include workspace dependency substitution pub async fn execute(location: Option) -> Result<()> { - let github_repo = "https://github.com/gnosisguild/enclave.git"; - let template_folder = "examples/basic"; - let branch = "ry/389-enclave-init-3"; - let temp_dir = "/tmp/enclave-basic-example"; + let repo = GitUrl::from_str(GIT_URL)?; let cwd = match location { Some(loc) => loc, None => env::current_dir()?, }; - fs::remove_dir_all(temp_dir).await?; + if fs::try_exists(TEMP_DIR).await? { + fs::remove_dir_all(TEMP_DIR).await?; + } file_utils::ensure_empty_folder(&cwd).await?; - git::shallow_clone(github_repo, branch, temp_dir).await?; + git::shallow_clone(&repo.repo_url, &repo.branch, TEMP_DIR).await?; let version = package_json::get_version_from_package_json( - &PathBuf::from(temp_dir).join("packages/evm/package.json"), + &PathBuf::from(TEMP_DIR).join("packages/evm/package.json"), ) .await?; copy::copy_with_filters( - &PathBuf::from(temp_dir).join(template_folder), + &PathBuf::from(TEMP_DIR).join(TEMPLATE_FOLDER), &cwd, &vec![ Filter::new(".gitignore", "/deployments$", ""), @@ -43,12 +50,15 @@ pub async fn execute(location: Option) -> Result<()> { .await?; copy::copy_with_filters( - &PathBuf::from(temp_dir).join("packages/ciphernode/init/templates/support"), - &cwd.join(".enclave/support"), + &PathBuf::from(TEMP_DIR).join("crates/support/ctl"), + &cwd.join(".enclave/support/ctl"), &vec![], ) .await?; + chmod_recursive(&cwd.join("contracts"), "777").await?; + chmod_recursive(&cwd.join("tests"), "777").await?; + git::init(&cwd).await?; git::add_submodule( diff --git a/crates/init/templates/support/host/README.md b/crates/init/templates/support/host/README.md deleted file mode 100644 index 7dd618f26a..0000000000 --- a/crates/init/templates/support/host/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Risc0 Host - -Exposes a function to run the computation found in `voting-core::fhe_processor` whilst also generating a risc0 proof assuming `risc0_dev_mode` is _not_ set. diff --git a/crates/program-client/Cargo.toml b/crates/program-client/Cargo.toml index 5154e8acee..fec5b3b4b1 100644 --- a/crates/program-client/Cargo.toml +++ b/crates/program-client/Cargo.toml @@ -1,7 +1,10 @@ [package] name = "e3-program-client" -version.workspace = true +version = "0.1.0" edition.workspace = true +license.workspace = true +description = "E3 - Program Client" +repository = "https://github.com/gnosisguild/enclave/crates/program-client" [dependencies] serde.workspace = true diff --git a/crates/support/.dockerignore b/crates/support/.dockerignore new file mode 100644 index 0000000000..49c9c69517 --- /dev/null +++ b/crates/support/.dockerignore @@ -0,0 +1,2 @@ +/contracts +/tests diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock new file mode 100644 index 0000000000..ca5cd1a56c --- /dev/null +++ b/crates/support/Cargo.lock @@ -0,0 +1,6820 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags 2.9.1", + "brotli", + "bytes", + "bytestring", + "derive_more 2.0.1", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.9.1", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "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.101", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more 2.0.1", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-core", + "alloy-eips 0.8.3", + "alloy-genesis 0.8.3", + "alloy-provider 0.8.3", + "alloy-rpc-client 0.8.3", + "alloy-serde 0.8.3", + "alloy-transport-http 0.8.3", +] + +[[package]] +name = "alloy" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-contract", + "alloy-core", + "alloy-eips 0.12.6", + "alloy-genesis 0.12.6", + "alloy-network 0.12.6", + "alloy-provider 0.12.6", + "alloy-rpc-client 0.12.6", + "alloy-rpc-types", + "alloy-serde 0.12.6", + "alloy-signer 0.12.6", + "alloy-signer-local", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-consensus" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" +dependencies = [ + "alloy-eips 0.12.6", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.12.6", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "serde", + "serde_with", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.12.6", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network 0.12.6", + "alloy-network-primitives 0.12.6", + "alloy-primitives", + "alloy-provider 0.12.6", + "alloy-rpc-types-eth 0.12.6", + "alloy-sol-types", + "alloy-transport 0.12.6", + "futures", + "futures-util", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2124" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702 0.4.2", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-eips" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702 0.5.1", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.12.6", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde 0.8.3", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-genesis" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" +dependencies = [ + "alloy-eips 0.12.6", + "alloy-primitives", + "alloy-serde 0.12.6", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27434beae2514d4a2aa90f53832cbdf6f23e4b5e2656d95eaf15f9276e2418b6" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-consensus-any 0.8.3", + "alloy-eips 0.8.3", + "alloy-json-rpc 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rpc-types-any 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-serde 0.8.3", + "alloy-signer 0.8.3", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-consensus-any 0.12.6", + "alloy-eips 0.12.6", + "alloy-json-rpc 0.12.6", + "alloy-network-primitives 0.12.6", + "alloy-primitives", + "alloy-rpc-types-any 0.12.6", + "alloy-rpc-types-eth 0.12.6", + "alloy-serde 0.12.6", + "alloy-signer 0.12.6", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more 2.0.1", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-primitives", + "alloy-serde 0.8.3", + "serde", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", + "alloy-primitives", + "alloy-serde 0.12.6", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap 2.9.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus 0.8.3", + "alloy-eips 0.8.3", + "alloy-json-rpc 0.8.3", + "alloy-network 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rpc-client 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-transport 0.8.3", + "alloy-transport-http 0.8.3", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru 0.12.5", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-provider" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" +dependencies = [ + "alloy-chains", + "alloy-consensus 0.12.6", + "alloy-eips 0.12.6", + "alloy-json-rpc 0.12.6", + "alloy-network 0.12.6", + "alloy-network-primitives 0.12.6", + "alloy-primitives", + "alloy-rpc-client 0.12.6", + "alloy-rpc-types-eth 0.12.6", + "alloy-sol-types", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru 0.13.0", + "parking_lot", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc 0.8.3", + "alloy-primitives", + "alloy-transport 0.8.3", + "alloy-transport-http 0.8.3", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" +dependencies = [ + "alloy-json-rpc 0.12.6", + "alloy-primitives", + "alloy-transport 0.12.6", + "alloy-transport-http 0.12.6", + "async-stream", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "tracing-futures", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth 0.12.6", + "alloy-serde 0.12.6", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any 0.8.3", + "alloy-rpc-types-eth 0.8.3", + "alloy-serde 0.8.3", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" +dependencies = [ + "alloy-consensus-any 0.12.6", + "alloy-rpc-types-eth 0.12.6", + "alloy-serde 0.12.6", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus 0.8.3", + "alloy-consensus-any 0.8.3", + "alloy-eips 0.8.3", + "alloy-network-primitives 0.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.8.3", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-consensus-any 0.12.6", + "alloy-eips 0.12.6", + "alloy-network-primitives 0.12.6", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.12.6", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a1cd73fc054de6353c7f22ff9b846b0f0f145cd0112da07d4119e41e9959207" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-signer" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96fbde54bee943cd94ebacc8a62c50b38c7dfd2552dcd79ff61aea778b1bfcc" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-signer-local" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" +dependencies = [ + "alloy-consensus 0.12.6", + "alloy-network 0.12.6", + "alloy-primitives", + "alloy-signer 0.12.6", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.9.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc 0.8.3", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" +dependencies = [ + "alloy-json-rpc 0.12.6", + "base64", + "derive_more 2.0.1", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc 0.8.3", + "alloy-transport 0.8.3", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" +dependencies = [ + "alloy-json-rpc 0.12.6", + "alloy-transport 0.12.6", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[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 = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[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.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "cc" +version = "1.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.101", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "duplicate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", +] + +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +dependencies = [ + "alloy 0.8.3", + "fhe", + "fhe-traits", +] + +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + +[[package]] +name = "e3-program-client" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +dependencies = [ + "anyhow", + "reqwest", + "serde", +] + +[[package]] +name = "e3-support-app" +version = "0.1.0" +dependencies = [ + "actix-web", + "e3-compute-provider", + "e3-program-client", + "e3-support-host", + "env_logger", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "e3-support-host" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "bincode", + "bytemuck", + "e3-compute-provider", + "e3-user-program", + "fhe", + "fhe-traits", + "fhe-util", + "log", + "methods", + "rand 0.8.5", + "risc0-ethereum-contracts", + "risc0-zkvm", + "serde", + "tokio", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "e3-user-program" +version = "0.1.0" +dependencies = [ + "e3-bfv-helpers", + "e3-compute-provider", + "fhe", + "fhe-traits", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "ethnum" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fhe" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "doc-comment", + "fhe-math", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-traits", + "prost 0.12.6", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "thiserror 1.0.69", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "fhe-math" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "ethnum", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-bigint-dig", + "num-traits", + "prost 0.12.6", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "sha2", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "fhe-traits" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "fhe-util" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "itertools 0.12.1", + "num-bigint-dig", + "num-traits", + "prime_factorization", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +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 = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" + +[[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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[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 = "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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.10", + "http 1.3.1", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +dependencies = [ + "http 1.3.1", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "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 = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy-regex" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.101", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "lean-imt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.1", + "libc", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint", + "thiserror 1.0.69", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[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.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +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 = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[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.101", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.1", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "methods" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "hex", + "risc0-build", + "risc0-build-ethereum", + "risc0-zkp", + "risc0-zkvm", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[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" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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", + "serde", + "smallvec", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "foreign-types 0.3.2", + "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.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.9.0", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand 0.8.5", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.1", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive 0.12.6", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost 0.12.6", + "prost-types", + "regex", + "syn 2.0.101", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost 0.12.6", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quinn" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.1", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[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 = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.10", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp", + "risc0-zkvm-platform", + "semver 1.0.26", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" +dependencies = [ + "anyhow", + "cargo_metadata", + "derive_builder", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rzup", + "semver 1.0.26", + "serde", + "serde_json", + "stability", + "tempfile", +] + +[[package]] +name = "risc0-build-ethereum" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "risc0-build", + "risc0-zkp", + "risc0-zkvm", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core 0.6.4", +] + +[[package]] +name = "risc0-ethereum-contracts" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +dependencies = [ + "alloy 0.12.6", + "alloy-sol-types", + "anyhow", + "cfg-if", + "risc0-zkvm", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "risc0-groth16" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" +dependencies = [ + "anyhow", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", + "stability", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.6.4", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +dependencies = [ + "anyhow", + "bincode", + "bonsai-sdk", + "borsh", + "bytemuck", + "bytes", + "derive_more 2.0.1", + "getrandom 0.2.16", + "hex", + "lazy-regex", + "prost 0.13.5", + "risc0-binfmt", + "risc0-build", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "rzup", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "getrandom 0.3.3", + "libm", + "stability", +] + +[[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 = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "ruint" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "rzup" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" +dependencies = [ + "semver 1.0.26", + "serde", + "strum 0.26.3", + "tempfile", + "thiserror 2.0.12", + "toml", + "yaml-rust2", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[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.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "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 = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[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 = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +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 = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +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 = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +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 = [ + "futures", + "futures-task", + "pin-project", + "tracing", +] + +[[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-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[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 = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[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-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.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yaml-rust2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml new file mode 100644 index 0000000000..4929bd6b3c --- /dev/null +++ b/crates/support/Cargo.toml @@ -0,0 +1,48 @@ +[workspace] +resolver = "2" +members = ["app", "host", "methods"] +exclude = ["methods/guest"] + +[workspace.package] +version = "0.1.0" +edition = "2021" + +[workspace.dependencies] +e3-support-app = { path = "./app" } +e3-support-host = { path = "./host" } +e3-user-program = { path = "./program" } +methods = { path = "./methods" } +alloy-primitives = { version = "0.8", default-features = false, features = [ + "rlp", + "serde", + "std", +]} +alloy-sol-types = { version = "0.8" } +anyhow = { version = "1.0.86" } +actix-web = "4.10.2" +bincode = { version = "1.3.3" } +bytemuck = { version = "1" } +env_logger = "0.11.5" +hex = { version = "0.4.3" } +log = { version = "0.4" } +reqwest = { version = "0.12.15", features = ["json"] } +risc0-build = { version = "2.0.1", features = ["docker"] } +risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } +risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } +risc0-zkvm = { version = "2.0.0" } +risc0-zkp = { version = "2.0.0", default-features = false } +serde = { version = "1.0.208", features = ["derive", "std"] } +serde_json = "1.0.133" +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +e3-program-client = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +tokio = { version = "1.38", features = ["full"] } +rand = { version = "0.8.5" } +tracing-subscriber = { version = "0.3", features = ["env-filter"] } + +[profile.release] +debug = 1 +lto = true + diff --git a/crates/support/Dockerfile b/crates/support/Dockerfile new file mode 100644 index 0000000000..0bdcee5c2c --- /dev/null +++ b/crates/support/Dockerfile @@ -0,0 +1,50 @@ +ARG RUST_VERSION=1.85.0 +ARG RISC0_VERSION=2.0.0 +ARG SKIP_SOLIDITY=0 +FROM rust:${RUST_VERSION}-slim-bookworm AS base-dev + +ENV CARGO_HOME=/usr/local/cargo +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + pkg-config \ + git \ + libssl-dev \ + curl \ + sudo \ + ca-certificates && \ + rm -rf /var/lib/apt/lists/* + +# Create user +ENV USERNAME=devuser +ARG USER_UID=1000 +ARG USER_GID=1000 + +RUN groupadd --gid $USER_GID $USERNAME \ + && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME + +USER $USERNAME +WORKDIR /home/$USERNAME + +ENV SHELL=/bin/bash + +ENV PATH="/home/${USERNAME}/.risc0/bin:${PATH}" +RUN curl -L https://risczero.com/install | bash +RUN rzup install rust ${RUST_VERSION} +RUN rzup install r0vm ${RISC0_VERSION} +RUN rzup install cargo-risczero ${RISC0_VERSION} + +ENV PATH="/home/${USERNAME}/.foundry/bin:${PATH}" +RUN curl -L https://foundry.paradigm.xyz | bash +RUN foundryup + +COPY . /app + +RUN sudo chown -R $USERNAME:$USERNAME /app + +WORKDIR /app + +CMD ["/bin/bash"] diff --git a/crates/init/templates/support/app/Cargo.toml b/crates/support/app/Cargo.toml similarity index 60% rename from crates/init/templates/support/app/Cargo.toml rename to crates/support/app/Cargo.toml index dac3386f6c..7c7589f510 100644 --- a/crates/init/templates/support/app/Cargo.toml +++ b/crates/support/app/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "crisp-program" +name = "e3-support-app" version = "0.1.0" edition.workspace = true @@ -9,6 +9,6 @@ env_logger.workspace = true serde.workspace = true serde_json.workspace = true tokio.workspace = true -compute-provider.workspace = true -voting-host.workspace = true -program-client.workspace = true +e3-compute-provider.workspace = true +e3-support-host.workspace = true +e3-program-client.workspace = true diff --git a/crates/init/templates/support/app/src/main.rs b/crates/support/app/src/main.rs similarity index 78% rename from crates/init/templates/support/app/src/main.rs rename to crates/support/app/src/main.rs index 9dd8d7a76f..ddec53d43f 100644 --- a/crates/init/templates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,8 +1,6 @@ use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result}; -use compute_provider::FHEInputs; -use program_client::{ComputeRequest, ComputeResponse}; -use serde::{Deserialize, Serialize}; -use serde_json::json; +use e3_compute_provider::FHEInputs; +use e3_program_client::{ComputeRequest, ComputeResponse}; // Run compute handler async fn run_compute(req: web::Json) -> Result { @@ -11,7 +9,7 @@ async fn run_compute(req: web::Json) -> Result { ciphertexts: req.ciphertext_inputs.clone(), }; let (risc0_output, ciphertext) = - tokio::task::spawn_blocking(move || voting_host::run_compute(fhe_inputs)) + tokio::task::spawn_blocking(move || e3_support_host::run_compute(fhe_inputs)) .await .map_err(|e| { eprintln!("Task spawn error: {:?}", e); @@ -31,7 +29,7 @@ async fn run_compute(req: web::Json) -> Result { #[actix_web::main] async fn main() -> std::io::Result<()> { env_logger::init(); - let bind_addr = "0.0.0.0:4001"; + let bind_addr = "0.0.0.0:13151"; let server = HttpServer::new(|| { App::new() .wrap(Logger::default()) @@ -39,7 +37,7 @@ async fn main() -> std::io::Result<()> { }) .bind(bind_addr)?; - println!("'crisp-program' listening on http://{}", bind_addr); + println!("'program' listening on http://{}", bind_addr); server.run().await } diff --git a/crates/support/contracts/.keep b/crates/support/contracts/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/support/contracts/ImageID.sol b/crates/support/contracts/ImageID.sol new file mode 100644 index 0000000000..eb936f62a1 --- /dev/null +++ b/crates/support/contracts/ImageID.sol @@ -0,0 +1,23 @@ +// Copyright 2024 RISC Zero, Inc. +// +// 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. +// +// SPDX-License-Identifier: Apache-2.0 + +// This file is automatically generated + +pragma solidity ^0.8.20; + +library ImageID { + bytes32 public constant PROGRAM_ID = bytes32(0x69f2bdcf375ce3bc8c934c729c38e16ade73301bcdc6e4ae97a98910c31ab11d); +} diff --git a/crates/support/ctl/compile.sh b/crates/support/ctl/compile.sh new file mode 100755 index 0000000000..90114dc71f --- /dev/null +++ b/crates/support/ctl/compile.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +"$SCRIPT_DIR/container.sh" ./scripts/container/build.sh diff --git a/crates/support/ctl/container.sh b/crates/support/ctl/container.sh new file mode 100755 index 0000000000..4dab490330 --- /dev/null +++ b/crates/support/ctl/container.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +CONTAINER_NAME="e3-support.1" +IMAGE="ghcr.io/gnosisguild/e3-support:next" +CACHE_PREFIX="e3-support" + +if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then + docker exec -it "$CONTAINER_NAME" bash -c "$*" +else + docker run -it --rm \ + --name "$CONTAINER_NAME" \ + -v "$(pwd)/contracts:/app/contracts" \ + -v "$(pwd)/tests:/app/tests" \ + -v "${CACHE_PREFIX}-cargo-cache:/usr/local/cargo" \ + -v "${CACHE_PREFIX}-target-cache:/app/target" \ + -p 13151:13151 \ + "$IMAGE" bash -c "$*" +fi diff --git a/crates/support/ctl/run.sh b/crates/support/ctl/run.sh new file mode 100755 index 0000000000..8e4a451dfa --- /dev/null +++ b/crates/support/ctl/run.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +"$SCRIPT_DIR/container.sh" ./scripts/container/run.sh diff --git a/crates/support/ctl/shell.sh b/crates/support/ctl/shell.sh new file mode 100755 index 0000000000..4c76826753 --- /dev/null +++ b/crates/support/ctl/shell.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +"$SCRIPT_DIR/container.sh" bash diff --git a/crates/init/templates/support/host/Cargo.toml b/crates/support/host/Cargo.toml similarity index 74% rename from crates/init/templates/support/host/Cargo.toml rename to crates/support/host/Cargo.toml index acd102ed48..d68cfdfc91 100644 --- a/crates/init/templates/support/host/Cargo.toml +++ b/crates/support/host/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "voting-host" +name = "e3-support-host" version = { workspace = true } edition = { workspace = true } @@ -15,10 +15,10 @@ methods = { workspace = true } risc0-ethereum-contracts = { workspace = true } risc0-zkvm = { workspace = true } tokio = { workspace = true } -compute-provider = { path = "../../../../../packages/compute_provider" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } -voting-core = { workspace = true } +e3-user-program = { workspace = true } rand = { workspace = true } -tracing-subscriber = { workspace = true } \ No newline at end of file +tracing-subscriber = { workspace = true } diff --git a/crates/support/host/README.md b/crates/support/host/README.md new file mode 100644 index 0000000000..75d635705d --- /dev/null +++ b/crates/support/host/README.md @@ -0,0 +1,3 @@ +# Risc0 Host + +Exposes a function to run the computation found in `e3_user_program::fhe_processor` whilst also generating a risc0 proof assuming `risc0_dev_mode` is _not_ set. diff --git a/crates/init/templates/support/host/src/lib.rs b/crates/support/host/src/lib.rs similarity index 92% rename from crates/init/templates/support/host/src/lib.rs rename to crates/support/host/src/lib.rs index d9e3ac38a3..7f034f2378 100644 --- a/crates/init/templates/support/host/src/lib.rs +++ b/crates/support/host/src/lib.rs @@ -1,12 +1,14 @@ use anyhow::{Error, Result}; use bincode::serialize; -use compute_provider::{ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs}; -use methods::VOTING_ELF; +use e3_compute_provider::{ + ComputeInput, ComputeManager, ComputeProvider, ComputeResult, FHEInputs, +}; +use e3_user_program::fhe_processor; +use methods::PROGRAM_ELF; use risc0_ethereum_contracts::groth16; use risc0_zkvm::{default_prover, ExecutorEnv, ProverOpts, VerifierContext}; use serde::{Deserialize, Serialize}; use std::time::Instant; -use voting_core::fhe_processor; fn encode_input(input: &[u8]) -> Result, Error> { Ok(bytemuck::pod_collect_to_vec(&risc0_zkvm::serde::to_vec( @@ -37,7 +39,7 @@ impl ComputeProvider for Risc0Provider { .prove_with_ctx( env, &VerifierContext::default(), - VOTING_ELF, + PROGRAM_ELF, &ProverOpts::groth16(), ) .unwrap() diff --git a/crates/support/methods/Cargo.toml b/crates/support/methods/Cargo.toml new file mode 100644 index 0000000000..41a537beae --- /dev/null +++ b/crates/support/methods/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "methods" +version = { workspace = true } +edition = { workspace = true } + +[package.metadata.risc0] +methods = ["guest"] + +[build-dependencies] +hex = { workspace = true } +risc0-build = { workspace = true } +risc0-build-ethereum = { workspace = true } +risc0-zkp = { workspace = true } + +[dev-dependencies] +alloy-primitives = { workspace = true } +alloy-sol-types = { workspace = true } +risc0-zkvm = { workspace = true } diff --git a/crates/support/methods/README.md b/crates/support/methods/README.md new file mode 100644 index 0000000000..98e3253545 --- /dev/null +++ b/crates/support/methods/README.md @@ -0,0 +1,31 @@ +# zkVM Methods + +This directory contains the [zkVM] portion of your [RISC Zero] application. +This is where you will define one or more [guest programs] to act as a coprocessor to your [on-chain logic]. + +> In typical use cases, the only code in this directory that you will need to edit is inside [guest/src/bin]. + + +### Writing Guest Code + +To learn to write code for the zkVM, we recommend [Guest Code 101]. + +Examples of what you can do in the guest can be found in the [RISC Zero examples]. + + +### From Guest Code to Binary File + +Code in the `methods/guest` directory will be compiled into one or more binaries. + +Build configuration for the methods is included in `methods/build.rs`. + +Each will have a corresponding image ID, which is a hash identifying the program. + + +[zkVM]: https://dev.risczero.com/zkvm +[RISC Zero]: https://www.risczero.com/ +[guest programs]: https://dev.risczero.com/terminology#guest-program +[on-chain logic]: ../contracts/ +[guest/src/bin]: ./guest/src/bin/ +[Guest Code 101]: https://dev.risczero.com/zkvm/developer-guide/guest-code-101 +[RISC Zero examples]: https://github.com/risc0/tree/v0.18.0/examples \ No newline at end of file diff --git a/crates/support/methods/build.rs b/crates/support/methods/build.rs new file mode 100644 index 0000000000..bf910fb745 --- /dev/null +++ b/crates/support/methods/build.rs @@ -0,0 +1,52 @@ +// Copyright 2023 RISC Zero, Inc. +// +// 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. + +use std::{collections::HashMap, env, path::PathBuf}; + +use risc0_build::{embed_methods_with_options, DockerOptionsBuilder, GuestOptionsBuilder}; +use risc0_build_ethereum::generate_solidity_files; + +// Paths where the generated Solidity files will be written. +const SOLIDITY_IMAGE_ID_PATH: &str = "../contracts/ImageID.sol"; +const SOLIDITY_ELF_PATH: &str = "../tests/Elf.sol"; + +fn main() { + // Builds can be made deterministic, and thereby reproducible, by using Docker to build the + // guest. Check the RISC0_USE_DOCKER variable and use Docker to build the guest if set. + println!("cargo:rerun-if-env-changed=RISC0_USE_DOCKER"); + println!("cargo:rerun-if-changed=build.rs"); + let manifest_dir = PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").unwrap()); + let mut builder = GuestOptionsBuilder::default(); + if env::var("RISC0_USE_DOCKER").is_ok() { + let docker_options = DockerOptionsBuilder::default() + .root_dir(manifest_dir.join("../")) + .build() + .unwrap(); + builder.use_docker(docker_options); + } + let guest_options = builder.build().unwrap(); + + // Generate Rust source files for the methods crate. + let guests = embed_methods_with_options(HashMap::from([("guests", guest_options)])); + + if std::env::var("SKIP_SOLIDITY").unwrap_or_default() != "1" { + // Generate Solidity source files for use with Forge. + let solidity_opts = risc0_build_ethereum::Options::default() + .with_image_id_sol_path(SOLIDITY_IMAGE_ID_PATH) + .with_elf_sol_path(SOLIDITY_ELF_PATH); + generate_solidity_files(guests.as_slice(), &solidity_opts).unwrap(); + } else { + println!("cargo:warning=Skipping solidity codegen (SKIP_SOLIDITY set)"); + } +} diff --git a/crates/support/methods/guest/Cargo.lock b/crates/support/methods/guest/Cargo.lock new file mode 100644 index 0000000000..5e21a1d26d --- /dev/null +++ b/crates/support/methods/guest/Cargo.lock @@ -0,0 +1,4583 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-provider", + "alloy-rpc-client", + "alloy-serde", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.2", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.98", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[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.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "bytemuck" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cc" +version = "1.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +dependencies = [ + "shlex", +] + +[[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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + +[[package]] +name = "e3-user-program" +version = "0.1.0" +dependencies = [ + "e3-bfv-helpers", + "e3-compute-provider", + "fhe", + "fhe-traits", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "ethnum" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fhe" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "doc-comment", + "fhe-math", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-traits", + "prost", + "prost-build", + "rand", + "rand_chacha", + "serde", + "thiserror 1.0.61", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "fhe-math" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "ethnum", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-bigint-dig", + "num-traits", + "prost", + "prost-build", + "rand", + "rand_chacha", + "sha2", + "thiserror 1.0.61", + "zeroize", +] + +[[package]] +name = "fhe-traits" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "rand", +] + +[[package]] +name = "fhe-util" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "itertools 0.12.1", + "num-bigint-dig", + "num-traits", + "prime_factorization", + "rand", + "rayon", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "guests" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "bincode", + "e3-compute-provider", + "e3-user-program", + "risc0-zkvm", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[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 = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower 0.4.13", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "lean-imt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint", + "thiserror 1.0.61", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.5.0", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.59.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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", + "serde", + "smallvec", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "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 = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types 0.3.2", + "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.98", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +dependencies = [ + "memchr", + "thiserror 1.0.61", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +dependencies = [ + "proc-macro2", + "syn 2.0.98", +] + +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.98", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "regex" +version = "1.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "reqwest" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f147f96a8a3058e699a5d39fc7e59d982f633751543ff4437cc0fb21f40b2e0" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp", + "risc0-zkvm-platform", + "semver 1.0.23", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6af6fc80443a05d9e8e25aeba78082fc58e8a3c6a6b92017cae0a404494ba9" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7bdd11df4ed470b3c032ac4c5bfb2729f6151af33ee255b66169de0c35611e" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c98a4d9e438aac2e661b8376f6dd48b17a0949b29dbb0aed6e88e62de0bd5940" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a800c55717c52f764325bdb18a164843d417a4c8c8a123b7d4206705c11a54c3" +dependencies = [ + "anyhow", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", + "stability", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa44e7cc6642e621c6f3eea56f57a765f8e599bf327f4d0f74921693234a5d62" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023ed128cab28e4078330fffb65e9d079b3198958e3de6835f70c7ff285afeb4" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5881af78a17ca292037ef38383233f8d617ab679d68cc07c865e3ddabef1db80" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more 2.0.1", + "getrandom", + "hex", + "risc0-binfmt", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "semver 1.0.23", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed76ab12e5af4c93a3996e0609696cfdd0caebe8746af171ef583fa6e4af134" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom", + "libm", + "stability", +] + +[[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 = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "ruint" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825df406ec217a8116bd7b06897c6cc8f65ffefc15d030ae2c9540acc9ed50b6" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.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.23", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[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 = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "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 = "sha3-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.98", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.98", +] + +[[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.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl 1.0.61", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[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-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[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-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[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 = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[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 = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.98", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.98", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml new file mode 100644 index 0000000000..793e987f05 --- /dev/null +++ b/crates/support/methods/guest/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "guests" +version = "0.1.0" +edition = "2021" + +[workspace] + +[[bin]] +name = "program" +path = "src/bin/program.rs" + +[dependencies] +alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } +alloy-sol-types = "0.8" +risc0-zkvm = { version = "2.0.0", default-features = false, features = ['std'] } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +e3-user-program = { path = "../../program" } +bincode = "1.3.3" +anyhow = "1.0.86" + +[profile.release] +lto = "thin" diff --git a/crates/support/methods/guest/README.md b/crates/support/methods/guest/README.md new file mode 100644 index 0000000000..8daf0334bb --- /dev/null +++ b/crates/support/methods/guest/README.md @@ -0,0 +1,12 @@ +# Guest Programs + +Each file in the [`src/bin`](./src/bin) folder defines a program for the zkVM. +We refer to the program running in the zkVM as the "[guest]". + +To learn more about writing guest programs, check out the zkVM [developer docs]. +For zkVM API documentation, see the [guest module] of the [`risc0-zkvm`] crate. + +[guest]: https://dev.risczero.com/terminology#guest +[developer docs]: https://dev.risczero.com/zkvm +[guest module]: https://docs.rs/risc0-zkvm/latest/risc0_zkvm/guest/index.html +[`risc0-zkvm`]: https://docs.rs/risc0-zkvm/latest/risc0_zkvm/index.html diff --git a/crates/support/methods/guest/src/bin/program.rs b/crates/support/methods/guest/src/bin/program.rs new file mode 100644 index 0000000000..b5be58c572 --- /dev/null +++ b/crates/support/methods/guest/src/bin/program.rs @@ -0,0 +1,20 @@ +use anyhow::{Error, Result}; +use bincode::deserialize; +use e3_compute_provider::{ComputeInput, ComputeResult}; +use e3_user_program::fhe_processor; +use risc0_zkvm::guest::env; +use std::io::Read; + +fn decode_input(input: &[u8]) -> Result, Error> { + Ok(risc0_zkvm::serde::from_slice(input)?) +} + +fn main() { + let mut input_slice = Vec::::new(); + env::stdin().read_to_end(&mut input_slice).unwrap(); + let input: ComputeInput = deserialize(&decode_input(&input_slice).unwrap()).unwrap(); + + let result: ComputeResult = input.process(fhe_processor); + + env::commit(&result); +} diff --git a/crates/support/methods/src/lib.rs b/crates/support/methods/src/lib.rs new file mode 100644 index 0000000000..2a5dd3b258 --- /dev/null +++ b/crates/support/methods/src/lib.rs @@ -0,0 +1,16 @@ +// Copyright 2023 RISC Zero, Inc. +// +// 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. + +//! Generated crate containing the image ID and ELF binary of the build guest. +include!(concat!(env!("OUT_DIR"), "/methods.rs")); diff --git a/crates/support/program/Cargo.toml b/crates/support/program/Cargo.toml new file mode 100644 index 0000000000..a21d83d68d --- /dev/null +++ b/crates/support/program/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "e3-user-program" +version = "0.1.0" +edition = "2024" + +[dependencies] +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } diff --git a/crates/support/program/src/lib.rs b/crates/support/program/src/lib.rs new file mode 100644 index 0000000000..3ed45d3ac6 --- /dev/null +++ b/crates/support/program/src/lib.rs @@ -0,0 +1,17 @@ +use e3_bfv_helpers::decode_bfv_params_arc; +use e3_compute_provider::FHEInputs; +use fhe_rs::bfv::Ciphertext; +use fhe_traits::{DeserializeParametrized, Serialize}; + +/// CRISP Implementation of the CiphertextProcessor function +pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { + let params = decode_bfv_params_arc(&fhe_inputs.params); + + let mut sum = Ciphertext::zero(¶ms); + for ciphertext_bytes in &fhe_inputs.ciphertexts { + let ciphertext = Ciphertext::from_bytes(&ciphertext_bytes.0, ¶ms).unwrap(); + sum += &ciphertext; + } + + sum.to_bytes() +} diff --git a/crates/support/scripts/build.sh b/crates/support/scripts/build.sh new file mode 100755 index 0000000000..6a6f9751f8 --- /dev/null +++ b/crates/support/scripts/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +PKG=ghcr.io/gnosisguild/e3-support +GIT_SHA=$(git rev-parse --short HEAD) +docker build -t $PKG:$GIT_SHA -t $PKG:next . +if [ "$1" = "--push" ]; then + docker push $PKG:$GIT_SHA + docker push $PKG:next + echo "Image pushed to: $PKG:$GIT_SHA" + echo "Image pushed to: $PKG:next" +fi diff --git a/crates/support/scripts/container/build.sh b/crates/support/scripts/container/build.sh new file mode 100755 index 0000000000..8ebfb624e2 --- /dev/null +++ b/crates/support/scripts/container/build.sh @@ -0,0 +1 @@ +cargo build diff --git a/crates/support/scripts/container/run.sh b/crates/support/scripts/container/run.sh new file mode 100755 index 0000000000..dd6b38b4e5 --- /dev/null +++ b/crates/support/scripts/container/run.sh @@ -0,0 +1 @@ +cargo run --bin e3-support-app diff --git a/crates/support/scripts/dev.sh b/crates/support/scripts/dev.sh new file mode 100755 index 0000000000..2c961590be --- /dev/null +++ b/crates/support/scripts/dev.sh @@ -0,0 +1,12 @@ +# dev +docker run -it \ + -v $(pwd)/app:/app/app \ + -v $(pwd)/host:/app/host \ + -v $(pwd)/methods:/app/methods \ + -v $(pwd)/program:/app/program \ + -v $(pwd)/scripts:/app/scripts \ + -v $(pwd)/contracts:/app/contracts \ + -v $(pwd)/tests:/app/tests \ + -v $(pwd)/Cargo.toml:/app/Cargo.toml \ + -v $(pwd)/Cargo.lock:/app/Cargo.lock \ + e3-support diff --git a/crates/support/tests/.keep b/crates/support/tests/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/support/tests/Elf.sol b/crates/support/tests/Elf.sol new file mode 100644 index 0000000000..94f932e5b0 --- /dev/null +++ b/crates/support/tests/Elf.sol @@ -0,0 +1,24 @@ +// Copyright 2024 RISC Zero, Inc. +// +// 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. +// +// SPDX-License-Identifier: Apache-2.0 + +// This file is automatically generated + +pragma solidity ^0.8.20; + +library Elf { + string public constant PROGRAM_PATH = + "/app/target/riscv-guest/methods/guests/riscv32im-risc0-zkvm-elf/release/program.bin"; +} diff --git a/examples/basic/README.md b/examples/basic/README.md index 3220a5bd17..09df6c9214 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -4,7 +4,49 @@ This template allows you to deploy and interact with the Enclave protocol locall ## Quick Start -### 1. Install Dependencies +### Prerequisites + +Tested with the following: + +``` +docker --version +Docker version 25.0.6, build v25.0.6 +``` + +``` +pnpm --version +10.7.1 +``` + +``` +node --version +v22.10.0 +``` + +``` +rustc --version +rustc 1.85.1 (4eb161250 2025-03-15) +``` + +Linux/POSIX environment + +### Install Enclave + +``` +cargo install --git https://github.com/gnosisguild/enclave e3-cli +``` + +### Generate Template + +``` +enclave init ./myproj +``` + +``` +cd ./myproj +``` + +### Install Dependencies ```bash pnpm install diff --git a/examples/basic/contracts/.keep b/examples/basic/contracts/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/basic/program/Cargo.toml b/examples/basic/program/Cargo.toml new file mode 100644 index 0000000000..a21d83d68d --- /dev/null +++ b/examples/basic/program/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "e3-user-program" +version = "0.1.0" +edition = "2024" + +[dependencies] +fhe_rs = { workspace = true } +fhe-traits = { workspace = true } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } diff --git a/examples/basic/program/src/lib.rs b/examples/basic/program/src/lib.rs new file mode 100644 index 0000000000..3ed45d3ac6 --- /dev/null +++ b/examples/basic/program/src/lib.rs @@ -0,0 +1,17 @@ +use e3_bfv_helpers::decode_bfv_params_arc; +use e3_compute_provider::FHEInputs; +use fhe_rs::bfv::Ciphertext; +use fhe_traits::{DeserializeParametrized, Serialize}; + +/// CRISP Implementation of the CiphertextProcessor function +pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { + let params = decode_bfv_params_arc(&fhe_inputs.params); + + let mut sum = Ciphertext::zero(¶ms); + for ciphertext_bytes in &fhe_inputs.ciphertexts { + let ciphertext = Ciphertext::from_bytes(&ciphertext_bytes.0, ¶ms).unwrap(); + sum += &ciphertext; + } + + sum.to_bytes() +} diff --git a/examples/basic/tests/.keep b/examples/basic/tests/.keep new file mode 100644 index 0000000000..e69de29bb2 From 52c83088ef4604045199cf25aceb356fd08aec47 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Tue, 3 Jun 2025 09:55:23 +0200 Subject: [PATCH 037/106] wip: `noir` placeholder for CRISP circuits (#439) * add boilerplate for noir circuits * update pnpm lock file * remove no modify path flag * remove lib, fix versions on dockerfile, small bug on noirup and bbup * adapt circuit without lib * improve script and add installation for bb and nargo * Update Noir Proof Gen [skip ci] * Add Verifier Contract gen [skip ci] * Add Verifier Contracts [skip ci] * fix type mismatch from client deps and circuit compilation * Update Vite config [skip ci] * Lots of Stuff * Update Wasm Rayon Version [skip ci] * Update Wasm-Crypto [skip ci] * Update Wasm Crypto [skip ci] * Generating Proof [skip ci] * Update Voting Types [skip ci] * commit lockfiles and resolve conflicts [skip ci] * Fix On Chain verification * commit lockfile * Fix Scripts * Update Dockerfile * Update Dockerfile * Update Dockerfile * Update Dockerfile * Update Dockerfile * Fix Cache dir in d-compose * Update Wasm modules * Update TS version * Prettier :) * Update Dockerfile * Update CI & Dockerfile * Update CI * Update CI and Dockerfile * Update CI and Dockerfile * Update CI * Potentially Faster CI * Increase PlayWright Workers --------- Co-authored-by: Hamza Khalid Co-authored-by: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> --- .github/workflows/crisp-e2e.yaml | 13 +- examples/CRISP/Dockerfile | 131 +- examples/CRISP/apps/client/.env.example | 2 +- examples/CRISP/apps/client/.gitignore | 3 + .../apps/client/libs/noir/crisp_circuit.json | 1 + .../libs/wasm/pkg/crisp_wasm_crypto.d.ts | 160 +- .../client/libs/wasm/pkg/crisp_wasm_crypto.js | 909 ++- .../libs/wasm/pkg/crisp_wasm_crypto_bg.wasm | Bin 513514 -> 639531 bytes .../wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts | 55 +- .../apps/client/libs/wasm/pkg/crisp_worker.js | 13 +- .../apps/client/libs/wasm/pkg/package.json | 19 - examples/CRISP/apps/client/package.json | 2 + .../voteManagement/VoteManagement.types.ts | 4 +- .../client/src/hooks/voting/useVoteCasting.ts | 4 +- .../client/src/hooks/wasm/useWebAssembly.tsx | 20 +- .../CRISP/apps/client/src/model/vote.model.ts | 8 + .../CRISP/apps/client/src/utils/proofUtils.ts | 71 + examples/CRISP/apps/client/src/utils/vote.ts | 2 +- examples/CRISP/apps/client/tsconfig.json | 32 +- examples/CRISP/apps/client/vite.config.ts | 3 +- examples/CRISP/apps/program/Cargo.lock | 254 +- .../apps/program/methods/guest/Cargo.lock | 759 +-- examples/CRISP/apps/server/.env.example | 2 +- examples/CRISP/apps/server/Cargo.lock | 232 +- .../CRISP/apps/server/src/server/models.rs | 2 + .../apps/server/src/server/routes/voting.rs | 13 + examples/CRISP/apps/wasm-crypto/Cargo.lock | 1573 +++--- examples/CRISP/apps/wasm-crypto/README.md | 35 + .../CRISP/apps/wasm-crypto/src/greco/greco.rs | 286 +- .../CRISP/apps/wasm-crypto/src/greco/poly.rs | 20 +- examples/CRISP/apps/wasm-crypto/src/lib.rs | 86 +- examples/CRISP/circuits/.gitignore | 2 + examples/CRISP/circuits/Nargo.toml | 6 + examples/CRISP/circuits/src/main.nr | 27 + .../CRISP/contracts/CRISPInputValidator.sol | 31 +- .../contracts/CRISPInputValidatorFactory.sol | 8 +- examples/CRISP/contracts/CRISPProgram.sol | 12 +- examples/CRISP/contracts/CRISPVerifier.sol | 1883 +++++++ examples/CRISP/deploy/Deploy.s.sol | 5 + examples/CRISP/docker-compose.yaml | 23 +- examples/CRISP/foundry.toml | 2 +- examples/CRISP/scripts/compile_circuits.sh | 9 + .../CRISP/scripts/tasks/compile_circuits.sh | 47 + examples/CRISP/scripts/tasks/setup.sh | 2 + packages/evm/package.json | 2 +- pnpm-lock.yaml | 4944 +++++++++-------- 46 files changed, 7334 insertions(+), 4383 deletions(-) create mode 100644 examples/CRISP/apps/client/libs/noir/crisp_circuit.json delete mode 100644 examples/CRISP/apps/client/libs/wasm/pkg/package.json create mode 100644 examples/CRISP/apps/client/src/utils/proofUtils.ts create mode 100644 examples/CRISP/apps/wasm-crypto/README.md create mode 100644 examples/CRISP/circuits/.gitignore create mode 100644 examples/CRISP/circuits/Nargo.toml create mode 100644 examples/CRISP/circuits/src/main.nr create mode 100644 examples/CRISP/contracts/CRISPVerifier.sol create mode 100755 examples/CRISP/scripts/compile_circuits.sh create mode 100755 examples/CRISP/scripts/tasks/compile_circuits.sh diff --git a/.github/workflows/crisp-e2e.yaml b/.github/workflows/crisp-e2e.yaml index e0e546c96c..a10322a8a1 100644 --- a/.github/workflows/crisp-e2e.yaml +++ b/.github/workflows/crisp-e2e.yaml @@ -30,7 +30,14 @@ jobs: submodules: recursive - name: Prepare test environment - run: mkdir -p $GITHUB_WORKSPACE/examples/CRISP/test-results && sudo chmod 777 $GITHUB_WORKSPACE/examples/CRISP/test-results && mkdir -p $GITHUB_WORKSPACE/examples/CRISP/playwright-report && chmod 777 $GITHUB_WORKSPACE/examples/CRISP/playwright-report + run: | + mkdir -p $GITHUB_WORKSPACE/examples/CRISP/test-results + sudo chmod -R 777 $GITHUB_WORKSPACE/examples/CRISP/test-results + mkdir -p $GITHUB_WORKSPACE/examples/CRISP/playwright-report + sudo chmod -R 777 $GITHUB_WORKSPACE/examples/CRISP/playwright-report + mkdir -p $GITHUB_WORKSPACE/examples/CRISP/.cache-synpress + sudo chown -R $USER_UID:$USER_GID $GITHUB_WORKSPACE/examples/CRISP/.cache-synpress + sudo chmod -R 777 $GITHUB_WORKSPACE/examples/CRISP/.cache-synpress - name: Setup Node.js uses: actions/setup-node@v4 @@ -68,6 +75,8 @@ jobs: - name: Run Playwright tests working-directory: ./examples/CRISP run: pnpm test:e2e + env: + PLAYWRIGHT_WORKERS: 4 - name: Upload test results if: always() @@ -75,4 +84,4 @@ jobs: with: name: playwright-report path: ./examples/CRISP/playwright-report/ - retention-days: 30 + retention-days: 30 \ No newline at end of file diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index 5298537f4e..35a6f190dd 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -1,68 +1,105 @@ -FROM ubuntu:22.04 - -# Set environment variables -ENV RUST_VERSION=1.85.0 \ - COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - -# Install dependencies -RUN apt-get update && apt-get install -y \ - build-essential \ - cmake \ - curl \ - git \ - libssl-dev \ - pkg-config \ - python3 \ - python3-pip \ - sudo \ - wget \ - && rm -rf /var/lib/apt/lists/* +# ──────────────────────────────────────────────────────────────────────────────── +# Base image & build-time versions +# ──────────────────────────────────────────────────────────────────────────────── +FROM ubuntu:24.04 +ARG NOIR_VERSION=1.0.0-beta.3 +ARG BB_VERSION=0.82.2 +ARG RISCZERO_VERSION=2.0.0 +ARG CPP_VERSION=2024.1.5 +ARG RUST_VERSION=1.85.0 + +# ──────────────────────────────────────────────────────────────────────────────── +# OS packages +# ──────────────────────────────────────────────────────────────────────────────── +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential cmake curl git libssl-dev pkg-config \ + python3 python3-pip sudo wget jq \ + && rm -rf /var/lib/apt/lists/* + +# Node 18 / 22 + pnpm RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ - && apt-get install -y nodejs \ - && npm install -g corepack concurrently wait-on \ - && corepack enable \ - && corepack prepare pnpm@10.7.1 --activate + && apt-get install -y nodejs \ + && npm install -g corepack concurrently wait-on \ + && corepack enable \ + && corepack prepare pnpm@10.7.1 --activate -# Create user -ENV USERNAME=devuser -ARG USER_UID=1000 -ARG USER_GID=1000 +# ──────────────────────────────────────────────────────────────────────────────── +# Non-root user (skip if it already exists) +# ──────────────────────────────────────────────────────────────────────────────── +ARG USERNAME=ubuntu +ARG USER_UID=1001 +ARG USER_GID=118 # use any free GID you like -RUN groupadd --gid $USER_GID $USERNAME \ - && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ - && chmod 0440 /etc/sudoers.d/$USERNAME +RUN set -eux; \ + if ! id -u "${USERNAME}" 2>/dev/null; then \ + groupadd --gid "${USER_GID}" "${USERNAME}"; \ + useradd --uid "${USER_UID}" --gid "${USER_GID}" -m "${USERNAME}"; \ + fi && \ + echo "${USERNAME} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \ + chmod 0440 /etc/sudoers.d/${USERNAME} USER $USERNAME WORKDIR /home/$USERNAME -# Install Rust and add it to PATH -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${RUST_VERSION} +# ──────────────────────────────────────────────────────────────────────────────── +# Rust toolchain +# ──────────────────────────────────────────────────────────────────────────────── +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ + | sh -s -- -y --default-toolchain ${RUST_VERSION} ENV PATH="/home/${USERNAME}/.cargo/bin:${PATH}" RUN rustup component add rustfmt clippy -ENV SHELL=/bin/bash +# ──────────────────────────────────────────────────────────────────────────────── +# Noir / Nargo +# ──────────────────────────────────────────────────────────────────────────────── +ENV NARGO_HOME="/home/${USERNAME}/.nargo" +ENV PATH="${PATH}:${NARGO_HOME}/bin" + +RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash \ + && "$HOME/.nargo/bin/noirup" -v ${NOIR_VERSION} + +# ──────────────────────────────────────────────────────────────────────────────── +# Barretenberg CLI (bbup) +# ──────────────────────────────────────────────────────────────────────────────── +ENV BB_HOME="/home/${USERNAME}/.bb" +ENV PATH="${PATH}:${BB_HOME}" +RUN curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash \ + && bbup -v ${BB_VERSION} + +# ──────────────────────────────────────────────────────────────────────────────── +# Foundry +# ──────────────────────────────────────────────────────────────────────────────── ENV PATH="/home/${USERNAME}/.foundry/bin:${PATH}" -RUN curl -L https://foundry.paradigm.xyz | bash -RUN foundryup +RUN curl -L https://foundry.paradigm.xyz | bash \ + && foundryup +# ──────────────────────────────────────────────────────────────────────────────── +# Risc Zero tool-chain +# ──────────────────────────────────────────────────────────────────────────────── ENV PATH="/home/${USERNAME}/.risc0/bin:${PATH}" -RUN curl -L https://risczero.com/install | bash -RUN rzup install rust 1.85.0 -RUN rzup install cpp 2024.1.5 -RUN rzup install r0vm 2.0.0 -RUN rzup install cargo-risczero 2.0.0 -RUN sudo wget https://github.com/mikefarah/yq/releases/download/v4.45.1/yq_linux_amd64.tar.gz -O - |\ - tar xz && sudo mv yq_linux_amd64 /usr/bin/yq +RUN curl -L https://risczero.com/install | bash \ + && rzup install rust ${RUST_VERSION} \ + && rzup install cpp ${CPP_VERSION} \ + && rzup install r0vm ${RISCZERO_VERSION} \ + && rzup install cargo-risczero ${RISCZERO_VERSION} -RUN sudo mkdir -p /app && sudo chown -R $USERNAME:$USERNAME /app +# ──────────────────────────────────────────────────────────────────────────────── +# Helpers (yq) & workspace dir +# ──────────────────────────────────────────────────────────────────────────────── +RUN sudo wget -qO- https://github.com/mikefarah/yq/releases/download/v4.45.1/yq_linux_amd64.tar.gz \ + | sudo tar xz -C /usr/local/bin --transform='s|yq_linux_amd64|yq|' --no-same-owner +RUN sudo mkdir -p /app && sudo chown -R $USERNAME:$USERNAME /app WORKDIR /app/examples/CRISP -RUN pnpm config set store-dir "/home/${USERNAME}/.pnpm-store" -RUN pnpm --version +# Pre-set pnpm store path (speeds up mounts) +RUN pnpm config set store-dir "/home/${USERNAME}/.pnpm-store" \ + && pnpm --version -ENTRYPOINT ["/bin/bash"] +# ──────────────────────────────────────────────────────────────────────────────── +# Default entrypoint +# ──────────────────────────────────────────────────────────────────────────────── +ENTRYPOINT ["bash", "-l"] diff --git a/examples/CRISP/apps/client/.env.example b/examples/CRISP/apps/client/.env.example index a8e9ac948d..22a485a7a3 100644 --- a/examples/CRISP/apps/client/.env.example +++ b/examples/CRISP/apps/client/.env.example @@ -1,7 +1,7 @@ VITE_ENCLAVE_API=http://127.0.0.1:4000 VITE_TWITTER_SERVERLESS_API= VITE_WALLETCONNECT_PROJECT_ID= -VITE_E3_PROGRAM_ADDRESS=0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1 # Default E3 program address from anvil +VITE_E3_PROGRAM_ADDRESS=0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE # Default E3 program address from anvil VITE_SEMAPHORE_ADDRESS=0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0 diff --git a/examples/CRISP/apps/client/.gitignore b/examples/CRISP/apps/client/.gitignore index f57eb99b0c..28574c3f06 100644 --- a/examples/CRISP/apps/client/.gitignore +++ b/examples/CRISP/apps/client/.gitignore @@ -37,3 +37,6 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts /dist/ + +# circuits compilation output +public/circuits/ diff --git a/examples/CRISP/apps/client/libs/noir/crisp_circuit.json b/examples/CRISP/apps/client/libs/noir/crisp_circuit.json new file mode 100644 index 0000000000..c8b2516db1 --- /dev/null +++ b/examples/CRISP/apps/client/libs/noir/crisp_circuit.json @@ -0,0 +1 @@ +{"noir_version":"1.0.0-beta.3+ceaa1986628197bd1170147f6a07f0f98d21030a","hash":1286082986342997620,"abi":{"parameters":[{"name":"pk0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"pk1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"u","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e0","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e1","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"k1","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"r1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"r2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"}],"return_type":null,"error_types":{}},"bytecode":"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","debug_symbols":"XYxLCoAwDAXvkrUn8Coi0k9aAqEpsRWk9O5+cCFdzhveNPBoa9woBdlhXhqwOFNI0k2tT2CVmCluw3wYJWMZPww1uZ8tZ8bhn1Uc+qr4lF7X134B","file_map":{},"names":["main"],"brillig_names":[]} \ No newline at end of file diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts index 31c6568484..85af63d465 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts @@ -1,91 +1,78 @@ /* tslint:disable */ /* eslint-disable */ +export function __wbgtest_cov_dump(): Uint8Array | undefined; /** -* Handler for `console.log` invocations. -* -* If a test is currently running it takes the `args` array and stringifies -* it and appends it to the current output of the test. Otherwise it passes -* the arguments to the original `console.log` function, psased as -* `original`. -* @param {Array} args -*/ + * Handler for `console.log` invocations. + * + * If a test is currently running it takes the `args` array and stringifies + * it and appends it to the current output of the test. Otherwise it passes + * the arguments to the original `console.log` function, psased as + * `original`. + */ export function __wbgtest_console_log(args: Array): void; /** -* Handler for `console.debug` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.debug` invocations. See above. + */ export function __wbgtest_console_debug(args: Array): void; /** -* Handler for `console.info` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.info` invocations. See above. + */ export function __wbgtest_console_info(args: Array): void; /** -* Handler for `console.warn` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.warn` invocations. See above. + */ export function __wbgtest_console_warn(args: Array): void; /** -* Handler for `console.error` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.error` invocations. See above. + */ export function __wbgtest_console_error(args: Array): void; -/** -* @returns {Uint8Array | undefined} -*/ -export function __wbgtest_cov_dump(): Uint8Array | undefined; -/** -*/ export class Encrypt { free(): void; -/** -*/ constructor(); -/** -* @param {bigint} vote -* @param {Uint8Array} public_key -* @returns {Uint8Array} -*/ - encrypt_vote(vote: bigint, public_key: Uint8Array): Uint8Array; -/** -*/ + encrypt_vote(vote: bigint, public_key: Uint8Array): EncryptedVote; static test(): void; } +export class EncryptedVote { + private constructor(); + free(): void; + readonly encrypted_vote: Uint8Array; + readonly circuit_inputs: string; +} /** -* Runtime test harness support instantiated in JS. -* -* The node.js entry script instantiates a `Context` here which is used to -* drive test execution. -*/ + * Runtime test harness support instantiated in JS. + * + * The node.js entry script instantiates a `Context` here which is used to + * drive test execution. + */ export class WasmBindgenTestContext { free(): void; -/** -* Creates a new context ready to run tests. -* -* A `Context` is the main structure through which test execution is -* coordinated, and this will collect output and results for all executed -* tests. -*/ + /** + * Creates a new context ready to run tests. + * + * A `Context` is the main structure through which test execution is + * coordinated, and this will collect output and results for all executed + * tests. + */ constructor(); -/** -* Inform this context about runtime arguments passed to the test -* harness. -* @param {any[]} args -*/ - args(args: any[]): void; -/** -* Executes a list of tests, returning a promise representing their -* eventual completion. -* -* This is the main entry point for executing tests. All the tests passed -* in are the JS `Function` object that was plucked off the -* `WebAssembly.Instance` exports list. -* -* The promise returned resolves to either `true` if all tests passed or -* `false` if at least one test failed. -* @param {any[]} tests -* @returns {Promise} -*/ + /** + * Handle `--include-ignored` flag. + */ + include_ignored(include_ignored: boolean): void; + /** + * Handle filter argument. + */ + filtered_count(filtered: number): void; + /** + * Executes a list of tests, returning a promise representing their + * eventual completion. + * + * This is the main entry point for executing tests. All the tests passed + * in are the JS `Function` object that was plucked off the + * `WebAssembly.Instance` exports list. + * + * The promise returned resolves to either `true` if all tests passed or + * `false` if at least one test failed. + */ run(tests: any[]): Promise; } @@ -94,30 +81,35 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl export interface InitOutput { readonly memory: WebAssembly.Memory; readonly __wbg_encrypt_free: (a: number, b: number) => void; + readonly __wbg_encryptedvote_free: (a: number, b: number) => void; + readonly encryptedvote_encrypted_vote: (a: number) => [number, number]; + readonly encryptedvote_circuit_inputs: (a: number) => [number, number]; readonly encrypt_new: () => number; - readonly encrypt_encrypt_vote: (a: number, b: number, c: number, d: number, e: number) => void; - readonly __wbgt_test_encrypt_vote_0: (a: number) => void; + readonly encrypt_encrypt_vote: (a: number, b: bigint, c: number, d: number) => [number, number, number]; readonly encrypt_test: () => void; readonly __wbg_wasmbindgentestcontext_free: (a: number, b: number) => void; readonly wasmbindgentestcontext_new: () => number; - readonly wasmbindgentestcontext_args: (a: number, b: number, c: number) => void; - readonly wasmbindgentestcontext_run: (a: number, b: number, c: number) => number; - readonly __wbgtest_console_log: (a: number) => void; - readonly __wbgtest_console_debug: (a: number) => void; - readonly __wbgtest_console_info: (a: number) => void; - readonly __wbgtest_console_warn: (a: number) => void; - readonly __wbgtest_console_error: (a: number) => void; - readonly __wbgtest_cov_dump: (a: number) => void; + readonly wasmbindgentestcontext_include_ignored: (a: number, b: number) => void; + readonly wasmbindgentestcontext_filtered_count: (a: number, b: number) => void; + readonly wasmbindgentestcontext_run: (a: number, b: number, c: number) => any; + readonly __wbgtest_console_log: (a: any) => void; + readonly __wbgtest_console_debug: (a: any) => void; + readonly __wbgtest_console_info: (a: any) => void; + readonly __wbgtest_console_warn: (a: any) => void; + readonly __wbgtest_console_error: (a: any) => void; + readonly __wbgtest_cov_dump: () => [number, number]; + readonly __externref_table_alloc: () => number; + readonly __wbindgen_export_1: WebAssembly.Table; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; - readonly __wbindgen_export_2: WebAssembly.Table; - readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d8c1928bfa3ee85: (a: number, b: number, c: number) => void; - readonly __wbindgen_add_to_stack_pointer: (a: number) => number; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; - readonly wasm_bindgen__convert__closures__invoke0_mut__h39c761bb9a2bf959: (a: number, b: number) => void; readonly __wbindgen_exn_store: (a: number) => void; - readonly wasm_bindgen__convert__closures__invoke3_mut__h4031e454ad97d11c: (a: number, b: number, c: number, d: number, e: number) => void; - readonly wasm_bindgen__convert__closures__invoke2_mut__hc0d7ba91596f2e65: (a: number, b: number, c: number, d: number) => void; + readonly __wbindgen_export_5: WebAssembly.Table; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __externref_table_dealloc: (a: number) => void; + readonly closure281_externref_shim: (a: number, b: number, c: any) => void; + readonly closure197_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; + readonly closure201_externref_shim: (a: number, b: number, c: any, d: any) => void; + readonly __wbindgen_start: () => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js index 2b1a912863..be77b22b48 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js @@ -1,28 +1,16 @@ let wasm; -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -function getObject(idx) { return heap[idx]; } - -let heap_next = heap.length; - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; +function isLikeNone(x) { + return x === undefined || x === null; } -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_export_1.set(idx, obj); + return idx; } -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); - -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; +let WASM_VECTOR_LEN = 0; let cachedUint8ArrayMemory0 = null; @@ -33,22 +21,6 @@ function getUint8ArrayMemory0() { return cachedUint8ArrayMemory0; } -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); -} - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -let WASM_VECTOR_LEN = 0; - const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' @@ -103,10 +75,6 @@ function passStringToWasm0(arg, malloc, realloc) { return ptr; } -function isLikeNone(x) { - return x === undefined || x === null; -} - let cachedDataViewMemory0 = null; function getDataViewMemory0() { @@ -116,75 +84,28 @@ function getDataViewMemory0() { return cachedDataViewMemory0; } -function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(state => { - wasm.__wbindgen_export_2.get(state.dtor)(state.a, state.b) + wasm.__wbindgen_export_5.get(state.dtor)(state.a, state.b) }); function makeMutClosure(arg0, arg1, dtor, f) { @@ -200,7 +121,7 @@ function makeMutClosure(arg0, arg1, dtor, f) { return f(a, state.b, ...args); } finally { if (--state.cnt === 0) { - wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); + wasm.__wbindgen_export_5.get(state.dtor)(a, state.b); CLOSURE_DTORS.unregister(state); } else { state.a = a; @@ -211,8 +132,10 @@ function makeMutClosure(arg0, arg1, dtor, f) { CLOSURE_DTORS.register(real, state, state); return real; } -function __wbg_adapter_28(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d8c1928bfa3ee85(arg0, arg1, addHeapObject(arg2)); + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); } function passArray8ToWasm0(arg, malloc) { @@ -222,137 +145,94 @@ function passArray8ToWasm0(arg, malloc) { return ptr; } -function getArrayU8FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +function takeFromExternrefTable0(idx) { + const value = wasm.__wbindgen_export_1.get(idx); + wasm.__externref_table_dealloc(idx); + return value; +} +/** + * @returns {Uint8Array | undefined} + */ +export function __wbgtest_cov_dump() { + const ret = wasm.__wbgtest_cov_dump(); + let v1; + if (ret[0] !== 0) { + v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; } function passArrayJsValueToWasm0(array, malloc) { const ptr = malloc(array.length * 4, 4) >>> 0; - const mem = getDataViewMemory0(); for (let i = 0; i < array.length; i++) { - mem.setUint32(ptr + 4 * i, addHeapObject(array[i]), true); + const add = addToExternrefTable0(array[i]); + getDataViewMemory0().setUint32(ptr + 4 * i, add, true); } WASM_VECTOR_LEN = array.length; return ptr; } - -let stack_pointer = 128; - -function addBorrowedObject(obj) { - if (stack_pointer == 1) throw new Error('out of js stack'); - heap[--stack_pointer] = obj; - return stack_pointer; -} /** -* Handler for `console.log` invocations. -* -* If a test is currently running it takes the `args` array and stringifies -* it and appends it to the current output of the test. Otherwise it passes -* the arguments to the original `console.log` function, psased as -* `original`. -* @param {Array} args -*/ + * Handler for `console.log` invocations. + * + * If a test is currently running it takes the `args` array and stringifies + * it and appends it to the current output of the test. Otherwise it passes + * the arguments to the original `console.log` function, psased as + * `original`. + * @param {Array} args + */ export function __wbgtest_console_log(args) { - try { - wasm.__wbgtest_console_log(addBorrowedObject(args)); - } finally { - heap[stack_pointer++] = undefined; - } + wasm.__wbgtest_console_log(args); } /** -* Handler for `console.debug` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.debug` invocations. See above. + * @param {Array} args + */ export function __wbgtest_console_debug(args) { - try { - wasm.__wbgtest_console_debug(addBorrowedObject(args)); - } finally { - heap[stack_pointer++] = undefined; - } + wasm.__wbgtest_console_debug(args); } /** -* Handler for `console.info` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.info` invocations. See above. + * @param {Array} args + */ export function __wbgtest_console_info(args) { - try { - wasm.__wbgtest_console_info(addBorrowedObject(args)); - } finally { - heap[stack_pointer++] = undefined; - } + wasm.__wbgtest_console_info(args); } /** -* Handler for `console.warn` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.warn` invocations. See above. + * @param {Array} args + */ export function __wbgtest_console_warn(args) { - try { - wasm.__wbgtest_console_warn(addBorrowedObject(args)); - } finally { - heap[stack_pointer++] = undefined; - } + wasm.__wbgtest_console_warn(args); } /** -* Handler for `console.error` invocations. See above. -* @param {Array} args -*/ + * Handler for `console.error` invocations. See above. + * @param {Array} args + */ export function __wbgtest_console_error(args) { - try { - wasm.__wbgtest_console_error(addBorrowedObject(args)); - } finally { - heap[stack_pointer++] = undefined; - } -} - -function __wbg_adapter_44(arg0, arg1) { - wasm.wasm_bindgen__convert__closures__invoke0_mut__h39c761bb9a2bf959(arg0, arg1); + wasm.__wbgtest_console_error(args); } -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} -/** -* @returns {Uint8Array | undefined} -*/ -export function __wbgtest_cov_dump() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.__wbgtest_cov_dump(retptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - let v1; - if (r0 !== 0) { - v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - } - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } +function __wbg_adapter_28(arg0, arg1, arg2) { + wasm.closure281_externref_shim(arg0, arg1, arg2); } -function __wbg_adapter_108(arg0, arg1, arg2, arg3, arg4) { - wasm.wasm_bindgen__convert__closures__invoke3_mut__h4031e454ad97d11c(arg0, arg1, addHeapObject(arg2), arg3, addHeapObject(arg4)); +function __wbg_adapter_52(arg0, arg1, arg2, arg3, arg4) { + wasm.closure197_externref_shim(arg0, arg1, arg2, arg3, arg4); } -function __wbg_adapter_121(arg0, arg1, arg2, arg3) { - wasm.wasm_bindgen__convert__closures__invoke2_mut__hc0d7ba91596f2e65(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); +function __wbg_adapter_65(arg0, arg1, arg2, arg3) { + wasm.closure201_externref_shim(arg0, arg1, arg2, arg3); } const EncryptFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_encrypt_free(ptr >>> 0, 1)); -/** -*/ + export class Encrypt { __destroy_into_raw() { @@ -366,8 +246,6 @@ export class Encrypt { const ptr = this.__destroy_into_raw(); wasm.__wbg_encrypt_free(ptr, 0); } - /** - */ constructor() { const ret = wasm.encrypt_new(); this.__wbg_ptr = ret >>> 0; @@ -375,46 +253,84 @@ export class Encrypt { return this; } /** - * @param {bigint} vote - * @param {Uint8Array} public_key - * @returns {Uint8Array} - */ + * @param {bigint} vote + * @param {Uint8Array} public_key + * @returns {EncryptedVote} + */ encrypt_vote(vote, public_key) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passArray8ToWasm0(public_key, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - wasm.encrypt_encrypt_vote(retptr, this.__wbg_ptr, vote, ptr0, len0); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); - var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); - if (r3) { - throw takeObject(r2); - } - var v2 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v2; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + const ptr0 = passArray8ToWasm0(public_key, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.encrypt_encrypt_vote(this.__wbg_ptr, vote, ptr0, len0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); } + return EncryptedVote.__wrap(ret[0]); } - /** - */ static test() { wasm.encrypt_test(); } } +const EncryptedVoteFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_encryptedvote_free(ptr >>> 0, 1)); + +export class EncryptedVote { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(EncryptedVote.prototype); + obj.__wbg_ptr = ptr; + EncryptedVoteFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + EncryptedVoteFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_encryptedvote_free(ptr, 0); + } + /** + * @returns {Uint8Array} + */ + get encrypted_vote() { + const ret = wasm.encryptedvote_encrypted_vote(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * @returns {string} + */ + get circuit_inputs() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.encryptedvote_circuit_inputs(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } +} + const WasmBindgenTestContextFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_wasmbindgentestcontext_free(ptr >>> 0, 1)); /** -* Runtime test harness support instantiated in JS. -* -* The node.js entry script instantiates a `Context` here which is used to -* drive test execution. -*/ + * Runtime test harness support instantiated in JS. + * + * The node.js entry script instantiates a `Context` here which is used to + * drive test execution. + */ export class WasmBindgenTestContext { __destroy_into_raw() { @@ -429,12 +345,12 @@ export class WasmBindgenTestContext { wasm.__wbg_wasmbindgentestcontext_free(ptr, 0); } /** - * Creates a new context ready to run tests. - * - * A `Context` is the main structure through which test execution is - * coordinated, and this will collect output and results for all executed - * tests. - */ + * Creates a new context ready to run tests. + * + * A `Context` is the main structure through which test execution is + * coordinated, and this will collect output and results for all executed + * tests. + */ constructor() { const ret = wasm.wasmbindgentestcontext_new(); this.__wbg_ptr = ret >>> 0; @@ -442,33 +358,37 @@ export class WasmBindgenTestContext { return this; } /** - * Inform this context about runtime arguments passed to the test - * harness. - * @param {any[]} args - */ - args(args) { - const ptr0 = passArrayJsValueToWasm0(args, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - wasm.wasmbindgentestcontext_args(this.__wbg_ptr, ptr0, len0); + * Handle `--include-ignored` flag. + * @param {boolean} include_ignored + */ + include_ignored(include_ignored) { + wasm.wasmbindgentestcontext_include_ignored(this.__wbg_ptr, include_ignored); + } + /** + * Handle filter argument. + * @param {number} filtered + */ + filtered_count(filtered) { + wasm.wasmbindgentestcontext_filtered_count(this.__wbg_ptr, filtered); } /** - * Executes a list of tests, returning a promise representing their - * eventual completion. - * - * This is the main entry point for executing tests. All the tests passed - * in are the JS `Function` object that was plucked off the - * `WebAssembly.Instance` exports list. - * - * The promise returned resolves to either `true` if all tests passed or - * `false` if at least one test failed. - * @param {any[]} tests - * @returns {Promise} - */ + * Executes a list of tests, returning a promise representing their + * eventual completion. + * + * This is the main entry point for executing tests. All the tests passed + * in are the JS `Function` object that was plucked off the + * `WebAssembly.Instance` exports list. + * + * The promise returned resolves to either `true` if all tests passed or + * `false` if at least one test failed. + * @param {any[]} tests + * @returns {Promise} + */ run(tests) { const ptr0 = passArrayJsValueToWasm0(tests, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ret = wasm.wasmbindgentestcontext_run(this.__wbg_ptr, ptr0, len0); - return takeObject(ret); + return ret; } } @@ -480,7 +400,7 @@ async function __wbg_load(module, imports) { } catch (e) { if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); } else { throw e; @@ -506,135 +426,237 @@ async function __wbg_load(module, imports) { function __wbg_get_imports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); + imports.wbg.__wbg_Deno_5e0f323eeba20aa4 = function(arg0) { + const ret = arg0.Deno; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); }; - imports.wbg.__wbg_log_4c6146472facbfaa = function(arg0, arg1) { - console.log(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbg_String_e73d90ae9c871912 = function(arg0, arg1) { - const ret = String(getObject(arg1)); + imports.wbg.__wbg_String_6f4330ab5fd77ef6 = function(arg0, arg1) { + const ret = String(arg1); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; - imports.wbg.__wbg_getElementById_8e651e19b1db8af4 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); - return addHeapObject(ret); + imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) { + const ret = arg0.buffer; + return ret; }; - imports.wbg.__wbg_settextcontent_f5ce03c2d5452fdb = function(arg0, arg1, arg2) { - getObject(arg0).textContent = getStringFromWasm0(arg1, arg2); + imports.wbg.__wbg_call_672a4d21634d4a24 = function() { return handleError(function (arg0, arg1) { + const ret = arg0.call(arg1); + return ret; + }, arguments) }; + imports.wbg.__wbg_call_7cccdd69e0791ae2 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = arg0.call(arg1, arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_constructor_75c512bc262c1ab2 = function(arg0) { + const ret = arg0.constructor; + return ret; }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + imports.wbg.__wbg_crypto_574e78ad8b13b65f = function(arg0) { + const ret = arg0.crypto; + return ret; }; - imports.wbg.__wbindgen_number_new = function(arg0) { - const ret = arg0; - return addHeapObject(ret); + imports.wbg.__wbg_error_f19acdc6b5fafb26 = function(arg0, arg1) { + console.error(getStringFromWasm0(arg0, arg1)); }; - imports.wbg.__wbg_wbgtestinvoke_a9c01fbf474f5d4b = function() { return handleError(function (arg0, arg1) { + imports.wbg.__wbg_forEach_d6a05ca96422eff9 = function(arg0, arg1, arg2) { try { - var state0 = {a: arg0, b: arg1}; - var cb0 = () => { + var state0 = {a: arg1, b: arg2}; + var cb0 = (arg0, arg1, arg2) => { const a = state0.a; state0.a = 0; try { - return __wbg_adapter_44(a, state0.b, ); + return __wbg_adapter_52(a, state0.b, arg0, arg1, arg2); } finally { state0.a = a; } }; - __wbg_test_invoke(cb0); + arg0.forEach(cb0); } finally { state0.a = state0.b = 0; } + }; + imports.wbg.__wbg_getElementById_727e92dd724c370c = function(arg0, arg1, arg2) { + const ret = arg0.getElementById(getStringFromWasm0(arg1, arg2)); + return ret; + }; + imports.wbg.__wbg_getRandomValues_b8f5dbd5f3995a9e = function() { return handleError(function (arg0, arg1) { + arg0.getRandomValues(arg1); }, arguments) }; - imports.wbg.__wbg_wbgtestoutputwriteln_af26aa5032b93b71 = function(arg0) { - __wbg_test_output_writeln(takeObject(arg0)); + imports.wbg.__wbg_log_c222819a41e063d3 = function(arg0) { + console.log(arg0); }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); + imports.wbg.__wbg_message_97a2af9b89d693a3 = function(arg0) { + const ret = arg0.message; + return ret; }; - imports.wbg.__wbg_stack_0cf5246a8b98a5c3 = function(arg0) { - const ret = getObject(arg0).stack; - return addHeapObject(ret); + imports.wbg.__wbg_msCrypto_a61aeb35a24c1329 = function(arg0) { + const ret = arg0.msCrypto; + return ret; }; - imports.wbg.__wbg_textcontent_9f35c3e14d1b1ad8 = function(arg0, arg1) { - const ret = getObject(arg1).textContent; + imports.wbg.__wbg_name_0b327d569f00ebee = function(arg0) { + const ret = arg0.name; + return ret; + }; + imports.wbg.__wbg_name_ac50ab7b6b731bdc = function(arg0, arg1) { + const ret = arg1.name; const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; - imports.wbg.__wbg_stack_b18cfcfd5aef8d27 = function(arg0) { - const ret = getObject(arg0).stack; - return addHeapObject(ret); + imports.wbg.__wbg_new_23a2665fac83c611 = function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_65(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return ret; + } finally { + state0.a = state0.b = 0; + } + }; + imports.wbg.__wbg_new_78093c5bd701d017 = function() { + const ret = new Error(); + return ret; }; - imports.wbg.__wbg_static_accessor_DOCUMENT_c9d3ded98505f352 = function() { - const ret = document; - return addHeapObject(ret); + imports.wbg.__wbg_new_a12002a7f91c75be = function(arg0) { + const ret = new Uint8Array(arg0); + return ret; + }; + imports.wbg.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return ret; + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) { + const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0); + return ret; + }; + imports.wbg.__wbg_newwithlength_a381634e90c276d4 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return ret; + }; + imports.wbg.__wbg_node_905d3e251edff8a2 = function(arg0) { + const ret = arg0.node; + return ret; + }; + imports.wbg.__wbg_now_832024c17817dc01 = function(arg0) { + const ret = arg0.now(); + return ret; + }; + imports.wbg.__wbg_performance_ae5e84dd26af6765 = function(arg0) { + const ret = arg0.performance; + return ret; }; - imports.wbg.__wbg_self_91e88697873c977b = function(arg0) { - const ret = getObject(arg0).self; - return isLikeNone(ret) ? 0 : addHeapObject(ret); + imports.wbg.__wbg_process_dc0fbacc7c1c06f7 = function(arg0) { + const ret = arg0.process; + return ret; + }; + imports.wbg.__wbg_queueMicrotask_97d92b4fcc8a61c5 = function(arg0) { + queueMicrotask(arg0); }; - imports.wbg.__wbg_constructor_2aca75e2f55853d3 = function(arg0) { - const ret = getObject(arg0).constructor; - return addHeapObject(ret); + imports.wbg.__wbg_queueMicrotask_d3219def82552485 = function(arg0) { + const ret = arg0.queueMicrotask; + return ret; }; - imports.wbg.__wbg_name_8e788143eb60943f = function(arg0, arg1) { - const ret = getObject(arg1).name; + imports.wbg.__wbg_randomFillSync_ac0988aba3254290 = function() { return handleError(function (arg0, arg1) { + arg0.randomFillSync(arg1); + }, arguments) }; + imports.wbg.__wbg_require_60cc747a6bc5215a = function() { return handleError(function () { + const ret = module.require; + return ret; + }, arguments) }; + imports.wbg.__wbg_resolve_4851785c9c5f573d = function(arg0) { + const ret = Promise.resolve(arg0); + return ret; + }; + imports.wbg.__wbg_self_67c28212685dfde2 = function(arg0) { + const ret = arg0.self; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_set_65595bdd868b3009 = function(arg0, arg1, arg2) { + arg0.set(arg1, arg2 >>> 0); + }; + imports.wbg.__wbg_settextcontent_4516425a935f461b = function(arg0, arg1, arg2) { + arg0.textContent = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_stack_54b23675007f71bb = function(arg0, arg1) { + const ret = arg1.stack; const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; - imports.wbg.__wbg_Deno_5db6104106b466fc = function(arg0) { - const ret = getObject(arg0).Deno; - return isLikeNone(ret) ? 0 : addHeapObject(ret); - }; - imports.wbg.__wbg_stack_b73d0c34f7b4416b = function(arg0, arg1) { - const ret = getObject(arg1).stack; + imports.wbg.__wbg_stack_8e0a01ea26c1db11 = function(arg0, arg1) { + const ret = arg1.stack; const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; - imports.wbg.__wbg_new_abda76e883ba8a5f = function() { - const ret = new Error(); - return addHeapObject(ret); + imports.wbg.__wbg_stack_d6edc2612f9df83f = function(arg0) { + const ret = arg0.stack; + return ret; }; - imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { - const ret = getObject(arg1).stack; + imports.wbg.__wbg_stack_f851a06e9c78be1d = function(arg0) { + const ret = arg0.stack; + return ret; + }; + imports.wbg.__wbg_static_accessor_DOCUMENT_2badde8ae57cc9f7 = function() { + const ret = document; + return ret; + }; + imports.wbg.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_subarray_aa9065fa9dc5df96 = function(arg0, arg1, arg2) { + const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0); + return ret; + }; + imports.wbg.__wbg_textcontent_9581a1676431df94 = function(arg0, arg1) { + const ret = arg1.textContent; const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; - imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } + imports.wbg.__wbg_then_44b73946d2fb3e7d = function(arg0, arg1) { + const ret = arg0.then(arg1); + return ret; + }; + imports.wbg.__wbg_versions_c01dfd4722a88165 = function(arg0) { + const ret = arg0.versions; + return ret; + }; + imports.wbg.__wbg_wbgtestogconsolelog_2c6a12219a99cdb3 = function(arg0, arg1) { + __wbgtest_og_console_log(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_wbgtestoutputwriteln_be640e64b2946d47 = function(arg0) { + __wbg_test_output_writeln(arg0); }; imports.wbg.__wbindgen_cb_drop = function(arg0) { - const obj = takeObject(arg0).original; + const obj = arg0.original; if (obj.cnt-- == 1) { obj.a = 0; return true; @@ -642,195 +664,60 @@ function __wbg_get_imports() { const ret = false; return ret; }; - imports.wbg.__wbg_queueMicrotask_12a30234db4045d3 = function(arg0) { - queueMicrotask(getObject(arg0)); + imports.wbg.__wbindgen_closure_wrapper1885 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 282, __wbg_adapter_28); + return ret; }; - imports.wbg.__wbg_queueMicrotask_48421b3cc9052b68 = function(arg0) { - const ret = getObject(arg0).queueMicrotask; - return addHeapObject(ret); + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_1; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; }; imports.wbg.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; + const ret = typeof(arg0) === 'function'; return ret; }; - imports.wbg.__wbg_debug_5fb96680aecf5dc8 = function(arg0) { - console.debug(getObject(arg0)); - }; - imports.wbg.__wbg_error_8e3928cfb8a43e2b = function(arg0) { - console.error(getObject(arg0)); - }; - imports.wbg.__wbg_info_530a29cb2e4e3304 = function(arg0) { - console.info(getObject(arg0)); - }; - imports.wbg.__wbg_log_5bb5f88f245d7762 = function(arg0) { - console.log(getObject(arg0)); - }; - imports.wbg.__wbg_warn_63bbae1730aead09 = function(arg0) { - console.warn(getObject(arg0)); - }; - imports.wbg.__wbg_crypto_566d7465cdbb6b7a = function(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); - }; imports.wbg.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); + const val = arg0; const ret = typeof(val) === 'object' && val !== null; return ret; }; - imports.wbg.__wbg_process_dc09a8c7d59982f6 = function(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); - }; - imports.wbg.__wbg_versions_d98c6400c6ca2bd8 = function(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); - }; - imports.wbg.__wbg_node_caaf83d002149bd5 = function(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); - }; imports.wbg.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; + const ret = typeof(arg0) === 'string'; return ret; }; - imports.wbg.__wbg_require_94a9da52636aacbf = function() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_msCrypto_0b84745e9245cdf6 = function(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); - }; - imports.wbg.__wbg_randomFillSync_290977693942bf03 = function() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); - }, arguments) }; - imports.wbg.__wbg_getRandomValues_260cc23a41afad9a = function() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); - }, arguments) }; - imports.wbg.__wbg_newnoargs_76313bd6ff35d0f2 = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_self_3093d5d1f7bcb682 = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_window_3bcfc4d31bc012f8 = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_globalThis_86b222e13bdf32ed = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_global_e5a3fe56f8be9485 = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); - }, arguments) }; imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; + const ret = arg0 === undefined; return ret; }; - imports.wbg.__wbg_forEach_1778105a4f7c1a63 = function(arg0, arg1, arg2) { - try { - var state0 = {a: arg1, b: arg2}; - var cb0 = (arg0, arg1, arg2) => { - const a = state0.a; - state0.a = 0; - try { - return __wbg_adapter_108(a, state0.b, arg0, arg1, arg2); - } finally { - state0.a = a; - } - }; - getObject(arg0).forEach(cb0); - } finally { - state0.a = state0.b = 0; - } - }; - imports.wbg.__wbg_message_e18bae0a0e2c097a = function(arg0) { - const ret = getObject(arg0).message; - return addHeapObject(ret); - }; - imports.wbg.__wbg_name_ac78212e803c7941 = function(arg0) { - const ret = getObject(arg0).name; - return addHeapObject(ret); - }; - imports.wbg.__wbg_call_89af060b4e1523f2 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_b85e72ed1bfd57f9 = function(arg0, arg1) { - try { - var state0 = {a: arg0, b: arg1}; - var cb0 = (arg0, arg1) => { - const a = state0.a; - state0.a = 0; - try { - return __wbg_adapter_121(a, state0.b, arg0, arg1); - } finally { - state0.a = a; - } - }; - const ret = new Promise(cb0); - return addHeapObject(ret); - } finally { - state0.a = state0.b = 0; - } - }; - imports.wbg.__wbg_resolve_570458cb99d56a43 = function(arg0) { - const ret = Promise.resolve(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_then_95e6edc0f89b73b1 = function(arg0, arg1) { - const ret = getObject(arg0).then(getObject(arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }; - imports.wbg.__wbg_newwithbyteoffsetandlength_8a2cb9ca96b27ec9 = function(arg0, arg1, arg2) { - const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }; - imports.wbg.__wbg_newwithlength_ec548f448387c968 = function(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return ret; }; - imports.wbg.__wbg_subarray_7c2e3576afe181d1 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return ret; }; - imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = arg1; + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return ret; + }; imports.wbg.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }; - imports.wbg.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_closure_wrapper247 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 76, __wbg_adapter_28); - return addHeapObject(ret); - }; return imports; } @@ -846,7 +733,7 @@ function __wbg_finalize_init(instance, module) { cachedUint8ArrayMemory0 = null; - + wasm.__wbindgen_start(); return wasm; } @@ -854,10 +741,13 @@ function initSync(module) { if (wasm !== undefined) return wasm; - if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) - ({module} = module) - else - console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } const imports = __wbg_get_imports(); @@ -876,10 +766,13 @@ async function __wbg_init(module_or_path) { if (wasm !== undefined) return wasm; - if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) - ({module_or_path} = module_or_path) - else - console.warn('using deprecated parameters for the initialization function; pass a single object instead') + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } if (typeof module_or_path === 'undefined') { module_or_path = new URL('crisp_wasm_crypto_bg.wasm', import.meta.url); diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm index 1698cae66e03a3364c3494e4e1ae47df8ef78488..62be58c764708f306aafacd8a9814c178a5b6b7a 100644 GIT binary patch literal 639531 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�_)6;thf(I+>3+#N~KNd-}0QGwmJjs1rCH*!)uK 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

>&j! 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%0AjwPWdS` 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ǥ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 UUs>k%^$IUVKQG3qfC~5j2Vc^4-~a#s literal 513514 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

ihYoq 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 z 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 diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts index 9ac108a13f..2fc8ccb1c8 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts @@ -1,28 +1,33 @@ /* tslint:disable */ /* eslint-disable */ export const memory: WebAssembly.Memory; -export function __wbg_encrypt_free(a: number, b: number): void; -export function encrypt_new(): number; -export function encrypt_encrypt_vote(a: number, b: number, c: number, d: number, e: number): void; -export function __wbgt_test_encrypt_vote_0(a: number): void; -export function encrypt_test(): void; -export function __wbg_wasmbindgentestcontext_free(a: number, b: number): void; -export function wasmbindgentestcontext_new(): number; -export function wasmbindgentestcontext_args(a: number, b: number, c: number): void; -export function wasmbindgentestcontext_run(a: number, b: number, c: number): number; -export function __wbgtest_console_log(a: number): void; -export function __wbgtest_console_debug(a: number): void; -export function __wbgtest_console_info(a: number): void; -export function __wbgtest_console_warn(a: number): void; -export function __wbgtest_console_error(a: number): void; -export function __wbgtest_cov_dump(a: number): void; -export function __wbindgen_malloc(a: number, b: number): number; -export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; -export const __wbindgen_export_2: WebAssembly.Table; -export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1d8c1928bfa3ee85(a: number, b: number, c: number): void; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_free(a: number, b: number, c: number): void; -export function wasm_bindgen__convert__closures__invoke0_mut__h39c761bb9a2bf959(a: number, b: number): void; -export function __wbindgen_exn_store(a: number): void; -export function wasm_bindgen__convert__closures__invoke3_mut__h4031e454ad97d11c(a: number, b: number, c: number, d: number, e: number): void; -export function wasm_bindgen__convert__closures__invoke2_mut__hc0d7ba91596f2e65(a: number, b: number, c: number, d: number): void; +export const __wbg_encrypt_free: (a: number, b: number) => void; +export const __wbg_encryptedvote_free: (a: number, b: number) => void; +export const encryptedvote_encrypted_vote: (a: number) => [number, number]; +export const encryptedvote_circuit_inputs: (a: number) => [number, number]; +export const encrypt_new: () => number; +export const encrypt_encrypt_vote: (a: number, b: bigint, c: number, d: number) => [number, number, number]; +export const encrypt_test: () => void; +export const __wbg_wasmbindgentestcontext_free: (a: number, b: number) => void; +export const wasmbindgentestcontext_new: () => number; +export const wasmbindgentestcontext_include_ignored: (a: number, b: number) => void; +export const wasmbindgentestcontext_filtered_count: (a: number, b: number) => void; +export const wasmbindgentestcontext_run: (a: number, b: number, c: number) => any; +export const __wbgtest_console_log: (a: any) => void; +export const __wbgtest_console_debug: (a: any) => void; +export const __wbgtest_console_info: (a: any) => void; +export const __wbgtest_console_warn: (a: any) => void; +export const __wbgtest_console_error: (a: any) => void; +export const __wbgtest_cov_dump: () => [number, number]; +export const __externref_table_alloc: () => number; +export const __wbindgen_export_1: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_exn_store: (a: number) => void; +export const __wbindgen_export_5: WebAssembly.Table; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __externref_table_dealloc: (a: number) => void; +export const closure281_externref_shim: (a: number, b: number, c: any) => void; +export const closure197_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; +export const closure201_externref_shim: (a: number, b: number, c: any, d: any) => void; +export const __wbindgen_start: () => void; diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js index be650998b9..7dadde0896 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js @@ -20,8 +20,17 @@ self.onmessage = async function (event) { if (!wasmInstance || !encryptInstance) { await initWasm(); } - const encryptedVote = encryptInstance.encrypt_vote(voteId, publicKey); - self.postMessage({ type: 'encrypt_vote', success: true, encryptedVote }); + const result = encryptInstance.encrypt_vote(voteId, publicKey); + const circuitInputs = JSON.parse(result.circuit_inputs); + console.log('vote generated', circuitInputs); + self.postMessage({ + type: 'encrypt_vote', + success: true, + encryptedVote: { + vote: result.encrypted_vote, + circuitInputs, + }, + }); } catch (error) { self.postMessage({ type: 'encrypt_vote', success: false, error: error.message }); } diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/package.json b/examples/CRISP/apps/client/libs/wasm/pkg/package.json deleted file mode 100644 index ee0f7eb5f8..0000000000 --- a/examples/CRISP/apps/client/libs/wasm/pkg/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "crisp-wasm-crypto", - "type": "module", - "version": "0.1.0", - "repository": { - "type": "git", - "url": "https://github.com/gnosisguild/enclave" - }, - "files": [ - "crisp_wasm_crypto_bg.wasm", - "crisp_wasm_crypto.js", - "crisp_wasm_crypto.d.ts" - ], - "main": "crisp_wasm_crypto.js", - "types": "crisp_wasm_crypto.d.ts", - "sideEffects": [ - "./snippets/*" - ] -} \ No newline at end of file diff --git a/examples/CRISP/apps/client/package.json b/examples/CRISP/apps/client/package.json index 21a95f405f..56c2a1026d 100644 --- a/examples/CRISP/apps/client/package.json +++ b/examples/CRISP/apps/client/package.json @@ -17,8 +17,10 @@ "deploy": "gh-pages -d dist" }, "dependencies": { + "@aztec/bb.js": "^0.82.2", "@emotion/babel-plugin": "^11.11.0", "@emotion/react": "^11.11.4", + "@noir-lang/noir_js": "1.0.0-beta.3", "@phosphor-icons/react": "^2.1.4", "@semaphore-protocol/core": "^4.9.2", "@semaphore-protocol/data": "^4.9.2", diff --git a/examples/CRISP/apps/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/apps/client/src/context/voteManagement/VoteManagement.types.ts index b4d6a5e48c..44f7b25bdf 100644 --- a/examples/CRISP/apps/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/apps/client/src/context/voteManagement/VoteManagement.types.ts @@ -1,5 +1,5 @@ import { ReactNode } from 'react' -import { BroadcastVoteRequest, BroadcastVoteResponse, VoteStateLite, VotingRound } from '@/model/vote.model' +import { BroadcastVoteRequest, BroadcastVoteResponse, VoteStateLite, VotingRound, EncryptedVote } from '@/model/vote.model' import { Poll, PollRequestResult, PollResult } from '@/model/poll.model' import { Identity } from '@semaphore-protocol/core' @@ -28,7 +28,7 @@ export type VoteManagementContextType = { getPastPolls: () => Promise setVotingRound: React.Dispatch> setUser: React.Dispatch> - encryptVote: (voteId: bigint, publicKey: Uint8Array) => Promise + encryptVote: (voteId: bigint, publicKey: Uint8Array) => Promise registerIdentityOnContract: () => void broadcastVote: (vote: BroadcastVoteRequest) => Promise getRoundStateLite: (roundCount: number) => Promise diff --git a/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts index e35a443740..cf7dfa1db9 100644 --- a/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts @@ -73,7 +73,9 @@ export const useVoteCasting = () => { const voteRequest: BroadcastVoteRequest = { round_id: roundState.id, - enc_vote_bytes: Array.from(voteEncrypted), + enc_vote_bytes: Array.from(voteEncrypted.vote), + proof: Array.from(voteEncrypted.proof), + public_inputs: voteEncrypted.public_inputs, address: user.address, proof_sem: Array.from(proofBytes) }; diff --git a/examples/CRISP/apps/client/src/hooks/wasm/useWebAssembly.tsx b/examples/CRISP/apps/client/src/hooks/wasm/useWebAssembly.tsx index f9f8e5e010..41c76cb802 100644 --- a/examples/CRISP/apps/client/src/hooks/wasm/useWebAssembly.tsx +++ b/examples/CRISP/apps/client/src/hooks/wasm/useWebAssembly.tsx @@ -1,6 +1,11 @@ import { useState, useEffect } from 'react' import { handleGenericError } from '@/utils/handle-generic-error' import { useNotificationAlertContext } from '@/context/NotificationAlert' +import { EncryptedVote } from '@/model/vote.model' +import { + generateProof, + CircuitInputs, +} from '@/utils/proofUtils' export const useWebAssemblyHook = () => { const { showToast } = useNotificationAlertContext() @@ -17,20 +22,26 @@ export const useWebAssemblyHook = () => { } }, []) - const encryptVote = async (voteId: bigint, publicKey: Uint8Array): Promise => { + const encryptVote = async (voteId: bigint, publicKey: Uint8Array): Promise => { if (!worker) { console.error('WebAssembly worker not initialized') return } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { setIsLoading(true) worker.postMessage({ type: 'encrypt_vote', data: { voteId, publicKey } }) - worker.onmessage = (event) => { + worker.onmessage = async (event) => { const { type, success, encryptedVote, error } = event.data if (type === 'encrypt_vote') { if (success) { - resolve(encryptedVote) + const { vote, circuitInputs } = encryptedVote; + const { proof, publicInputs } = await generateProof(circuitInputs as CircuitInputs); + resolve({ + vote: vote, + proof: proof, + public_inputs: publicInputs, + }) } else { showToast({ type: 'danger', @@ -50,4 +61,3 @@ export const useWebAssemblyHook = () => { encryptVote, } } - diff --git a/examples/CRISP/apps/client/src/model/vote.model.ts b/examples/CRISP/apps/client/src/model/vote.model.ts index 0649593d8c..ed5e0b3cf1 100644 --- a/examples/CRISP/apps/client/src/model/vote.model.ts +++ b/examples/CRISP/apps/client/src/model/vote.model.ts @@ -18,6 +18,8 @@ export interface CurrentRound { export interface BroadcastVoteRequest { round_id: number; enc_vote_bytes: number[]; + proof: number[]; + public_inputs: string[]; address: string; proof_sem: number[]; } @@ -45,3 +47,9 @@ export interface VoteStateLite { committee_public_key: number[] emojis: [string, string] } + +export interface EncryptedVote { + vote: Uint8Array + proof: Uint8Array + public_inputs: string[] +} diff --git a/examples/CRISP/apps/client/src/utils/proofUtils.ts b/examples/CRISP/apps/client/src/utils/proofUtils.ts new file mode 100644 index 0000000000..dc20c788b9 --- /dev/null +++ b/examples/CRISP/apps/client/src/utils/proofUtils.ts @@ -0,0 +1,71 @@ +import { UltraHonkBackend, ProofData } from '@aztec/bb.js'; +import { Noir } from '@noir-lang/noir_js'; +import crisp_circuit from 'libs/noir/crisp_circuit.json'; + +export type Field = string; + +export type Polynomial = { + coefficients: Field[]; +}; + +export interface CircuitInputs { + pk0is: string[][]; + pk1is: string[][]; + ct0is: string[][]; + ct1is: string[][]; + u: string[]; + e0: string[]; + e1: string[]; + k1: string[]; + r1is: string[][]; + r2is: string[][]; + p1is: string[][]; + p2is: string[][]; +} + +export const convertToPolynomial = (stringArray: string[]): Polynomial => { + return { + coefficients: stringArray, + }; +}; + +export const convertToPolynomialArray = ( + stringArrays: string[][] +): Polynomial[] => { + return stringArrays.map(convertToPolynomial); +}; + +export const generateProof = async (circuitInputs: CircuitInputs): Promise => { + const noir = new Noir(crisp_circuit as any); + const backend = new UltraHonkBackend(crisp_circuit.bytecode, { threads: 4 }); + + const pk0is_poly = convertToPolynomialArray(circuitInputs.pk0is); + const pk1is_poly = convertToPolynomialArray(circuitInputs.pk1is); + const ct0is_poly = convertToPolynomialArray(circuitInputs.ct0is); + const ct1is_poly = convertToPolynomialArray(circuitInputs.ct1is); + const u_poly = convertToPolynomial(circuitInputs.u); + const e0_poly = convertToPolynomial(circuitInputs.e0); + const e1_poly = convertToPolynomial(circuitInputs.e1); + const k1_poly = convertToPolynomial(circuitInputs.k1); + const r1is_poly = convertToPolynomialArray(circuitInputs.r1is); + const r2is_poly = convertToPolynomialArray(circuitInputs.r2is); + const p1is_poly = convertToPolynomialArray(circuitInputs.p1is); + const p2is_poly = convertToPolynomialArray(circuitInputs.p2is); + + const { witness } = await noir.execute({ + pk0is: pk0is_poly, + pk1is: pk1is_poly, + ct0is: ct0is_poly, + ct1is: ct1is_poly, + u: u_poly, + e0: e0_poly, + e1: e1_poly, + k1: k1_poly, + r1is: r1is_poly, + r2is: r2is_poly, + p1is: p1is_poly, + p2is: p2is_poly, + }); + + return await backend.generateProof(witness, { keccak: true }); +}; \ No newline at end of file diff --git a/examples/CRISP/apps/client/src/utils/vote.ts b/examples/CRISP/apps/client/src/utils/vote.ts index 975e23b154..d2a716fc07 100644 --- a/examples/CRISP/apps/client/src/utils/vote.ts +++ b/examples/CRISP/apps/client/src/utils/vote.ts @@ -10,4 +10,4 @@ export const generateCrispRound = (votingAddress: string): VotingConfigRequest = ciphernode_count: 2, // We can hard code this so they don't have to choose voter_count: 0, // The server will replace this with a timestamp for how long they have to vote } -} +} \ No newline at end of file diff --git a/examples/CRISP/apps/client/tsconfig.json b/examples/CRISP/apps/client/tsconfig.json index 6160d3f9d3..d42a3cdbec 100644 --- a/examples/CRISP/apps/client/tsconfig.json +++ b/examples/CRISP/apps/client/tsconfig.json @@ -2,10 +2,13 @@ "compilerOptions": { "target": "ES2020", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], "module": "ESNext", "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -13,17 +16,30 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "paths": { - "@/*": ["./src/*"], - "libs/*": ["./libs/*"] + "@/*": [ + "./src/*" + ], + "libs/*": [ + "./libs/*" + ] } }, - "include": ["src", "src/**/*.d.ts", "pkg", "libs/wasm/pkg"], - "references": [{ "path": "./tsconfig.node.json" }] -} + "include": [ + "src", + "src/**/*.d.ts", + "pkg", + "libs/wasm/pkg", + "libs/noir" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/examples/CRISP/apps/client/vite.config.ts b/examples/CRISP/apps/client/vite.config.ts index 90cb4b681d..77016882df 100644 --- a/examples/CRISP/apps/client/vite.config.ts +++ b/examples/CRISP/apps/client/vite.config.ts @@ -16,7 +16,8 @@ export default defineConfig({ global: 'globalThis', }, optimizeDeps: { - exclude: ['@rollup/browser'], + esbuildOptions: { target: "esnext" }, + exclude: ['@rollup/browser', '@noir-lang/noirc_abi', '@noir-lang/acvm_js'], }, resolve: { alias: { diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index f2590c9d91..0dbca149e6 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bytes", "futures-core", "futures-sink", @@ -30,7 +30,7 @@ dependencies = [ "actix-service", "actix-utils", "base64", - "bitflags 2.9.0", + "bitflags 2.9.1", "brotli", "bytes", "bytestring", @@ -207,7 +207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -743,9 +743,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -754,9 +754,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", @@ -1712,9 +1712,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -1926,9 +1926,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.21" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -1974,9 +1974,9 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "const-hex" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" dependencies = [ "cfg-if", "cpufeatures", @@ -2548,9 +2548,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2558,9 +2558,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "fastrand" @@ -2884,9 +2884,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -3016,9 +3016,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -3123,11 +3123,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http 1.3.1", "hyper", "hyper-util", @@ -3136,7 +3135,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 0.26.11", + "webpki-roots", ] [[package]] @@ -3157,22 +3156,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -3248,9 +3253,9 @@ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", @@ -3264,9 +3269,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -3372,6 +3377,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -3450,7 +3465,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -3562,7 +3577,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", ] @@ -3609,9 +3624,9 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -3641,6 +3656,12 @@ dependencies = [ "hashbrown 0.15.3", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "macro-string" version = "0.1.4" @@ -3672,9 +3693,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -3715,7 +3736,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -3754,21 +3775,21 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "native-tls" @@ -3915,9 +3936,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -3988,11 +4009,11 @@ checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types 0.3.2", "libc", @@ -4020,9 +4041,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -4044,9 +4065,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parity-scale-codec" -version = "3.7.4" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec", "bitvec", @@ -4060,9 +4081,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.7.4" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4072,9 +4093,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -4082,9 +4103,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -4227,9 +4248,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", "syn 2.0.101", @@ -4338,7 +4359,7 @@ checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.0", + "bitflags 2.9.1", "lazy_static", "num-traits", "rand 0.8.5", @@ -4434,9 +4455,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -4454,12 +4475,13 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.3.2", + "getrandom 0.3.3", + "lru-slab", "rand 0.9.1", "ring", "rustc-hash", @@ -4564,7 +4586,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -4608,7 +4630,7 @@ version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -4674,9 +4696,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "base64", "bytes", @@ -4702,26 +4724,24 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.11", - "windows-registry", + "webpki-roots", ] [[package]] @@ -4980,7 +5000,7 @@ dependencies = [ "bytemuck", "cfg-if", "getrandom 0.2.16", - "getrandom 0.3.2", + "getrandom 0.3.3", "libm", "stability", ] @@ -5007,9 +5027,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -5080,7 +5100,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", @@ -5101,15 +5121,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -5122,9 +5133,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.2" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -5133,9 +5144,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rusty-fork" @@ -5217,7 +5228,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -5450,9 +5461,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5612,7 +5623,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "system-configuration-sys", ] @@ -5635,12 +5646,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5772,9 +5783,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -5900,6 +5911,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -6275,15 +6304,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - [[package]] name = "webpki-roots" version = "1.0.0" @@ -6317,15 +6337,15 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings 0.4.2", ] [[package]] @@ -6369,9 +6389,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] @@ -6387,9 +6407,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -6621,7 +6641,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 0b43d14473..10667ed65f 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -19,12 +19,12 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -130,7 +130,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.7.10", + "winnow", ] [[package]] @@ -262,14 +262,14 @@ dependencies = [ "const-hex", "derive_more 2.0.1", "foldhash", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "indexmap", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand", + "rand 0.8.5", "ruint", "rustc-hash", "serde", @@ -333,7 +333,7 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -353,7 +353,7 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -426,7 +426,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -442,7 +442,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "syn-solidity", "tiny-keccak", ] @@ -459,7 +459,7 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "syn-solidity", ] @@ -470,7 +470,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" dependencies = [ "serde", - "winnow 0.7.10", + "winnow", ] [[package]] @@ -500,7 +500,7 @@ dependencies = [ "serde_json", "thiserror 2.0.12", "tokio", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -516,7 +516,7 @@ dependencies = [ "alloy-transport", "reqwest", "serde_json", - "tower 0.5.2", + "tower", "tracing", "url", ] @@ -539,9 +539,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "ark-bn254" @@ -596,7 +596,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -629,7 +629,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "itertools 0.13.0", "num-bigint", "num-integer", @@ -671,7 +671,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -722,7 +722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -760,7 +760,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -803,7 +803,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -889,7 +889,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -911,7 +911,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -921,7 +921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -931,14 +931,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" dependencies = [ "serde", ] @@ -962,7 +962,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -973,25 +973,25 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -1022,9 +1022,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bincode" @@ -1058,9 +1058,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -1112,9 +1112,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1122,15 +1122,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1141,15 +1141,15 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" dependencies = [ "bytemuck_derive", ] @@ -1162,7 +1162,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1173,9 +1173,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -1197,9 +1197,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.23" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "shlex", ] @@ -1241,6 +1241,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1270,18 +1290,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1298,15 +1318,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1315,7 +1335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -1346,9 +1366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -1391,7 +1411,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "unicode-xid", ] @@ -1403,7 +1423,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "unicode-xid", ] @@ -1436,7 +1456,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1453,9 +1473,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" @@ -1505,14 +1525,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "either" -version = "1.12.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elf" @@ -1533,7 +1553,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -1568,36 +1588,36 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "ethnum" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -1623,11 +1643,11 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1646,10 +1666,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", - "thiserror 1.0.61", + "thiserror 1.0.69", "zeroize", "zeroize_derive", ] @@ -1669,10 +1689,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "sha2", - "thiserror 1.0.61", + "thiserror 1.0.69", "zeroize", ] @@ -1681,7 +1701,7 @@ name = "fhe-traits" version = "0.1.0-beta.7" source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -1693,7 +1713,7 @@ dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand", + "rand 0.8.5", "rayon", ] @@ -1704,7 +1724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -1754,7 +1774,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1840,7 +1860,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -1892,13 +1912,25 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -1920,7 +1952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1954,9 +1986,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -1972,9 +2004,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2077,20 +2109,24 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", - "tower 0.4.13", "tower-service", "tracing", ] @@ -2213,13 +2249,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] @@ -2235,7 +2271,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -2245,6 +2281,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2274,9 +2320,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" @@ -2290,9 +2336,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2312,9 +2358,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -2335,7 +2381,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -2346,9 +2392,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "light-poseidon" @@ -2359,14 +2405,14 @@ dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", "num-bigint", - "thiserror 1.0.61", + "thiserror 1.0.69", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -2386,9 +2432,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" @@ -2396,7 +2442,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -2407,7 +2453,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2421,9 +2467,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -2431,9 +2477,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "merlin" @@ -2443,7 +2489,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core", + "rand_core 0.6.4", "zeroize", ] @@ -2453,7 +2499,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2484,15 +2530,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.59.0", ] [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "native-tls" @@ -2566,7 +2612,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "serde", "smallvec", ] @@ -2623,9 +2669,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -2648,7 +2694,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2684,9 +2730,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" @@ -2694,7 +2740,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2711,7 +2757,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2734,28 +2780,30 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] @@ -2795,12 +2843,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ "memchr", - "thiserror 1.0.61", + "thiserror 2.0.12", "ucd-trie", ] @@ -2831,14 +2879,14 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2885,18 +2933,21 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -2907,7 +2958,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand", + "rand 0.8.5", ] [[package]] @@ -2923,9 +2974,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] @@ -2949,14 +3000,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -2969,11 +3020,11 @@ checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags 2.9.1", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -3008,7 +3059,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.98", + "syn 2.0.101", "tempfile", ] @@ -3022,7 +3073,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3042,13 +3093,19 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -3062,11 +3119,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", "serde", ] +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -3074,7 +3141,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -3083,7 +3160,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] @@ -3092,7 +3178,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3127,14 +3213,14 @@ version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -3144,9 +3230,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3155,20 +3241,19 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "base64", "bytes", "futures-core", - "futures-util", "http", "http-body", "http-body-util", @@ -3183,19 +3268,20 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", "tokio-native-tls", + "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] @@ -3210,9 +3296,9 @@ dependencies = [ [[package]] name = "risc0-binfmt" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f147f96a8a3058e699a5d39fc7e59d982f633751543ff4437cc0fb21f40b2e0" +checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" dependencies = [ "anyhow", "borsh", @@ -3222,16 +3308,16 @@ dependencies = [ "postcard", "risc0-zkp", "risc0-zkvm-platform", - "semver 1.0.23", + "semver 1.0.26", "serde", "tracing", ] [[package]] name = "risc0-circuit-keccak" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6af6fc80443a05d9e8e25aeba78082fc58e8a3c6a6b92017cae0a404494ba9" +checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" dependencies = [ "anyhow", "bytemuck", @@ -3245,9 +3331,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7bdd11df4ed470b3c032ac4c5bfb2729f6151af33ee255b66169de0c35611e" +checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" dependencies = [ "anyhow", "bytemuck", @@ -3260,9 +3346,9 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c98a4d9e438aac2e661b8376f6dd48b17a0949b29dbb0aed6e88e62de0bd5940" +checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" dependencies = [ "anyhow", "bit-vec", @@ -3284,14 +3370,14 @@ checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" dependencies = [ "bytemuck", "bytemuck_derive", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "risc0-groth16" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a800c55717c52f764325bdb18a164843d417a4c8c8a123b7d4206705c11a54c3" +checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -3310,9 +3396,9 @@ dependencies = [ [[package]] name = "risc0-zkos-v1compat" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa44e7cc6642e621c6f3eea56f57a765f8e599bf327f4d0f74921693234a5d62" +checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" dependencies = [ "include_bytes_aligned", "no_std_strings", @@ -3320,9 +3406,9 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023ed128cab28e4078330fffb65e9d079b3198958e3de6835f70c7ff285afeb4" +checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" dependencies = [ "anyhow", "blake2", @@ -3334,7 +3420,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core", + "rand_core 0.6.4", "risc0-core", "risc0-zkvm-platform", "serde", @@ -3345,15 +3431,15 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5881af78a17ca292037ef38383233f8d617ab679d68cc07c865e3ddabef1db80" +checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" dependencies = [ "anyhow", "borsh", "bytemuck", "derive_more 2.0.1", - "getrandom", + "getrandom 0.2.16", "hex", "risc0-binfmt", "risc0-circuit-keccak", @@ -3365,7 +3451,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rrs-lib", - "semver 1.0.23", + "semver 1.0.26", "serde", "sha2", "stability", @@ -3374,13 +3460,14 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed76ab12e5af4c93a3996e0609696cfdd0caebe8746af171ef583fa6e4af134" +checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" dependencies = [ "bytemuck", "cfg-if", - "getrandom", + "getrandom 0.2.16", + "getrandom 0.3.3", "libm", "stability", ] @@ -3407,9 +3494,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825df406ec217a8116bd7b06897c6cc8f65ffefc15d030ae2c9540acc9ed50b6" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -3423,7 +3510,8 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand", + "rand 0.8.5", + "rand 0.9.1", "rlp", "ruint-macro", "serde", @@ -3466,33 +3554,24 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.26", ] [[package]] name = "rustix" -version = "0.38.34" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", + "windows-sys 0.59.0", ] [[package]] @@ -3570,11 +3649,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -3602,18 +3681,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -3635,7 +3714,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3664,9 +3743,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -3685,9 +3764,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -3706,7 +3785,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3720,9 +3799,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] @@ -3760,7 +3839,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3794,14 +3873,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3816,9 +3895,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -3834,7 +3913,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3854,7 +3933,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3865,23 +3944,24 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.61", + "thiserror-impl 1.0.69", ] [[package]] @@ -3895,13 +3975,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3912,7 +3992,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -3967,7 +4047,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4007,46 +4087,50 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "toml_datetime", - "winnow 0.5.40", + "winnow", ] [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper", "tokio", "tower-layer", "tower-service", ] [[package]] -name = "tower" -version = "0.5.2" +name = "tower-http" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" dependencies = [ - "futures-core", + "bitflags 2.9.1", + "bytes", "futures-util", + "http", + "http-body", + "iri-string", "pin-project-lite", - "sync_wrapper", + "tower", "tower-layer", "tower-service", ] @@ -4065,9 +4149,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -4077,20 +4161,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -4113,15 +4197,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -4143,9 +4227,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -4172,9 +4256,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -4184,9 +4268,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "voting-core" @@ -4200,9 +4284,9 @@ dependencies = [ [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] @@ -4222,6 +4306,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -4244,7 +4337,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -4279,7 +4372,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4317,36 +4410,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -4431,20 +4494,20 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] [[package]] -name = "winnow" -version = "0.7.10" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "memchr", + "bitflags 2.9.1", ] [[package]] @@ -4482,28 +4545,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4523,7 +4586,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", "synstructure", ] @@ -4544,7 +4607,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] [[package]] @@ -4577,5 +4640,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.101", ] diff --git a/examples/CRISP/apps/server/.env.example b/examples/CRISP/apps/server/.env.example index 0108b4d947..dd144d8111 100644 --- a/examples/CRISP/apps/server/.env.example +++ b/examples/CRISP/apps/server/.env.example @@ -12,7 +12,7 @@ CRON_API_KEY=1234567890 ENCLAVE_ADDRESS="0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" CIPHERNODE_REGISTRY_ADDRESS="0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" NAIVE_REGISTRY_FILTER_ADDRESS="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" -E3_PROGRAM_ADDRESS="0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1" # CRISPProgram Contract Address +E3_PROGRAM_ADDRESS="0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE" # CRISPProgram Contract Address # E3 Config E3_WINDOW_SIZE=40 diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index 798d3eba7a..dd6cba7692 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -571,7 +571,7 @@ dependencies = [ "futures", "futures-utils-wasm", "lru", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "pin-project", "reqwest", "schnellru", @@ -605,9 +605,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -616,9 +616,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", @@ -982,12 +982,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -1318,18 +1318,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" @@ -1453,9 +1453,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.22" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -1484,9 +1484,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.38" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" dependencies = [ "clap_builder", "clap_derive", @@ -1494,9 +1494,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.38" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" dependencies = [ "anstream", "anstyle", @@ -1777,7 +1777,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] [[package]] @@ -2082,9 +2082,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2092,9 +2092,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0939f82868b77ef93ce3c3c3daf2b3c526b456741da5a1a4559e590965b6026b" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "eyre" @@ -2123,6 +2123,17 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.13.1" @@ -2535,9 +2546,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2636,11 +2647,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http 1.3.1", "hyper", "hyper-util", @@ -2669,22 +2679,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2760,9 +2776,9 @@ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", @@ -2776,9 +2792,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -2891,6 +2907,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2932,9 +2958,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" dependencies = [ "jiff-static", "log", @@ -2945,9 +2971,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", @@ -3111,9 +3137,9 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -3184,14 +3210,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3339,9 +3365,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -3395,11 +3421,17 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -3429,9 +3461,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -3451,9 +3483,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.7.4" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec", "bitvec", @@ -3467,9 +3499,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.7.4" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3490,12 +3522,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] [[package]] @@ -3514,9 +3546,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -3697,9 +3729,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", "syn 2.0.101", @@ -3778,9 +3810,9 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", @@ -4032,15 +4064,14 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", - "futures-util", "h2 0.4.10", "http 1.3.1", "http-body", @@ -4057,21 +4088,20 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] @@ -4122,21 +4152,24 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", "rand 0.8.5", + "rand 0.9.1", "rlp", "ruint-macro", "serde", @@ -4223,15 +4256,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -4254,9 +4278,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rusty-fork" @@ -4531,9 +4555,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4828,15 +4852,15 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", "socket2", @@ -4972,6 +4996,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -5261,7 +5303,7 @@ checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ "futures", "js-sys", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "pin-utils", "slab", "wasm-bindgen", @@ -5325,15 +5367,15 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings 0.4.2", ] [[package]] @@ -5377,9 +5419,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] @@ -5395,9 +5437,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] diff --git a/examples/CRISP/apps/server/src/server/models.rs b/examples/CRISP/apps/server/src/server/models.rs index 10367c5f0d..c04ad7db42 100644 --- a/examples/CRISP/apps/server/src/server/models.rs +++ b/examples/CRISP/apps/server/src/server/models.rs @@ -45,6 +45,8 @@ pub struct CTRequest { pub struct EncryptedVote { pub round_id: u64, pub enc_vote_bytes: Vec, + pub proof: Vec, + pub public_inputs: Vec<[u8; 32]>, pub address: String, pub proof_sem: Vec, } diff --git a/examples/CRISP/apps/server/src/server/routes/voting.rs b/examples/CRISP/apps/server/src/server/routes/voting.rs index b22da5608e..b1781cba22 100644 --- a/examples/CRISP/apps/server/src/server/routes/voting.rs +++ b/examples/CRISP/apps/server/src/server/routes/voting.rs @@ -64,9 +64,22 @@ async fn broadcast_encrypted_vote( } // Prepare vote data for blockchain + let public_inputs_array = if vote.public_inputs.is_empty() { + DynSolValue::Array(vec![]) + } else { + DynSolValue::Array( + vote.public_inputs + .into_iter() + .map(|pi_array_u8| DynSolValue::FixedBytes(pi_array_u8.into(), 32)) + .collect(), + ) + }; + let e3_id = U256::from(vote.round_id); let params_value = DynSolValue::Tuple(vec![ DynSolValue::Bytes(vote.proof_sem), + DynSolValue::Bytes(vote.proof), + public_inputs_array, DynSolValue::Bytes(vote.enc_vote_bytes), ]); diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index 0eaae144ca..c18fa4f86a 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -14,18 +14,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" @@ -151,7 +151,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.7.10", + "winnow", ] [[package]] @@ -290,7 +290,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand", + "rand 0.8.5", "ruint", "rustc-hash", "serde", @@ -324,7 +324,7 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "reqwest 0.12.5", + "reqwest 0.12.18", "schnellru", "serde", "serde_json", @@ -369,12 +369,12 @@ dependencies = [ "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.5", + "reqwest 0.12.18", "serde", "serde_json", "tokio", "tokio-stream", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -458,7 +458,7 @@ checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" dependencies = [ "alloy-sol-macro-input", "const-hex", - "heck 0.5.0", + "heck", "indexmap", "proc-macro-error2", "proc-macro2", @@ -476,7 +476,7 @@ checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" dependencies = [ "const-hex", "dunce", - "heck 0.5.0", + "heck", "macro-string", "proc-macro2", "quote", @@ -491,7 +491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" dependencies = [ "serde", - "winnow 0.7.10", + "winnow", ] [[package]] @@ -521,7 +521,7 @@ dependencies = [ "serde_json", "thiserror 2.0.12", "tokio", - "tower 0.5.2", + "tower", "tracing", "url", "wasmtimer", @@ -535,9 +535,9 @@ checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.5", + "reqwest 0.12.18", "serde_json", - "tower 0.5.2", + "tower", "tracing", "url", ] @@ -598,7 +598,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -675,7 +675,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -685,14 +685,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" dependencies = [ "serde", ] @@ -730,9 +730,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", @@ -747,14 +747,14 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", @@ -763,23 +763,23 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -808,9 +808,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bech32" @@ -833,7 +833,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", ] [[package]] @@ -842,6 +851,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -850,9 +865,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -899,15 +914,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "byteorder" @@ -917,9 +932,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -936,12 +951,11 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -962,18 +976,18 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ "serde", ] [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -986,20 +1000,21 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.22", + "semver 1.0.26", "serde", "serde_json", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] name = "cc" -version = "1.0.94" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1010,9 +1025,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "num-traits", ] @@ -1040,7 +1055,7 @@ dependencies = [ "k256", "serde", "sha2", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] @@ -1054,9 +1069,9 @@ dependencies = [ "hmac", "once_cell", "pbkdf2 0.12.2", - "rand", + "rand 0.8.5", "sha2", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] @@ -1076,30 +1091,20 @@ dependencies = [ "serde_derive", "sha2", "sha3", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] name = "console" -version = "0.15.8" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "unicode-width", - "windows-sys 0.52.0", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", + "windows-sys 0.59.0", ] [[package]] @@ -1131,6 +1136,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -1149,24 +1174,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1184,13 +1209,13 @@ dependencies = [ "fhe-math", "fhe-traits", "fhe-util", - "getrandom 0.2.14", + "getrandom 0.2.16", "itertools 0.13.0", "log", "ndarray", "num-bigint", "num-traits", - "rand", + "rand 0.8.5", "rayon", "serde", "serde_json", @@ -1201,9 +1226,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1220,15 +1245,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1237,7 +1262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -1277,15 +1302,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -1293,9 +1318,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", ] @@ -1311,17 +1336,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -1427,6 +1441,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -1435,9 +1460,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" @@ -1464,9 +1489,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -1481,7 +1506,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -1489,24 +1514,24 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1522,7 +1547,7 @@ dependencies = [ "hex", "k256", "log", - "rand", + "rand 0.8.5", "rlp", "serde", "sha3", @@ -1531,18 +1556,18 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1557,13 +1582,13 @@ dependencies = [ "hex", "hmac", "pbkdf2 0.11.0", - "rand", + "rand 0.8.5", "scrypt", "serde", "serde_json", "sha2", "sha3", - "thiserror 1.0.58", + "thiserror 1.0.69", "uuid", ] @@ -1580,7 +1605,7 @@ dependencies = [ "serde", "serde_json", "sha3", - "thiserror 1.0.58", + "thiserror 1.0.69", "uint", ] @@ -1659,7 +1684,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] @@ -1720,14 +1745,14 @@ dependencies = [ "num_enum", "once_cell", "open-fastrlp", - "rand", + "rand 0.8.5", "rlp", "serde", "serde_json", - "strum 0.26.2", + "strum 0.26.3", "syn 2.0.101", "tempfile", - "thiserror 1.0.58", + "thiserror 1.0.69", "tiny-keccak", "unicode-xid", ] @@ -1741,10 +1766,10 @@ dependencies = [ "chrono", "ethers-core", "reqwest 0.11.27", - "semver 1.0.22", + "semver 1.0.26", "serde", "serde_json", - "thiserror 1.0.58", + "thiserror 1.0.69", "tracing", ] @@ -1768,7 +1793,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "thiserror 1.0.58", + "thiserror 1.0.69", "tokio", "tracing", "tracing-futures", @@ -1800,7 +1825,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "thiserror 1.0.58", + "thiserror 1.0.69", "tokio", "tokio-tungstenite", "tracing", @@ -1825,9 +1850,9 @@ dependencies = [ "elliptic-curve", "eth-keystore", "ethers-core", - "rand", + "rand 0.8.5", "sha2", - "thiserror 1.0.58", + "thiserror 1.0.69", "tracing", ] @@ -1850,12 +1875,12 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver 1.0.22", + "semver 1.0.26", "serde", "serde_json", "solang-parser", "svm-rs", - "thiserror 1.0.58", + "thiserror 1.0.69", "tiny-keccak", "tokio", "tracing", @@ -1865,9 +1890,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "eyre" @@ -1881,9 +1906,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -1896,13 +1921,24 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1921,10 +1957,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", - "thiserror 1.0.58", + "thiserror 1.0.69", "zeroize", "zeroize_derive", ] @@ -1944,10 +1980,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "sha2", - "thiserror 1.0.58", + "thiserror 1.0.69", "zeroize", ] @@ -1956,7 +1992,7 @@ name = "fhe-traits" version = "0.1.0-beta.7" source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -1968,7 +2004,7 @@ dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand", + "rand 0.8.5", "rayon", ] @@ -1979,7 +2015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -1992,9 +2028,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -2054,9 +2090,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2069,9 +2105,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2079,15 +2115,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2096,9 +2132,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-locks" @@ -2112,9 +2148,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2123,15 +2159,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -2145,9 +2181,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2189,9 +2225,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -2214,15 +2250,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-timers" @@ -2243,7 +2279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2299,12 +2335,6 @@ dependencies = [ "fxhash", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2313,9 +2343,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2337,11 +2367,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2402,9 +2432,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2414,9 +2444,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2438,9 +2468,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2463,7 +2493,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.32", "rustls", "tokio", "tokio-rustls", @@ -2477,7 +2507,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "native-tls", "tokio", @@ -2487,32 +2517,133 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.6.0", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", - "tower 0.4.13", "tower-service", "tracing", ] +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2544,13 +2675,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] @@ -2572,27 +2703,37 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "itertools" @@ -2632,25 +2773,27 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.30" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2670,9 +2813,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2708,7 +2851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", - "bit-set", + "bit-set 0.5.3", "ena", "itertools 0.11.0", "lalrpop-util", @@ -2733,11 +2876,11 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin 0.9.8", ] [[package]] @@ -2748,9 +2891,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" @@ -2758,21 +2901,27 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -2780,9 +2929,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" @@ -2806,9 +2955,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -2826,9 +2975,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -2838,9 +2987,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicov" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" dependencies = [ "cc", "walkdir", @@ -2848,29 +2997,29 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "native-tls" @@ -2910,9 +3059,9 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "num" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -2944,16 +3093,16 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "serde", "smallvec", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -2975,9 +3124,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2997,9 +3146,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -3007,9 +3156,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -3017,20 +3166,20 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.101", @@ -3051,18 +3200,18 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "open-fastrlp" @@ -3095,7 +3244,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -3141,35 +3290,37 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -3177,15 +3328,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3195,7 +3346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -3261,9 +3412,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap", @@ -3276,37 +3427,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", - "rand", + "phf_shared", + "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", - "phf_shared 0.11.2", + "phf_shared", "proc-macro2", "quote", "syn 2.0.101", @@ -3314,36 +3465,27 @@ dependencies = [ [[package]] name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -3352,9 +3494,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3374,9 +3516,18 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -3386,9 +3537,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3398,9 +3552,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.19" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", "syn 2.0.101", @@ -3414,7 +3568,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand", + "rand 0.8.5", ] [[package]] @@ -3433,47 +3587,28 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "toml_edit", ] [[package]] -name = "proc-macro-crate" +name = "proc-macro-error-attr2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "toml_edit 0.20.7", + "proc-macro2", + "quote", ] [[package]] -name = "proc-macro-crate" -version = "3.1.0" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ "proc-macro-error-attr2", "proc-macro2", @@ -3492,17 +3627,17 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.5.0", + "bit-set 0.8.0", + "bit-vec 0.8.0", + "bitflags 2.9.1", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -3512,9 +3647,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -3522,12 +3657,12 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", + "heck", "itertools 0.12.1", "log", "multimap", @@ -3543,9 +3678,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools 0.12.1", @@ -3556,9 +3691,9 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ "prost", ] @@ -3571,9 +3706,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -3597,11 +3732,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", "serde", ] +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -3609,7 +3754,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -3618,7 +3773,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] @@ -3627,7 +3791,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3658,29 +3822,29 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.1", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.16", "libredox", - "thiserror 1.0.58", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -3690,9 +3854,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3701,9 +3865,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -3719,7 +3883,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.32", "hyper-rustls", "ipnet", "js-sys", @@ -3729,7 +3893,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls", - "rustls-pemfile 1.0.4", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", @@ -3743,23 +3907,22 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg 0.50.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "base64 0.22.1", "bytes", "futures-core", - "futures-util", "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-tls", "hyper-util", "ipnet", @@ -3770,19 +3933,20 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", + "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.52.0", ] [[package]] @@ -3812,15 +3976,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.16", "libc", - "spin 0.9.8", "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -3858,21 +4021,24 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", - "rand", + "rand 0.8.5", + "rand 0.9.1", "rlp", "ruint-macro", "serde", @@ -3888,9 +4054,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3915,34 +4081,34 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.22", + "semver 1.0.26", ] [[package]] name = "rustix" -version = "0.38.32" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring 0.17.14", "rustls-webpki", "sct", ] @@ -3956,15 +4122,6 @@ dependencies = [ "base64 0.21.7", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -3980,15 +4137,15 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rusty-fork" @@ -4004,9 +4161,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa20" @@ -4028,35 +4185,35 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.2" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if", - "derive_more 0.99.17", + "derive_more 1.0.0", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.2" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.101", ] [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4070,12 +4227,6 @@ dependencies = [ "hashbrown 0.13.2", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -4100,7 +4251,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -4120,11 +4271,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -4152,9 +4303,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] @@ -4214,9 +4365,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4246,9 +4397,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -4275,6 +4426,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "2.2.0" @@ -4282,26 +4439,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.58", + "thiserror 2.0.12", "time", ] [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -4314,18 +4471,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4341,7 +4498,7 @@ dependencies = [ "lalrpop", "lalrpop-util", "phf", - "thiserror 1.0.58", + "thiserror 1.0.69", "unicode-xid", ] @@ -4367,6 +4524,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4375,24 +4538,23 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", "parking_lot", - "phf_shared 0.10.0", + "phf_shared", "precomputed-hash", ] [[package]] name = "strum" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.2", + "strum_macros 0.26.4", ] [[package]] @@ -4406,11 +4568,11 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", "rustversion", @@ -4423,7 +4585,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", @@ -4432,9 +4594,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svm-rs" @@ -4447,11 +4609,11 @@ dependencies = [ "hex", "once_cell", "reqwest 0.11.27", - "semver 1.0.22", + "semver 1.0.26", "serde", "serde_json", "sha2", - "thiserror 1.0.58", + "thiserror 1.0.69", "url", "zip", ] @@ -4501,6 +4663,20 @@ name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] [[package]] name = "system-configuration" @@ -4531,14 +4707,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4554,11 +4731,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.58", + "thiserror-impl 1.0.69", ] [[package]] @@ -4572,9 +4749,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -4603,9 +4780,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -4618,15 +4795,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -4641,11 +4818,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -4658,26 +4845,25 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -4733,110 +4919,87 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", - "winnow 0.5.40", + "toml_write", + "winnow", ] [[package]] -name = "toml_edit" -version = "0.22.9" +name = "toml_write" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.6.6", -] +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 1.0.2", "tokio", "tower-layer", "tower-service", ] [[package]] -name = "tower" -version = "0.5.2" +name = "tower-http" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" dependencies = [ - "futures-core", + "bitflags 2.9.1", + "bytes", "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", "pin-project-lite", - "sync_wrapper 1.0.2", + "tower", "tower-layer", "tower-service", ] @@ -4855,9 +5018,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -4866,9 +5029,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", @@ -4877,9 +5040,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -4912,19 +5075,19 @@ dependencies = [ "http 0.2.12", "httparse", "log", - "rand", + "rand 0.8.5", "rustls", "sha1", - "thiserror 1.0.58", + "thiserror 1.0.69", "url", "utf-8", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -4950,38 +5113,23 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[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" +version = "1.0.18" 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", -] +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "untrusted" @@ -4997,9 +5145,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5012,13 +5160,19 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.16", "serde", ] @@ -5036,9 +5190,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" @@ -5085,24 +5239,24 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.101", @@ -5111,21 +5265,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5133,9 +5288,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -5146,20 +5301,21 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-bindgen-test" -version = "0.3.43" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" dependencies = [ - "console_error_panic_hook", "js-sys", "minicov", - "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", @@ -5167,9 +5323,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.43" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", @@ -5192,9 +5348,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5224,11 +5380,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5252,7 +5408,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -5272,18 +5437,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -5294,9 +5459,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5306,9 +5471,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5318,15 +5483,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5336,9 +5501,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5348,9 +5513,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5360,9 +5525,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5372,27 +5537,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" -dependencies = [ - "memchr", -] +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -5413,25 +5560,21 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen-rt" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", ] +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -5443,9 +5586,9 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 1.0.58", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -5466,6 +5609,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.25" @@ -5486,11 +5653,32 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -5506,6 +5694,39 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "zip" version = "0.6.6" @@ -5547,9 +5768,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/examples/CRISP/apps/wasm-crypto/README.md b/examples/CRISP/apps/wasm-crypto/README.md new file mode 100644 index 0000000000..72699c2019 --- /dev/null +++ b/examples/CRISP/apps/wasm-crypto/README.md @@ -0,0 +1,35 @@ +# CRISP-Web + +A Rust WebAssembly (WASM) implementation of Fully Homomorphic Encryption (FHE) for secure voting systems. + +## Features + +- BFV encryption scheme implementation +- WASM integration for browser-based encryption +- Greco protocol implementation for input validation + +## Prerequisites + +- Rust (latest stable version) +- wasm-pack +- Node.js (for running tests) + +## Installation + +1. Install wasm-pack +`cargo install wasm-pack` + +## Building + +Build the WebAssembly package: +``` +wasm-pack build --target web --release +``` + + +## Running Tests + +Run the tests: +``` +wasm-pack test --node --release +``` diff --git a/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs b/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs index 1298638ec7..d0581e007c 100644 --- a/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs +++ b/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs @@ -1,7 +1,4 @@ -use std::fs::File; -use std::io::Write; use std::ops::Deref; -use std::path::Path; use std::sync::Arc; use fhe_math::rq::{Poly, Representation}; @@ -50,10 +47,10 @@ impl InputValidationVectors { pk1is: vec![vec![BigInt::zero(); degree]; num_moduli], ct0is: vec![vec![BigInt::zero(); degree]; num_moduli], ct1is: vec![vec![BigInt::zero(); degree]; num_moduli], - r1is: vec![vec![BigInt::zero(); 2 * (degree - 1)]; num_moduli], - r2is: vec![vec![BigInt::zero(); degree - 2]; num_moduli], - p1is: vec![vec![BigInt::zero(); 2 * (degree - 1)]; num_moduli], - p2is: vec![vec![BigInt::zero(); degree - 2]; num_moduli], + r1is: vec![vec![BigInt::zero(); 2 * (degree - 1) + 1]; num_moduli], + r2is: vec![vec![BigInt::zero(); degree - 1]; num_moduli], + p1is: vec![vec![BigInt::zero(); 2 * (degree - 1) + 1]; num_moduli], + p2is: vec![vec![BigInt::zero(); degree - 1]; num_moduli], k0is: vec![BigInt::zero(); num_moduli], u: vec![BigInt::zero(); degree], e0: vec![BigInt::zero(); degree], @@ -96,8 +93,8 @@ impl InputValidationVectors { /// Returns a `serde_json::Value` representing the JSON serialization of the `InputValidationVectors`. pub fn to_json(&self) -> serde_json::Value { json!({ - "pk0i": to_string_2d_vec(&self.pk0is), - "pk1i": to_string_2d_vec(&self.pk1is), + "pk0is": to_string_2d_vec(&self.pk0is), + "pk1is": to_string_2d_vec(&self.pk1is), "u": to_string_1d_vec(&self.u), "e0": to_string_1d_vec(&self.e0), "e1": to_string_1d_vec(&self.e1), @@ -183,7 +180,9 @@ impl InputValidationVectors { .to_u64() .ok_or_else(|| "Cannot convert BigInt to u64.".to_string())?; // [q]_t let mut k1_u64 = pt.value.deref().to_vec(); // m + t.scalar_mul_vec(&mut k1_u64, q_mod_t); // k1 = [q*m]_t + let mut k1: Vec = k1_u64.iter().map(|&x| BigInt::from(x)).rev().collect(); reduce_and_center_coefficients_mut(&mut k1, &BigInt::from(t.modulus())); @@ -254,18 +253,10 @@ impl InputValidationVectors { // Create cyclotomic polynomial x^N + 1 let mut cyclo = vec![BigInt::from(0u64); (N + 1) as usize]; + cyclo[0] = BigInt::from(1u64); // x^N term cyclo[N as usize] = BigInt::from(1u64); // x^0 term - // Print - /* - println!("m = {:?}\n", &m); - println!("k1 = {:?}\n", &k1); - println!("u = {:?}\n", &u); - println!("e0 = {:?}\n", &e0); - println!("e1 = {:?}\n", &e1); - */ - // Initialize matrices to store results let num_moduli = ctx.moduli().len(); let mut res = InputValidationVectors::new(num_moduli, N as usize); @@ -313,6 +304,7 @@ impl InputValidationVectors { reduce_and_center_coefficients_mut(&mut pk1i, &qi_bigint); // k0qi = -t^{-1} mod qi + let koqi_u64 = qi.inv(qi.neg(t.modulus())).unwrap(); let k0qi = BigInt::from(koqi_u64); // Do not need to center this @@ -323,7 +315,6 @@ impl InputValidationVectors { let ct0i_hat = { let pk0i_times_u = poly_mul(&pk0i, &u); assert_eq!((pk0i_times_u.len() as u64) - 1, 2 * (N - 1)); - let e0_plus_ki = poly_add(&e0, &ki); assert_eq!((e0_plus_ki.len() as u64) - 1, N - 1); @@ -430,24 +421,11 @@ impl InputValidationVectors { } assert_eq!(&ct1i, &ct1i_calculated); - - /* - println!("qi = {:?}\n", &qi_bigint); - println!("ct0i = {:?}\n", &ct0i); - println!("k0qi = {:?}\n", &k0qi); - println!("pk0 = Polynomial({:?})\n", &pk0i); - println!("pk1 = Polynomial({:?})\n", &pk1i); - println!("ki = {:?}\n", &ki); - println!("ct0i_hat_mod_rqi = {:?}\n", &ct0i_hat_mod_rqi); - */ - (i, r2i, r1i, k0qi, ct0i, ct1i, pk0i, pk1i, p1i, p2i) }, ) .collect(); - // println!("Completed creation of polynomials!"); - // Merge results into the `res` structure after parallel execution for (i, r2i, r1i, k0i, ct0i, ct1i, pk0i, pk1i, p1i, p2i) in results.into_iter() { res.r2is[i] = r2i; @@ -478,10 +456,11 @@ impl InputValidationVectors { pub struct InputValidationBounds { u: BigInt, e: BigInt, - t: BigInt, - k1: BigInt, + k1_low: BigInt, + k1_up: BigInt, pk: Vec, - r1: Vec, + r1_low: Vec, + r1_up: Vec, r2: Vec, p1: Vec, p2: Vec, @@ -510,9 +489,14 @@ impl InputValidationBounds { assert!(range_check_standard(&vecs_std.e0, &self.e, &p)); assert!(range_check_standard(&vecs_std.e1, &self.e, &p)); - // constraint. The coefficients of k1 should be in the range [-(t-1)/2, (t-1)/2] - assert!(range_check_centered(&vecs.k1, &-&self.k1, &self.k1)); - assert!(range_check_standard(&vecs_std.k1, &self.k1, &p)); + // constraint. The coefficients of k1 should be in the range [-(t-1)]/2, (t-1)/2] + assert!(range_check_centered(&vecs.k1, &self.k1_low, &self.k1_up)); + assert!(range_check_standard_2bounds( + &vecs_std.k1, + &self.k1_low, + &self.k1_up, + &p + )); // Perform asserts for polynomials depending on each qi for i in 0..self.r2.len() { @@ -552,15 +536,20 @@ impl InputValidationBounds { // constraint. The coefficients of (ct0i - ct0i_hat - r2i * cyclo) / qi = r1i should be in the range // $[ - // \frac{- ((N+2) \cdot \frac{q_i - 1}{2} + B + \frac{t - 1}{2} \cdot |K_{0,i}|)}{q_i}, - // \frac{ (N+2) \cdot \frac{q_i - 1}{2} + B + \frac{t - 1}{2} \cdot |K_{0,i}| }{q_i} + // \frac{ \frac{-(t - 1)}{2} \cdot |K_{0,i}| - ((N \cdot B +2) \cdot \frac{q_i - 1}{2} + B )}{q_i}, + // \frac{ \frac{t - 1}{2} \cdot |K_{0,i}| + (N \cdot B+2) \cdot \frac{q_i - 1}{2} + B }{q_i} // ]$ assert!(range_check_centered( &vecs.r1is[i], - &-&self.r1[i], - &self.r1[i] + &self.r1_low[i], + &self.r1_up[i] + )); + assert!(range_check_standard_2bounds( + &vecs_std.r1is[i], + &self.r1_low[i], + &self.r1_up[i], + &p )); - assert!(range_check_standard(&vecs_std.r1is[i], &self.r1[i], &p)); // constraint. The coefficients of p2 should be in the range [-(qi-1)/2, (qi-1)/2] assert!(range_check_centered( @@ -572,8 +561,8 @@ impl InputValidationBounds { // constraint. The coefficients of (ct0i - ct0i_hat - p2i * cyclo) / qi = p1i should be in the range // $[ - // \frac{- ((N+2) \cdot \frac{q_i - 1}{2} + B)}{q_i}, - // \frac{ (N+2) \cdot \frac{q_i - 1}{2} + B }{q_i} + // \frac{- ((N \cdot B +2) \cdot \frac{q_i - 1}{2} + B)}{q_i}, + // \frac{ (N \cdot B +2) \cdot \frac{q_i - 1}{2} + B }{q_i} // ]$ assert!(range_check_centered( &vecs.p1is[i], @@ -613,14 +602,27 @@ impl InputValidationBounds { ); let u_bound = gauss_bound.clone(); let e_bound = gauss_bound.clone(); - let ptxt_bound = (t - BigInt::from(1)) / BigInt::from(2); - let k1_bound = ptxt_bound.clone(); + + //Note we have two different variables for lower bound and upper bound, as in the case + //where the plaintext modulus is even, the lower bound cannot be calculated by just + //negating the upper bound. For instance, if t = 8, then the lower bound will be -4 and the + //upper bound will be 3 + let ptxt_up_bound = (t.clone() - BigInt::from(1)) / BigInt::from(2); + let ptxt_low_bound = if (t.clone() % BigInt::from(2)) == BigInt::from(1) { + (-&(t.clone() - BigInt::from(1))) / BigInt::from(2) + } else { + ((-&(t.clone() - BigInt::from(1))) / BigInt::from(2)) - BigInt::from(1) + }; + + let k1_low_bound = ptxt_low_bound.clone(); + let k1_up_bound = ptxt_up_bound.clone(); // Calculate qi-based bounds let num_moduli = ctx.moduli().len(); let mut pk_bounds: Vec = vec![BigInt::zero(); num_moduli]; let mut r2_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut r1_bounds: Vec = vec![BigInt::zero(); num_moduli]; + let mut r1_low_bounds: Vec = vec![BigInt::zero(); num_moduli]; + let mut r1_up_bounds: Vec = vec![BigInt::zero(); num_moduli]; let mut p2_bounds: Vec = vec![BigInt::zero(); num_moduli]; let mut p1_bounds: Vec = vec![BigInt::zero(); num_moduli]; for (i, qi) in ctx.moduli_operators().iter().enumerate() { @@ -635,177 +637,31 @@ impl InputValidationBounds { pk_bounds[i] = qi_bound.clone(); r2_bounds[i] = qi_bound.clone(); - r1_bounds[i] = ((&N + 2) * &qi_bound + &gauss_bound + &ptxt_bound * BigInt::abs(&k0qi)) + + r1_low_bounds[i] = (&ptxt_low_bound * BigInt::abs(&k0qi) + - &((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound)) / &qi_bigint; + r1_up_bounds[i] = (&ptxt_up_bound * BigInt::abs(&k0qi) + + ((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound)) + / &qi_bigint; + p2_bounds[i] = qi_bound.clone(); - p1_bounds[i] = ((&N + 2) * &qi_bound + &gauss_bound) / &qi_bigint; + p1_bounds[i] = ((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound) / &qi_bigint; } Ok(InputValidationBounds { u: u_bound, e: e_bound, - t: ptxt_bound, - k1: k1_bound, + k1_low: k1_low_bound, + k1_up: k1_up_bound, pk: pk_bounds, - r1: r1_bounds, + r1_low: r1_low_bounds, + r1_up: r1_up_bounds, r2: r2_bounds, p1: p1_bounds, p2: p2_bounds, }) } - - /// Writes the input validation bounds to a file that can be imported as a Rust module. - /// - /// # Arguments - /// - /// * `params` - Reference to BFV parameters to extract context information. - /// * `output_file` - The path where the output constants should be saved. - /// - /// This function calculates certain constants like `k0i` values for each modulus `qi` and writes the bounds and other - /// relevant constants in a Rust-friendly format to the file specified by `output_file`. - fn to_file( - &self, - params: &Arc, - output_file: &str, - ) -> Result<(), Box> { - let level = params.moduli().len() - self.r2.len(); - let ctx = params.ctx_at_level(level)?; - - // Calculate k0i constants - let k0i_constants = ctx - .moduli_operators() - .iter() - .map(|qi| { - // Use the ? operator to propagate errors - let k0qi_value = qi - .inv(qi.neg(params.plaintext())) - .ok_or_else(|| "Failed to calculate modulus inverse for k0qi".to_string())?; - Ok(BigInt::from(k0qi_value)) - }) - .collect::, String>>()?; - - // Set the output file path - let output_path = Path::new("src") - .join("constants") - .join("pk_enc_constants") - .join(output_file); - - let mut file = File::create(output_path)?; - - // Writing the constants to the file - writeln!(file, "/// `N` is the degree of the cyclotomic polynomial defining the ring `Rq = Zq[X]/(X^N + 1)`.")?; - writeln!(file, "pub const N: usize = {};", params.degree())?; - - let pk_bound_str = self - .pk - .iter() - .map(|x| x.to_string()) - .collect::>() - .join(", "); - writeln!(file, "/// The coefficients of the polynomial `pk0is` and `pk1is` should exist in the interval `[-PK_BOUND, PK_BOUND]`.")?; - writeln!( - file, - "pub const PK_BOUND: [u64; {}] = [{}];", - self.pk.len(), - pk_bound_str - )?; - - writeln!(file, "/// The coefficients of the polynomial `pk1is` should exist in the interval `[-PK0_BOUND, PK0_BOUND]`.")?; - - writeln!(file, "/// The coefficients of the polynomial `e` should exist in the interval `[-E_BOUND, E_BOUND]` where `E_BOUND` is the upper bound of the gaussian distribution with 𝜎 = 3.2.")?; - writeln!(file, "pub const E_BOUND: u64 = {};", self.e)?; - - writeln!(file, "/// The coefficients of the polynomial `s` should exist in the interval `[-S_BOUND, S_BOUND]`.")?; - writeln!(file, "pub const U_BOUND: u64 = {};", self.u)?; - - let r1_bounds_str = self - .r1 - .iter() - .map(|x| x.to_string()) - .collect::>() - .join(", "); - writeln!(file, "/// The coefficients of the polynomials `r1is` should exist in the interval `[-R1_BOUND[i], R1_BOUND[i]]` where `R1_BOUND[i]` is equal to `(qi-1)/2`.")?; - writeln!( - file, - "pub const R1_BOUNDS: [u64; {}] = [{}];", - self.r1.len(), - r1_bounds_str - )?; - - let r2_bounds_str = self - .r2 - .iter() - .map(|x| x.to_string()) - .collect::>() - .join(", "); - writeln!(file, "/// The coefficients of the polynomials `r2is` should exist in the interval `[-R2_BOUND[i], R2_BOUND[i]]` where `R2_BOUND[i]` is equal to $\\frac{{(N+2) \\cdot \\frac{{q_i - 1}}{{2}} + B + \\frac{{t - 1}}{{2}} \\cdot |K_{{0,i}}|}}{{q_i}}`.")?; - writeln!( - file, - "pub const R2_BOUNDS: [u64; {}] = [{}];", - self.r2.len(), - r2_bounds_str - )?; - - let p1_bounds_str = self - .p1 - .iter() - .map(|x| x.to_string()) - .collect::>() - .join(", "); - writeln!(file, "/// The coefficients of the polynomials `p1is` should exist in the interval `[-P1_BOUND[i], P1_BOUND[i]]` where `P1_BOUND[i]` is equal to (((qis[i] - 1) / 2) * (n + 2) + b ) / qis[i].")?; - writeln!( - file, - "pub const P1_BOUNDS: [u64; {}] = [{}];", - self.p1.len(), - p1_bounds_str - )?; - - let p2_bounds_str = self - .p2 - .iter() - .map(|x| x.to_string()) - .collect::>() - .join(", "); - writeln!(file, "/// The coefficients of the polynomials `p2is` should exist in the interval `[-P2_BOUND[i], P2_BOUND[i]]` where `P2_BOUND[i]` is equal to (qis[i] - 1) / 2.")?; - writeln!( - file, - "pub const P2_BOUNDS: [u64; {}] = [{}];", - self.p2.len(), - p2_bounds_str - )?; - - writeln!(file, "/// The coefficients of `k1` should exist in the interval `[-K1_BOUND, K1_BOUND]` where `K1_BOUND` is equal to `(t-1)/2`.")?; - writeln!(file, "pub const K1_BOUND: u64 = {};", self.k1)?; - - let qis_str = ctx - .moduli() - .iter() - .map(|x| format!("\"{}\"", x)) - .collect::>() - .join(", "); - writeln!(file, "/// List of scalars `qis` such that `qis[i]` is the modulus of the i-th CRT basis of `q` (ciphertext space modulus).")?; - writeln!( - file, - "pub const QIS: [&str; {}] = [{}];", - ctx.moduli().len(), - qis_str - )?; - - let k0is_str = k0i_constants - .iter() - .map(|x| format!("\"{}\"", x)) - .collect::>() - .join(", "); - writeln!(file, "/// List of scalars `k0is` such that `k0i[i]` is equal to the negative of the multiplicative inverses of t mod qi.")?; - writeln!( - file, - "pub const K0IS: [&str; {}] = [{}];", - k0i_constants.len(), - k0is_str - )?; - - Ok(()) - } } fn to_string_1d_vec(poly: &Vec) -> Vec { @@ -815,21 +671,3 @@ fn to_string_1d_vec(poly: &Vec) -> Vec { fn to_string_2d_vec(poly: &Vec>) -> Vec> { poly.iter().map(|row| to_string_1d_vec(row)).collect() } - -/// Writes the given JSON data to a file in the specified output path. -/// -/// # Arguments -/// -/// * `output_path` - A reference to the base directory path where the file will be created. -/// * `filename` - The name of the file to create. -/// * `json_data` - A reference to the JSON data to be written into the file. -/// -/// # Panics -/// -/// This function will panic if the file cannot be created or if writing to the file fails. -fn write_json_to_file(output_path: &Path, filename: &str, json_data: &serde_json::Value) { - let file_path = output_path.join(filename); - let mut file = File::create(file_path).expect("Unable to create file"); - file.write_all(serde_json::to_string_pretty(json_data).unwrap().as_bytes()) - .expect("Unable to write data"); -} diff --git a/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs b/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs index 402ac77f6c..2a7ab07642 100644 --- a/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs +++ b/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs @@ -212,7 +212,7 @@ pub fn reduce_coefficients_by_cyclo(coefficients: &mut Vec, cyclo: &[Big /// /// This function takes an arbitrary number and reduces it modulo the specified prime modulus. /// After reduction, the number is adjusted to be within the symmetric range -/// [−(modulus−1)/2, (modulus−1)/2]. If the number is already within this range, it remains unchanged. +/// [(−(modulus−1))/2, (modulus−1)/2]. If the number is already within this range, it remains unchanged. /// /// # Parameters /// @@ -231,7 +231,11 @@ pub fn reduce_and_center(x: &BigInt, modulus: &BigInt, half_modulus: &BigInt) -> } // Adjust the remainder if it is greater than half_modulus - if r > *half_modulus { + if (modulus % BigInt::from(2)) == BigInt::from(1) { + if r > *half_modulus { + r -= modulus; + } + } else if r >= *half_modulus { r -= modulus; } @@ -258,6 +262,7 @@ pub fn reduce_and_center_coefficients_mut(coefficients: &mut [BigInt], modulus: .iter_mut() .for_each(|x| *x = reduce_and_center(x, modulus, &half_modulus)); } + pub fn reduce_and_center_coefficients( coefficients: &mut [BigInt], modulus: &BigInt, @@ -335,6 +340,17 @@ pub fn range_check_centered(vec: &[BigInt], lower_bound: &BigInt, upper_bound: & .all(|coeff| coeff >= lower_bound && coeff <= upper_bound) } +pub fn range_check_standard_2bounds( + vec: &[BigInt], + low_bound: &BigInt, + up_bound: &BigInt, + modulus: &BigInt, +) -> bool { + vec.iter().all(|coeff| { + (coeff >= &BigInt::from(0) && coeff <= up_bound) + || (coeff >= &(modulus + low_bound) && coeff < modulus) + }) +} pub fn range_check_standard(vec: &[BigInt], bound: &BigInt, modulus: &BigInt) -> bool { vec.iter().all(|coeff| { (coeff >= &BigInt::from(0) && coeff <= bound) diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index 03381757d5..8cd685046b 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -5,6 +5,9 @@ use console_log; use e3_bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; +use greco::greco::InputValidationVectors; +use num_bigint::BigInt; +use num_traits::Num; use rand::thread_rng; use wasm_bindgen::prelude::*; use wasm_bindgen_test::*; // For setting up logging to the browser console @@ -14,6 +17,25 @@ pub struct Encrypt { encrypted_vote: Vec, } +#[wasm_bindgen] +pub struct EncryptedVote { + encrypted_vote: Vec, + circuit_inputs: String, +} + +#[wasm_bindgen] +impl EncryptedVote { + #[wasm_bindgen(getter)] + pub fn encrypted_vote(&self) -> Vec { + self.encrypted_vote.clone() + } + + #[wasm_bindgen(getter)] + pub fn circuit_inputs(&self) -> String { + self.circuit_inputs.clone() + } +} + #[wasm_bindgen] impl Encrypt { #[wasm_bindgen(constructor)] @@ -23,7 +45,11 @@ impl Encrypt { } } - pub fn encrypt_vote(&mut self, vote: u64, public_key: Vec) -> Result, JsValue> { + pub fn encrypt_vote( + &mut self, + vote: u64, + public_key: Vec, + ) -> Result { let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); @@ -39,13 +65,24 @@ impl Encrypt { .map_err(|e| JsValue::from_str(&format!("Error encrypting vote: {}", e)))?; // Create Greco input validation ZKP proof - // let input_val_vectors = - // InputValidationVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk).map_err( - // |e| JsValue::from_str(&format!("Error computing input validation vectors: {}", e)), - // )?; + let input_val_vectors = + InputValidationVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk).map_err( + |e| JsValue::from_str(&format!("Error computing input validation vectors: {}", e)), + )?; + + let p = BigInt::from_str_radix( + "21888242871839275222246405745257275088548364400416034343698204186575808495617", + 10, + ) + .unwrap(); + + let standard_input_val = input_val_vectors.standard_form(&p); self.encrypted_vote = ct.to_bytes(); - Ok(self.encrypted_vote.clone()) + Ok(EncryptedVote { + encrypted_vote: self.encrypted_vote.clone(), + circuit_inputs: standard_input_val.to_json().to_string(), + }) } pub fn test() { @@ -57,24 +94,29 @@ fn main() -> Result<(), Box> { Ok(()) } -// Tests -#[wasm_bindgen_test] -fn test_encrypt_vote() { - // Initialize the logger to print to the browser's console - console_log::init_with_level(log::Level::Info).expect("Error initializing logger"); +#[cfg(test)] +mod tests { + use super::*; + use wasm_bindgen_test::*; - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); - let mut rng = thread_rng(); - let sk = SecretKey::random(¶ms, &mut rng); - let pk = PublicKey::new(&sk, &mut rng); + #[wasm_bindgen_test] + fn test_encrypt_vote() { + // Initialize the logger to print to the browser's console + console_log::init_with_level(log::Level::Info).expect("Error initializing logger"); - let mut test = Encrypt::new(); - let vote = 10; - test.encrypt_vote(vote, pk.to_bytes()).unwrap(); + let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let mut rng = thread_rng(); + let sk = SecretKey::random(¶ms, &mut rng); + let pk = PublicKey::new(&sk, &mut rng); - let ct = Ciphertext::from_bytes(&test.encrypted_vote, ¶ms).unwrap(); - let pt = sk.try_decrypt(&ct).unwrap(); + let mut test = Encrypt::new(); + let vote = 10; + test.encrypt_vote(vote, pk.to_bytes()).unwrap(); - assert_eq!(pt.value[0], vote); + let ct = Ciphertext::from_bytes(&test.encrypted_vote, ¶ms).unwrap(); + let pt = sk.try_decrypt(&ct).unwrap(); + + assert_eq!(pt.value[0], vote); + } } diff --git a/examples/CRISP/circuits/.gitignore b/examples/CRISP/circuits/.gitignore new file mode 100644 index 0000000000..767eaf4c68 --- /dev/null +++ b/examples/CRISP/circuits/.gitignore @@ -0,0 +1,2 @@ +target/ +Prover.toml \ No newline at end of file diff --git a/examples/CRISP/circuits/Nargo.toml b/examples/CRISP/circuits/Nargo.toml new file mode 100644 index 0000000000..0c5ec63989 --- /dev/null +++ b/examples/CRISP/circuits/Nargo.toml @@ -0,0 +1,6 @@ +[package] +name = "crisp_circuit" +type = "bin" +authors = [""] + +[dependencies] diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr new file mode 100644 index 0000000000..f8d72ad78f --- /dev/null +++ b/examples/CRISP/circuits/src/main.nr @@ -0,0 +1,27 @@ +/// `N` is the degree of the cyclotomic polynomial defining the ring `Rq = Zq[X]/(X^N + 1)`. +pub global N: u32 = 2048; +/// `L` is the dimension size of the polynomials. +pub global L: u32 = 1; +/// Polynomial structure +pub struct Polynomial { + // Coefficients of the polynomial (Biggest degree at the first index) + pub coefficients: [Field; N], +} + +/// Main function +fn main( + pk0is: [Polynomial; L], + pk1is: [Polynomial; L], + ct0is: [Polynomial; L], + ct1is: [Polynomial; L], + u: Polynomial, + e0: Polynomial, + e1: Polynomial, + k1: Polynomial, + r1is: [Polynomial<2 * N - 1>; L], + r2is: [Polynomial; L], + p1is: [Polynomial<2 * N - 1>; L], + p2is: [Polynomial; L], +) { + assert(1 != 2); +} diff --git a/examples/CRISP/contracts/CRISPInputValidator.sol b/examples/CRISP/contracts/CRISPInputValidator.sol index b0062a4c1e..5a5d938636 100644 --- a/examples/CRISP/contracts/CRISPInputValidator.sol +++ b/examples/CRISP/contracts/CRISPInputValidator.sol @@ -4,6 +4,7 @@ pragma solidity >=0.8.27; import {IInputValidator} from "@gnosis-guild/enclave/contracts/interfaces/IInputValidator.sol"; import {IBasePolicy} from "@excubiae/contracts/interfaces/IBasePolicy.sol"; import {Clone} from "@excubiae/contracts/proxy/Clone.sol"; +import {IVerifier} from "./CRISPVerifier.sol"; /// @title CRISPInputValidator. /// @notice Enclave Input Validator @@ -11,18 +12,26 @@ contract CRISPInputValidator is IInputValidator, Clone { /// @notice The policy that will be used to validate the input. IBasePolicy internal policy; + /// @notice The verifier that will be used to validate the input. + IVerifier internal noirVerifier; + /// @notice The error emitted when the input data is empty. error EmptyInputData(); /// @notice The error emitted when the input data is invalid. error InvalidInputData(bytes reason); + /// @notice The error emitted when the Noir proof is invalid. + error InvalidNoirProof(); /// @notice Initializes the contract with appended bytes data for configuration. function _initialize() internal virtual override(Clone) { super._initialize(); - bytes memory data = _getAppendedBytes(); - address policyAddr = abi.decode(data, (address)); + (address policyAddr, address verifierAddr) = abi.decode( + _getAppendedBytes(), + (address, address) + ); policy = IBasePolicy(policyAddr); + noirVerifier = IVerifier(verifierAddr); } /// @notice Validates input @@ -35,13 +44,19 @@ contract CRISPInputValidator is IInputValidator, Clone { ) external returns (bytes memory input) { if (data.length == 0) revert EmptyInputData(); - (bytes memory proofBytes, bytes memory vote) = abi.decode( - data, - (bytes, bytes) - ); + ( + bytes memory semaphoreProof, + bytes memory noirProof, + bytes32[] memory noirPublicInputs, + bytes memory vote + ) = abi.decode(data, (bytes, bytes, bytes32[], bytes)); + + // Reverts if the semaphore proof is invalid + policy.enforce(sender, semaphoreProof); - // Reverts if the proof is invalid - policy.enforce(sender, proofBytes); + // Reverts if noir proof is invalid + if (!noirVerifier.verify(noirProof, noirPublicInputs)) + revert InvalidNoirProof(); input = vote; } diff --git a/examples/CRISP/contracts/CRISPInputValidatorFactory.sol b/examples/CRISP/contracts/CRISPInputValidatorFactory.sol index dc6907e06c..3818d6c1bb 100644 --- a/examples/CRISP/contracts/CRISPInputValidatorFactory.sol +++ b/examples/CRISP/contracts/CRISPInputValidatorFactory.sol @@ -12,8 +12,12 @@ contract CRISPInputValidatorFactory is Factory { /// @notice Deploys a new CRISPInputValidator clone. /// @param _policyAddr Address of the associated policy contract. - function deploy(address _policyAddr) public returns (address clone) { - bytes memory data = abi.encode(_policyAddr); + /// @param _verifierAddr Address of the associated verifier contract. + function deploy( + address _policyAddr, + address _verifierAddr + ) public returns (address clone) { + bytes memory data = abi.encode(_policyAddr, _verifierAddr); clone = super._deploy(data); CRISPInputValidator(clone).initialize(); diff --git a/examples/CRISP/contracts/CRISPProgram.sol b/examples/CRISP/contracts/CRISPProgram.sol index 4299b4d05c..cc321fccde 100644 --- a/examples/CRISP/contracts/CRISPProgram.sol +++ b/examples/CRISP/contracts/CRISPProgram.sol @@ -11,6 +11,7 @@ import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphore.so import {CRISPCheckerFactory} from "./CRISPCheckerFactory.sol"; import {CRISPPolicyFactory} from "./CRISPPolicyFactory.sol"; import {CRISPInputValidatorFactory} from "./CRISPInputValidatorFactory.sol"; +import {HonkVerifier} from "./CRISPVerifier.sol"; contract CRISPProgram is IE3Program, Ownable { // Constants @@ -23,6 +24,7 @@ contract CRISPProgram is IE3Program, Ownable { CRISPCheckerFactory private immutable CHECKER_FACTORY; CRISPPolicyFactory private immutable POLICY_FACTORY; CRISPInputValidatorFactory private immutable INPUT_VALIDATOR_FACTORY; + HonkVerifier private immutable HONK_VERIFIER; uint8 public constant INPUT_LIMIT = 100; bytes32 public imageId; @@ -46,6 +48,7 @@ contract CRISPProgram is IE3Program, Ownable { error InvalidPolicyFactory(); error InvalidCheckerFactory(); error InvalidInputValidatorFactory(); + error InvalidHonkVerifier(); error GroupDoesNotExist(); error AlreadyRegistered(); @@ -56,6 +59,7 @@ contract CRISPProgram is IE3Program, Ownable { /// @param _checkerFactory The checker factory address /// @param _policyFactory The policy factory address /// @param _inputValidatorFactory The input validator factory address + /// @param _honkVerifier The honk verifier address /// @param _imageId The image ID for the guest program constructor( IEnclave _enclave, @@ -64,6 +68,7 @@ contract CRISPProgram is IE3Program, Ownable { CRISPCheckerFactory _checkerFactory, CRISPPolicyFactory _policyFactory, CRISPInputValidatorFactory _inputValidatorFactory, + HonkVerifier _honkVerifier, bytes32 _imageId ) Ownable(msg.sender) { require(address(_enclave) != address(0), EnclaveAddressZero()); @@ -78,6 +83,7 @@ contract CRISPProgram is IE3Program, Ownable { address(_inputValidatorFactory) != address(0), InvalidInputValidatorFactory() ); + require(address(_honkVerifier) != address(0), InvalidHonkVerifier()); enclave = _enclave; verifier = _verifier; @@ -85,6 +91,7 @@ contract CRISPProgram is IE3Program, Ownable { CHECKER_FACTORY = _checkerFactory; POLICY_FACTORY = _policyFactory; INPUT_VALIDATOR_FACTORY = _inputValidatorFactory; + HONK_VERIFIER = _honkVerifier; authorizedContracts[address(_enclave)] = true; imageId = _imageId; } @@ -151,7 +158,10 @@ contract CRISPProgram is IE3Program, Ownable { // Deploy a new input validator inputValidator = IInputValidator( - INPUT_VALIDATOR_FACTORY.deploy(address(policy)) + INPUT_VALIDATOR_FACTORY.deploy( + address(policy), + address(HONK_VERIFIER) + ) ); policy.setTarget(address(inputValidator)); diff --git a/examples/CRISP/contracts/CRISPVerifier.sol b/examples/CRISP/contracts/CRISPVerifier.sol new file mode 100644 index 0000000000..60ff97087a --- /dev/null +++ b/examples/CRISP/contracts/CRISPVerifier.sol @@ -0,0 +1,1883 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2022 Aztec +pragma solidity >=0.8.21; + +uint256 constant N = 32; +uint256 constant LOG_N = 5; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 0; +library HonkVerificationKey { + function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(32), + logCircuitSize: uint256(5), + publicInputsSize: uint256(0), + ql: Honk.G1Point({ + x: uint256(0x20db59a578c18c14c48de7886a4e5c1bfc084c0581f1c1d91c168100878025d6), + y: uint256(0x260f4297297d9321d7b538dff892b8358b6f4e399354cd7f4c75de6a473f54b6) + }), + qr: Honk.G1Point({ + x: uint256(0x2cb79af04e31fbbbe2499058cbba862b1a1ef37dfb94964b9226db5ea0ba55ab), + y: uint256(0x0c629054c854ed1ef49bc84d4d52953f3796c15cf71f65b91daa87c2a26c9340) + }), + qo: Honk.G1Point({ + x: uint256(0x2dedc7148752b9eb2a5ab01f2d8a2dbecc1960a5ccef8d67d5ef6b0c7c6d86a1), + y: uint256(0x1c57a5f59b22ae21dd5aa4ab74084aa76ab74367d8a64bd6baae2d2949abc28c) + }), + q4: Honk.G1Point({ + x: uint256(0x207710f769c857fbe624a2333097b24391d81714b7d7ad40642b9308d02258b4), + y: uint256(0x1044cdbbd63806d10426ca4cb77cbc2f767ee4790206ca5c193b742aa672d6d8) + }), + qm: Honk.G1Point({ + x: uint256(0x2cb79af04e31fbbbe2499058cbba862b1a1ef37dfb94964b9226db5ea0ba55ab), + y: uint256(0x0c629054c854ed1ef49bc84d4d52953f3796c15cf71f65b91daa87c2a26c9340) + }), + qc: Honk.G1Point({ + x: uint256(0x2159e845bf925dabb9ed29d357dabbc4192e8bd0e289a7c0dba3cbe434f5b9bb), + y: uint256(0x1c64d0893955560db37a8a4852eb613ac34e67571c74c4c4cd6ebbcdf1705735) + }), + qArith: Honk.G1Point({ + x: uint256(0x04fe2586a64265b5c4eb405a3ca69a4f3956f525a29cf508784978b9c7381a33), + y: uint256(0x00f6ef320a244494fe4fa363d7c119c293d3f00d933d0483e6ca3c2c4bf66c86) + }), + qDeltaRange: Honk.G1Point({ + x: uint256(0x2c066d46d386975a57df073e19403bd8019ded441b9e454eb4045069cefee487), + y: uint256(0x1bbf8b9e8c4b2184984b994c744d216bf779063abc501d4102fbfc99d4227c16) + }), + qElliptic: Honk.G1Point({ + x: uint256(0x0e84090add56f2500ab518c655cae63896ea793e6b3f6a14218d476534109610), + y: uint256(0x2b78a584bd6ae88cf4ec7c65c90e0b65df446fdddba972f3c4414ad3c901f4f9) + }), + qAux: Honk.G1Point({ + x: uint256(0x1bd6129f9646aa21af0d77e7b1cc9794e611b5d59a27773f744710b476fbd30f), + y: uint256(0x2f8d492d76a22b6834f0b88e2d4096139a9d1593d56e65e710b2f344756b721e) + }), + qLookup: Honk.G1Point({ + x: uint256(0x1d64341216e323f076ac53aa06192392677f44b67b6947dd6a0a1490fb32a083), + y: uint256(0x28d02cea9cc379ace2ae8779011e247ddc4213ef69895a8e634f425844107141) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256(0x056ab50282da428d93b17cbd1c81267dcebcfbabdedb47b2d715b5baa6520bff), + y: uint256(0x10b4e7bd9d6d91a57b0695be166ffd27cbeee602bcb5a9ed32c8d9440912cb72) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256(0x024236bda126650fb5228cf424a0878775499e69e8bd2c39af33bd5fa0b4079a), + y: uint256(0x233cda9292be02cfa2da9d0fc7b0eab0eb1a867b06854066589b967455259b32) + }), + s1: Honk.G1Point({ + x: uint256(0x1c55cc2fb0b02448a3020640717caff813a9f9c1af24f0d2e9f540c34f5015a7), + y: uint256(0x16a30b6cc2d15f937e4c1f724310ae17876dc0ed3306d5065ef62f3d708a9958) + }), + s2: Honk.G1Point({ + x: uint256(0x10b983e75301071b6d98d94328181495a2f0e457467ad900ad0e721e72a0028d), + y: uint256(0x2fb1fc310f039ffebc5e95f8769bcfdcbbc450606013be1fb17037848c7cc061) + }), + s3: Honk.G1Point({ + x: uint256(0x0527674bd6324b34aaceb7ac5d53ccc8f3ac533174bd19b0bdb576aa23159d9f), + y: uint256(0x0ecb39a068961a5f5da1e52f94aa1a207b7c200140356b551446a38b4ed2c329) + }), + s4: Honk.G1Point({ + x: uint256(0x219af920480ed3a86066566e9df75b3fea6f0d87574613cd0974ac9c9ad38b7c), + y: uint256(0x11f246b3e010032289f6651c503f8da2a089dc85fd235cc63351cbbf8e8bc17d) + }), + t1: Honk.G1Point({ + x: uint256(0x1bf7da4add7c858eb94b75f2e78fbd89c84f5fa43824a0d5534173872ee099c2), + y: uint256(0x1b35fa2a35673699ee1cb260d9e6c4be79b26d488c26dc2531194e43c8f747ea) + }), + t2: Honk.G1Point({ + x: uint256(0x16bf79791869cec464180d5322eeaaef18fed6dc10c3e64e314c04d85c3faece), + y: uint256(0x2e2ec6341669b5b975e25e465af5d9e40533d5ac173554df19daed27f66c36ff) + }), + t3: Honk.G1Point({ + x: uint256(0x150253026f1b985165783c2f4ee1df612c826dda543d06d34711b965730ab69e), + y: uint256(0x0c4062ebcca21d81273b9c58d64447e4ee4d55effa8cbc8fdbd6a76bc3092264) + }), + t4: Honk.G1Point({ + x: uint256(0x159f2541ce446c6d59ea3f06be91ec9f47c9c82f3e4fd10696511efaff4121fa), + y: uint256(0x15f873b33ec9467e1f0c4fb3a0b59a6fcd6f3480515f1ff5506c48f0c521f00f) + }), + id1: Honk.G1Point({ + x: uint256(0x2ab51544fb6f8fb3c9c64f9c1678fcf8d03243e06fac4213f9849d953bd20e22), + y: uint256(0x16a447632362b910243a63c97a7b4fa993cf26af1623b471af8d947a425d3cfe) + }), + id2: Honk.G1Point({ + x: uint256(0x041d536b560fc382b49dbb005395e138e92740e99db1312a4381bd453ba8a094), + y: uint256(0x237ad790c0d53eb3dd3dd95445b22f29a4dca08c0597f23da91270ea40d7c6cb) + }), + id3: Honk.G1Point({ + x: uint256(0x10b983e75301071b6d98d94328181495a2f0e457467ad900ad0e721e72a0028d), + y: uint256(0x2fb1fc310f039ffebc5e95f8769bcfdcbbc450606013be1fb17037848c7cc061) + }), + id4: Honk.G1Point({ + x: uint256(0x28f9e61dad3a4eb1c21f4004d1ee21bac259e36c71ce3e87d1ef43e6b2ebecb5), + y: uint256(0x2aa7685354586c0317feb21d69336ce0f32a56b29beb93e92efb26471c65d88b) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), + y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) + }), + lagrangeLast: Honk.G1Point({ + x: uint256(0x0524c8e7146a41551c673b3139893fa365285bca50c9a1b5a476834f5f518c05), + y: uint256(0x0e3589731c046d57d3ae60d42e595d73cc5e8e83438261bdb144c99daa9fe18b) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; +using { exp as ^ } for Fr global; +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant MODULUS = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order + +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); + +// Instantiation +library FrLib +{ + function from(uint256 value) internal pure returns(Fr) + { + return Fr.wrap(value % MODULUS); + } + + function fromBytes32(bytes32 value) internal pure returns(Fr) + { + return Fr.wrap(uint256(value) % MODULUS); + } + + function toBytes32(Fr value) internal pure returns(bytes32) + { + return bytes32(Fr.unwrap(value)); + } + + function invert(Fr value) internal view returns(Fr) + { + uint256 v = Fr.unwrap(value); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly + { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + revert(0, 0) + } + result := mload(0x00) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns(Fr) + { + uint256 b = Fr.unwrap(base); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly + { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + revert(0, 0) + } + result := mload(0x00) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns(Fr) + { + return numerator * invert(denominator); + } + + function sqr(Fr value) internal pure returns (Fr) { + return value * value; + } + + function unwrap(Fr value) internal pure returns (uint256) { + return Fr.unwrap(value); + } + + function neg(Fr value) internal pure returns (Fr) { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } +} + +// Free functions +function add(Fr a, Fr b) pure returns(Fr) +{ + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); +} + +function mul(Fr a, Fr b) pure returns(Fr) +{ + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); +} + +function sub(Fr a, Fr b) pure returns(Fr) +{ + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); +} + +function exp(Fr base, Fr exponent) pure returns(Fr) +{ + if (Fr.unwrap(exponent) == 0) return Fr.wrap(1); + + for (uint256 i = 1; i < Fr.unwrap(exponent); i += i) { + base = base * base; + } + return base; +} + +function notEqual(Fr a, Fr b) pure returns(bool) +{ + return Fr.unwrap(a) != Fr.unwrap(b); +} + +function equal(Fr a, Fr b) pure returns(bool) +{ + return Fr.unwrap(a) == Fr.unwrap(b); +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 28; + +uint256 constant NUMBER_OF_SUBRELATIONS = 26; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant NUMBER_OF_ENTITIES = 40; +uint256 constant NUMBER_UNSHIFTED = 35; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; + +// Alphas are used as relation separators so there should be NUMBER_OF_SUBRELATIONS - 1 +uint256 constant NUMBER_OF_ALPHAS = 25; + +// Prime field order +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q +uint256 constant P = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order, F_r + +// ENUM FOR WIRES +enum WIRE { + Q_M, + Q_C, + Q_L, + Q_R, + Q_O, + Q_4, + Q_LOOKUP, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_AUX, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct G1ProofPoint { + uint256 x_0; + uint256 x_1; + uint256 y_0; + uint256 y_1; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qAux; // Auxillary + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy cnstraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr etaTwo; + Fr etaThree; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + + struct Proof { + // Free wires + Honk.G1ProofPoint w1; + Honk.G1ProofPoint w2; + Honk.G1ProofPoint w3; + Honk.G1ProofPoint w4; + // Lookup helpers - Permutations + Honk.G1ProofPoint zPerm; + // Lookup helpers - logup + Honk.G1ProofPoint lookupReadCounts; + Honk.G1ProofPoint lookupReadTags; + Honk.G1ProofPoint lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + Honk.G1ProofPoint[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Honk.G1ProofPoint shplonkQ; + Honk.G1ProofPoint kzgQuotient; + } +} + +// Transcript library to generate fiat shamir challenges +struct Transcript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Gemini + Fr rho; + Fr geminiR; + // Shplonk + Fr shplonkNu; + Fr shplonkZ; +} + +library TranscriptLib { + function generateTranscript(Honk.Proof memory proof, bytes32[] calldata publicInputs, uint256 circuitSize, uint256 publicInputsSize, uint256 pubInputsOffset) + internal + pure + returns (Transcript memory t) + { + Fr previousChallenge; + (t.relationParameters, previousChallenge) = + generateRelationParametersChallenges(proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset, previousChallenge); + + (t.alphas, previousChallenge) = generateAlphaChallenges(previousChallenge, proof); + + (t.gateChallenges, previousChallenge) = generateGateChallenges(previousChallenge); + + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges(proof, previousChallenge); + + (t.rho, previousChallenge) = generateRhoChallenge(proof, previousChallenge); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge(proof, previousChallenge); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge(proof, previousChallenge); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge(proof, previousChallenge); + + return t; + } + + function splitChallenge(Fr challenge) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + uint256 lo = challengeU256 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + uint256 hi = challengeU256 >> 128; + first = FrLib.fromBytes32(bytes32(lo)); + second = FrLib.fromBytes32(bytes32(hi)); + } + + function generateRelationParametersChallenges( + Honk.Proof memory proof, + bytes32[] calldata publicInputs, + uint256 circuitSize, + uint256 publicInputsSize, + uint256 pubInputsOffset, + Fr previousChallenge + ) internal pure returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) { + (rp.eta, rp.etaTwo, rp.etaThree, previousChallenge) = + generateEtaChallenge(proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset); + + (rp.beta, rp.gamma, nextPreviousChallenge) = generateBetaAndGammaChallenges(previousChallenge, proof); + + } + + function generateEtaChallenge(Honk.Proof memory proof, bytes32[] calldata publicInputs, uint256 circuitSize, uint256 publicInputsSize, uint256 pubInputsOffset) + internal + pure + returns (Fr eta, Fr etaTwo, Fr etaThree, Fr previousChallenge) + { + bytes32[] memory round0 = new bytes32[](3 + publicInputsSize + 12); + round0[0] = bytes32(circuitSize); + round0[1] = bytes32(publicInputsSize); + round0[2] = bytes32(pubInputsOffset); + for (uint256 i = 0; i < publicInputsSize; i++) { + round0[3 + i] = bytes32(publicInputs[i]); + } + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[3 + publicInputsSize] = bytes32(proof.w1.x_0); + round0[3 + publicInputsSize + 1] = bytes32(proof.w1.x_1); + round0[3 + publicInputsSize + 2] = bytes32(proof.w1.y_0); + round0[3 + publicInputsSize + 3] = bytes32(proof.w1.y_1); + round0[3 + publicInputsSize + 4] = bytes32(proof.w2.x_0); + round0[3 + publicInputsSize + 5] = bytes32(proof.w2.x_1); + round0[3 + publicInputsSize + 6] = bytes32(proof.w2.y_0); + round0[3 + publicInputsSize + 7] = bytes32(proof.w2.y_1); + round0[3 + publicInputsSize + 8] = bytes32(proof.w3.x_0); + round0[3 + publicInputsSize + 9] = bytes32(proof.w3.x_1); + round0[3 + publicInputsSize + 10] = bytes32(proof.w3.y_0); + round0[3 + publicInputsSize + 11] = bytes32(proof.w3.y_1); + + previousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(round0))); + (eta, etaTwo) = splitChallenge(previousChallenge); + previousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))); + Fr unused; + (etaThree, unused) = splitChallenge(previousChallenge); + } + + function generateBetaAndGammaChallenges(Fr previousChallenge, Honk.Proof memory proof) + internal + pure + returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) + { + bytes32[13] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x_0); + round1[2] = bytes32(proof.lookupReadCounts.x_1); + round1[3] = bytes32(proof.lookupReadCounts.y_0); + round1[4] = bytes32(proof.lookupReadCounts.y_1); + round1[5] = bytes32(proof.lookupReadTags.x_0); + round1[6] = bytes32(proof.lookupReadTags.x_1); + round1[7] = bytes32(proof.lookupReadTags.y_0); + round1[8] = bytes32(proof.lookupReadTags.y_1); + round1[9] = bytes32(proof.w4.x_0); + round1[10] = bytes32(proof.w4.x_1); + round1[11] = bytes32(proof.w4.y_0); + round1[12] = bytes32(proof.w4.y_1); + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(round1))); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges(Fr previousChallenge, Honk.Proof memory proof) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[9] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x_0; + alpha0[2] = proof.lookupInverses.x_1; + alpha0[3] = proof.lookupInverses.y_0; + alpha0[4] = proof.lookupInverses.y_1; + alpha0[5] = proof.zPerm.x_0; + alpha0[6] = proof.zPerm.x_1; + alpha0[7] = proof.zPerm.y_0; + alpha0[8] = proof.zPerm.y_1; + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(alpha0))); + (alphas[0], alphas[1]) = splitChallenge(nextPreviousChallenge); + + for (uint256 i = 1; i < NUMBER_OF_ALPHAS / 2; i++) { + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(Fr.unwrap(nextPreviousChallenge)))); + (alphas[2 * i], alphas[2 * i + 1]) = splitChallenge(nextPreviousChallenge); + } + if (((NUMBER_OF_ALPHAS & 1) == 1) && (NUMBER_OF_ALPHAS > 2)) { + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(Fr.unwrap(nextPreviousChallenge)))); + Fr unused; + (alphas[NUMBER_OF_ALPHAS - 1], unused) = splitChallenge(nextPreviousChallenge); + } + } + + function generateGateChallenges(Fr previousChallenge) + internal + pure + returns (Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, Fr nextPreviousChallenge) + { + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + previousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))); + Fr unused; + (gateChallenges[i], unused) = splitChallenge(previousChallenge); + } + nextPreviousChallenge = previousChallenge; + } + + function generateSumcheckChallenges(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, Fr nextPreviousChallenge) + { + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + Fr[BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(univariateChal))); + Fr unused; + (sumcheckChallenges[i], unused) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + function generateRhoChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr rho, Fr nextPreviousChallenge) + { + Fr[NUMBER_OF_ENTITIES + 1] memory rhoChallengeElements; + rhoChallengeElements[0] = prevChallenge; + + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + rhoChallengeElements[i + 1] = proof.sumcheckEvaluations[i]; + } + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(rhoChallengeElements))); + Fr unused; + (rho, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr geminiR, Fr nextPreviousChallenge) + { + uint256[(CONST_PROOF_SIZE_LOG_N - 1) * 4 + 1] memory gR; + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; i++) { + gR[1 + i * 4] = proof.geminiFoldComms[i].x_0; + gR[2 + i * 4] = proof.geminiFoldComms[i].x_1; + gR[3 + i * 4] = proof.geminiFoldComms[i].y_0; + gR[4 + i * 4] = proof.geminiFoldComms[i].y_1; + } + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(gR))); + Fr unused; + (geminiR, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr shplonkNu, Fr nextPreviousChallenge) + { + uint256[(CONST_PROOF_SIZE_LOG_N) + 1] memory shplonkNuChallengeElements; + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + shplonkNuChallengeElements[i + 1] = Fr.unwrap(proof.geminiAEvaluations[i]); + } + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(shplonkNuChallengeElements))); + Fr unused; + (shplonkNu, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr shplonkZ, Fr nextPreviousChallenge) + { + uint256[5] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x_0; + shplonkZChallengeElements[2] = proof.shplonkQ.x_1; + shplonkZChallengeElements[3] = proof.shplonkQ.y_0; + shplonkZChallengeElements[4] = proof.shplonkQ.y_1; + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(shplonkZChallengeElements))); + Fr unused; + (shplonkZ, unused) = splitChallenge(nextPreviousChallenge); + } + + function loadProof(bytes calldata proof) internal pure returns (Honk.Proof memory p) { + // Commitments + p.w1 = bytesToG1ProofPoint(proof[0x0:0x80]); + + p.w2 = bytesToG1ProofPoint(proof[0x80:0x100]); + p.w3 = bytesToG1ProofPoint(proof[0x100:0x180]); + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1ProofPoint(proof[0x180:0x200]); + p.lookupReadTags = bytesToG1ProofPoint(proof[0x200:0x280]); + p.w4 = bytesToG1ProofPoint(proof[0x280:0x300]); + p.lookupInverses = bytesToG1ProofPoint(proof[0x300:0x380]); + p.zPerm = bytesToG1ProofPoint(proof[0x380:0x400]); + uint256 boundary = 0x400; + + // Sumcheck univariates + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + for (uint256 j = 0; j < BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr(proof[boundary:boundary + 0x20]); + boundary += 0x20; + } + } + // Sumcheck evaluations + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + p.sumcheckEvaluations[i] = bytesToFr(proof[boundary:boundary + 0x20]); + boundary += 0x20; + } + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; i++) { + p.geminiFoldComms[i] = bytesToG1ProofPoint(proof[boundary:boundary + 0x80]); + boundary += 0x80; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + p.geminiAEvaluations[i] = bytesToFr(proof[boundary:boundary + 0x20]); + boundary += 0x20; + } + + // Shplonk + p.shplonkQ = bytesToG1ProofPoint(proof[boundary:boundary + 0x80]); + boundary = boundary + 0x80; + // KZG + p.kzgQuotient = bytesToG1ProofPoint(proof[boundary:boundary + 0x80]); + } +} + + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + require(proofSection.length == 0x20, "invalid bytes scalar"); + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function convertProofPoint(Honk.G1ProofPoint memory input) pure returns (Honk.G1Point memory) { + return Honk.G1Point({x: input.x_0 | (input.x_1 << 136), y: input.y_0 | (input.y_1 << 136)}); +} + +function bytesToG1ProofPoint(bytes calldata proofSection) pure returns (Honk.G1ProofPoint memory point) { + require(proofSection.length == 0x80, "invalid bytes point"); + point = Honk.G1ProofPoint({ + x_0: uint256(bytes32(proofSection[0x00:0x20])), + x_1: uint256(bytes32(proofSection[0x20:0x40])), + y_0: uint256(bytes32(proofSection[0x40:0x60])), + y_1: uint256(bytes32(proofSection[0x60:0x80])) + }); +} + +function negateInplace(Honk.G1Point memory point) pure returns (Honk.G1Point memory) { + point.y = (Q - point.y) % Q; + return point; +} + + function pairing(Honk.G1Point memory rhs, Honk.G1Point memory lhs) view returns (bool) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G1 point + uint256(0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2), + uint256(0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed), + uint256(0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b), + uint256(0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa), + lhs.x, + lhs.y, + // G1 point from VK + uint256(0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1), + uint256(0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0), + uint256(0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4), + uint256(0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + bool decodedResult = abi.decode(result, (bool)); + return success && decodedResult; + } + + +library RelationsLib { + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory alphas, + Fr powPartialEval + ) internal pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation(purportedEvaluations, evaluations, powPartialEval); + accumulatePermutationRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulateLogDerivativeLookupRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulateDeltaRangeRelation(purportedEvaluations, evaluations, powPartialEval); + accumulateEllipticRelation(purportedEvaluations, evaluations, powPartialEval); + accumulateAuxillaryRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulatePoseidonExternalRelation(purportedEvaluations, evaluations, powPartialEval); + accumulatePoseidonInternalRelation(purportedEvaluations, evaluations, powPartialEval); + // batch the subrelations with the alpha challenges to obtain the full honk relation + accumulator = scaleAndBatchSubrelations(evaluations, alphas); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire(Fr[NUMBER_OF_ENTITIES] memory p, WIRE _wire) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + uint256 internal constant NEG_HALF_MODULO_P = 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * neg_half; + accum = accum + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + wire(p, WIRE.Q_C); + accum = accum + (q_arith - Fr.wrap(1)) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[0] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + wire(p, WIRE.W_4) - wire(p, WIRE.W_L_SHIFT) + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - Fr.wrap(1)); + accum = accum * q_arith; + accum = accum * domainSep; + evals[1] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + wire(p, WIRE.ID_1) * rp.beta + rp.gamma; + num = num * (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = num * (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = num * (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + wire(p, WIRE.SIGMA_1) * rp.beta + rp.gamma; + den = den * (wire(p, WIRE.W_R) + wire(p, WIRE.SIGMA_2) * rp.beta + rp.gamma); + den = den * (wire(p, WIRE.W_O) + wire(p, WIRE.SIGMA_3) * rp.beta + rp.gamma); + den = den * (wire(p, WIRE.W_4) + wire(p, WIRE.SIGMA_4) * rp.beta + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * grand_product_numerator; + + acc = acc + - ( + (wire(p, WIRE.Z_PERM_SHIFT) + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) + * grand_product_denominator + ); + acc = acc * domainSep; + evals[2] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[3] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr write_term; + Fr read_term; + + // Calculate the write term (the table accumulation) + { + write_term = wire(p, WIRE.TABLE_1) + rp.gamma + (wire(p, WIRE.TABLE_2) * rp.eta) + + (wire(p, WIRE.TABLE_3) * rp.etaTwo) + (wire(p, WIRE.TABLE_4) * rp.etaThree); + } + + // Calculate the write term + { + Fr derived_entry_1 = wire(p, WIRE.W_L) + rp.gamma + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_M) * wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_C) * wire(p, WIRE.W_O_SHIFT); + + read_term = derived_entry_1 + (derived_entry_2 * rp.eta) + (derived_entry_3 * rp.etaTwo) + + (wire(p, WIRE.Q_O) * rp.etaThree); + } + + Fr read_inverse = wire(p, WIRE.LOOKUP_INVERSES) * write_term; + Fr write_inverse = wire(p, WIRE.LOOKUP_INVERSES) * read_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + wire(p, WIRE.Q_LOOKUP) + - (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = read_term * write_term * wire(p, WIRE.LOOKUP_INVERSES) - inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * read_inverse - wire(p, WIRE.LOOKUP_READ_COUNTS) * write_inverse; + + evals[4] = accumulatorNone; + evals[5] = accumulatorOne; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = Fr.wrap(0) - Fr.wrap(1); + Fr minus_two = Fr.wrap(0) - Fr.wrap(2); + Fr minus_three = Fr.wrap(0) - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[6] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[7] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + } + + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[10] = x_add_identity * partialEval * wire(p, WIRE.Q_ELLIPTIC) * (Fr.wrap(1) - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * x_diff + (ep.x_3 - ep.x_1) * y_diff; + evals[11] = y_add_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * (Fr.wrap(1) - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = (ep.x_3 + ep.x_1 + ep.x_1) * y1_sqr_mul_4 - x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * q_is_double; + evals[10] = evals[10] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * (ep.x_1 - ep.x_3) - (ep.y_1 + ep.y_1) * (ep.y_1 + ep.y_3); + evals[11] = evals[11] + y_double_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * q_is_double; + } + } + + // Constants for the auxiliary relation + Fr constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + // Parameters used within the Auxiliary Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct AuxParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + Fr auxiliary_identity; + } + + function accumulateAuxillaryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + AuxParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = wire(p, WIRE.W_L) * wire(p, WIRE.W_R_SHIFT) + wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = + (wire(p, WIRE.W_L) * wire(p, WIRE.W_4) + wire(p, WIRE.W_R) * wire(p, WIRE.W_O) - wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 - wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 + ap.limb_subproduct; + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = ap.limb_subproduct + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = ap.non_native_field_gate_1 - (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = ap.non_native_field_gate_1 * wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 - (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 * wire(p, WIRE.Q_M); + + Fr non_native_field_identity = + ap.non_native_field_gate_1 + ap.non_native_field_gate_2 + ap.non_native_field_gate_3; + non_native_field_identity = non_native_field_identity * wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + ap.limb_accumulator_2; + limb_accumulator_identity = limb_accumulator_identity * wire(p, WIRE.Q_O); // deg 3 + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * rp.etaThree; + ap.memory_record_check = ap.memory_record_check + (wire(p, WIRE.W_R) * rp.etaTwo); + ap.memory_record_check = ap.memory_record_check + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = ap.index_delta * ap.index_delta - ap.index_delta; // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = (ap.index_delta * MINUS_ONE + Fr.wrap(1)) * ap.record_delta; // deg 2 + + evals[13] = ap.adjacent_values_match_if_adjacent_indices_match * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) + * (wire(p, WIRE.Q_AUX) * domainSep); // deg 5 + evals[14] = ap.index_is_monotonically_increasing * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) + * (wire(p, WIRE.Q_AUX) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = ap.memory_record_check * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * access_type - access_type; // check value is 0 or 1; deg 2 or 8 + + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * rp.etaThree; + ap.next_gate_access_type = ap.next_gate_access_type + (wire(p, WIRE.W_R_SHIFT) * rp.etaTwo); + ap.next_gate_access_type = ap.next_gate_access_type + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = wire(p, WIRE.W_4_SHIFT) - ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap.adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = ( + ap.index_delta * MINUS_ONE + Fr.wrap(1) + ) * value_delta * (ap.next_gate_access_type * MINUS_ONE + Fr.wrap(1)); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * ap.next_gate_access_type - ap.next_gate_access_type; + + // Putting it all together... + evals[15] = ap.adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation + * (wire(p, WIRE.Q_ARITH)) * (wire(p, WIRE.Q_AUX) * domainSep); // deg 5 or 8 + evals[16] = ap.index_is_monotonically_increasing * (wire(p, WIRE.Q_ARITH)) * (wire(p, WIRE.Q_AUX) * domainSep); // deg 4 + evals[17] = ap.next_gate_access_type_is_boolean * (wire(p, WIRE.Q_ARITH)) * (wire(p, WIRE.Q_AUX) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = ap.access_check * (wire(p, WIRE.Q_ARITH)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + Fr.wrap(1)) * ap.timestamp_delta - wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + ap.RAM_timestamp_check_identity * (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = ap.memory_identity + ap.memory_record_check * (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = ap.memory_identity + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.auxiliary_identity = ap.memory_identity + non_native_field_identity + limb_accumulator_identity; + ap.auxiliary_identity = ap.auxiliary_identity * (wire(p, WIRE.Q_AUX) * domainSep); // deg 4 or 10 + evals[12] = ap.auxiliary_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[18] = evals[18] + ep.q_pos_by_scaling * (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[19] = evals[19] + ep.q_pos_by_scaling * (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[20] = evals[20] + ep.q_pos_by_scaling * (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[21] = evals[21] + ep.q_pos_by_scaling * (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from(0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7), + FrLib.from(0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b), + FrLib.from(0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15), + FrLib.from(0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[22] = evals[22] + ip.q_pos_by_scaling * (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[23] = evals[23] + ip.q_pos_by_scaling * (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[24] = evals[24] + ip.q_pos_by_scaling * (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[25] = evals[25] + ip.q_pos_by_scaling * (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = accumulator + evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = accumulator + evaluations[i] * subrelationChallenges[i - 1]; + } + } +} + +struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // v^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // v^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // // Fold_i(r^{2^i}) reconstructed by Verifier + // Fr[CONST_PROOF_SIZE_LOG_N] foldPosEvaluations; +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + function computeSquares(Fr r) internal pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory squares) { + squares[0] = r; + for (uint256 i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + squares[i] = squares[i - 1].sqr(); + } + } + + // Compute the evaluations A_l(r^{2^l}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[CONST_PROOF_SIZE_LOG_N] memory foldPosEvaluations) { + for (uint256 i = CONST_PROOF_SIZE_LOG_N; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ( + (challengePower * batchedEvalAccumulator * Fr.wrap(2)) + - geminiEvaluations[i - 1] * (challengePower * (Fr.wrap(1) - u) - u) + ); + // Divide by the denominator + batchedEvalRoundAcc = batchedEvalRoundAcc * (challengePower * (Fr.wrap(1) - u) + u).invert(); + + if (i <= logSize) { + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + } + + } +} + +interface IVerifier { + function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool); +} + + +abstract contract BaseHonkVerifier is IVerifier { + using FrLib for Fr; + + uint256 immutable n; + uint256 immutable logN; + uint256 immutable numPublicInputs; + + constructor(uint256 _n, uint256 _logN, uint256 _numPublicInputs) { + n = _n; + logN = _logN; + numPublicInputs = _numPublicInputs; + } + + error ProofLengthWrong(); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + // Number of field elements in a ultra honk zero knowledge proof + uint256 constant PROOF_SIZE = 440; + + function loadVerificationKey() internal pure virtual returns (Honk.VerificationKey memory); + + function verify(bytes calldata proof, bytes32[] calldata publicInputs) public view override returns (bool) { + // Check the received proof is the expected size where each field element is 32 bytes + if (proof.length != PROOF_SIZE * 32) { + revert ProofLengthWrong(); + } + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.Proof memory p = TranscriptLib.loadProof(proof); + + if (publicInputs.length != vk.publicInputsSize) { + revert PublicInputsLengthWrong(); + } + + // Generate the fiat shamir challenges for the whole protocol + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1281): Add pubInputsOffset to VK or remove entirely. + Transcript memory t = TranscriptLib.generateTranscript(p, publicInputs, vk.circuitSize, vk.publicInputsSize, /*pubInputsOffset=*/1); + + // Derive public input delta + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1281): Add pubInputsOffset to VK or remove entirely. + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, t.relationParameters.beta, t.relationParameters.gamma, /*pubInputsOffset=*/1 + ); + + // Sumcheck + bool sumcheckVerified = verifySumcheck(p, t); + if (!sumcheckVerified) revert SumcheckFailed(); + + bool shpleminiVerified = verifyShplemini(p, vk, t); + if (!shpleminiVerified) revert ShpleminiFailed(); + + return sumcheckVerified && shpleminiVerified; // Boolean condition not required - nice for vanity :) + } + + function computePublicInputDelta(bytes32[] memory publicInputs, Fr beta, Fr gamma, uint256 offset) + internal + view + returns (Fr publicInputDelta) + { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + (beta * FrLib.from(n + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for (uint256 i = 0; i < numPublicInputs; i++) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck(Honk.Proof memory proof, Transcript memory tp) internal view returns (bool verified) { + Fr roundTarget; + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < logN; ++round) { + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate = proof.sumcheckUnivariates[round]; + bool valid = checkSum(roundUnivariate, roundTarget); + if (!valid) revert SumcheckFailed(); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTarget = computeNextTargetSum(roundUnivariate, roundChallenge); + powPartialEvaluation = partiallyEvaluatePOW(tp.gateChallenges[round], powPartialEvaluation, roundChallenge); + } + + // Last round + Fr grandHonkRelationSum = + RelationsLib.accumulateRelationEvaluations(proof.sumcheckEvaluations, tp.relationParameters, tp.alphas, powPartialEvaluation); + verified = (grandHonkRelationSum == roundTarget); + } + + function checkSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate, Fr roundTarget) + internal + pure + returns (bool checked) + { + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + checked = totalSum == roundTarget; + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, Fr roundChallenge) + internal + view + returns (Fr targetSum) + { + // TODO: inline + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000002d0), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffff11), + Fr.wrap(0x0000000000000000000000000000000000000000000000000000000000000090), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffff71), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000000f0), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000013b0) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + // Calculate domain size N of inverses + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + Fr inv = BARYCENTRIC_LAGRANGE_DENOMINATORS[i]; + inv = inv * (roundChallenge - Fr.wrap(i)); + inv = FrLib.invert(inv); + denominatorInverses[i] = inv; + } + + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + Fr term = roundUnivariates[i]; + term = term * denominatorInverses[i]; + targetSum = targetSum + term; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + // Univariate evaluation of the monomial ((1-X_l) + X_l.B_l) at the challenge point X_l=u_l + function partiallyEvaluatePOW(Fr gateChallenge, Fr currentEvaluation, Fr roundChallenge) + internal + pure + returns (Fr newEvaluation) + { + Fr univariateEval = Fr.wrap(1) + (roundChallenge * (gateChallenge - Fr.wrap(1))); + newEvaluation = currentEvaluation * univariateEval; + } + + function verifyShplemini(Honk.Proof memory proof, Honk.VerificationKey memory vk, Transcript memory tp) + internal + view + returns (bool verified) + { + ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[CONST_PROOF_SIZE_LOG_N] memory powers_of_evaluation_challenge = CommitmentSchemeLib.computeSquares(tp.geminiR); + + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars; + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory commitments; + + mem.posInvertedDenominator = (tp.shplonkZ - powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = mem.posInvertedDenominator + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * (mem.posInvertedDenominator - (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = convertProofPoint(proof.shplonkQ); + + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + for (uint256 i = 1; i <= NUMBER_UNSHIFTED; ++i) { + scalars[i] = mem.unshiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + for (uint256 i = NUMBER_UNSHIFTED + 1; i <= NUMBER_OF_ENTITIES; ++i) { + scalars[i] = mem.shiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = vk.qm; + commitments[2] = vk.qc; + commitments[3] = vk.ql; + commitments[4] = vk.qr; + commitments[5] = vk.qo; + commitments[6] = vk.q4; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qAux; + commitments[12] = vk.qPoseidon2External; + commitments[13] = vk.qPoseidon2Internal; + commitments[14] = vk.s1; + commitments[15] = vk.s2; + commitments[16] = vk.s3; + commitments[17] = vk.s4; + commitments[18] = vk.id1; + commitments[19] = vk.id2; + commitments[20] = vk.id3; + commitments[21] = vk.id4; + commitments[22] = vk.t1; + commitments[23] = vk.t2; + commitments[24] = vk.t3; + commitments[25] = vk.t4; + commitments[26] = vk.lagrangeFirst; + commitments[27] = vk.lagrangeLast; + + // Accumulate proof points + commitments[28] = convertProofPoint(proof.w1); + commitments[29] = convertProofPoint(proof.w2); + commitments[30] = convertProofPoint(proof.w3); + commitments[31] = convertProofPoint(proof.w4); + commitments[32] = convertProofPoint(proof.zPerm); + commitments[33] = convertProofPoint(proof.lookupInverses); + commitments[34] = convertProofPoint(proof.lookupReadCounts); + commitments[35] = convertProofPoint(proof.lookupReadTags); + + // to be Shifted + commitments[36] = convertProofPoint(proof.w1); + commitments[37] = convertProofPoint(proof.w2); + commitments[38] = convertProofPoint(proof.w3); + commitments[39] = convertProofPoint(proof.w4); + commitments[40] = convertProofPoint(proof.zPerm); + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations A_l(r^{2^l}) for l = 0, ..., logN - 1 + Fr[CONST_PROOF_SIZE_LOG_N] memory foldPosEvaluations = CommitmentSchemeLib.computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + logN + ); + + // Compute the Shplonk constant term contributions from A₀(±r) + mem.constantTermAccumulator = foldPosEvaluations[0] * mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + (proof.geminiAEvaluations[0] * tp.shplonkNu * mem.negInvertedDenominator); + mem.batchingChallenge = tp.shplonkNu.sqr(); + + // Compute Shplonk constant term contributions from Aₗ(±r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + bool dummy_round = i >= (logN - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = mem.batchingChallenge * mem.posInvertedDenominator; + mem.scalingFactorNeg = mem.batchingChallenge * tp.shplonkNu * mem.negInvertedDenominator; + // [Aₗ] is multiplied by -v^{2l}/(z-r^{2^l}) - v^{2l+1} /(z+ r^{2^l}) + scalars[NUMBER_OF_ENTITIES + 1 + i] = mem.scalingFactorNeg.neg() + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * proof.geminiAEvaluations[i + 1]; + accumContribution = accumContribution + mem.scalingFactorPos * foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = mem.constantTermAccumulator + accumContribution; + // Update the running power of v + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu * tp.shplonkNu; + } + + commitments[NUMBER_OF_ENTITIES + 1 + i] = convertProofPoint(proof.geminiFoldComms[i]); + } + + // Finalise the batch opening claim + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = Honk.G1Point({x: 1, y: 2}); + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = mem.constantTermAccumulator; + + Honk.G1Point memory quotient_commitment = convertProofPoint(proof.kzgQuotient); + + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = quotient_commitment; + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = tp.shplonkZ; // evaluation challenge + + Honk.G1Point memory P_0 = batchMul(commitments, scalars); + Honk.G1Point memory P_1 = negateInplace(quotient_commitment); + + return pairing(P_0, P_1); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory base, + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2; + assembly { + let success := 0x01 + let free := mload(0x40) + + // Write the original into the accumulator + // Load into memory for ecMUL, leave offset for eccAdd result + // base is an array of pointers, so we have to dereference them + mstore(add(free, 0x40), mload(mload(base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalars)) + success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, free, 0x40)) + + let count := 0x01 + for {} lt(count, limit) { count := add(count, 1) } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, add(free, 0x40), 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, free, 0x80, free, 0x40)) + } + + // Return the result - i hate this + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + } +} + +contract HonkVerifier is BaseHonkVerifier(N, LOG_N, NUMBER_OF_PUBLIC_INPUTS) { + function loadVerificationKey() internal pure override returns (Honk.VerificationKey memory) { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/examples/CRISP/deploy/Deploy.s.sol b/examples/CRISP/deploy/Deploy.s.sol index 4c5e88486a..359a16da6e 100644 --- a/examples/CRISP/deploy/Deploy.s.sol +++ b/examples/CRISP/deploy/Deploy.s.sol @@ -32,6 +32,7 @@ import {ISemaphoreVerifier} from "@semaphore-protocol/contracts/interfaces/ISema import {CRISPCheckerFactory} from "../contracts/CRISPCheckerFactory.sol"; import {CRISPPolicyFactory} from "../contracts/CRISPPolicyFactory.sol"; import {CRISPInputValidatorFactory} from "../contracts/CRISPInputValidatorFactory.sol"; +import {HonkVerifier} from "../contracts/CRISPVerifier.sol"; import {MockRISC0Verifier} from "../contracts/Mocks/MockRISC0Verifier.sol"; import {ImageID} from "../contracts/ImageID.sol"; @@ -183,6 +184,9 @@ contract CRISPProgramDeploy is Script { address(inputValidatorFactory) ); + HonkVerifier honkVerifier = new HonkVerifier(); + console2.log("Deployed HonkVerifier to", address(honkVerifier)); + CRISPProgram crisp = new CRISPProgram( enclave, verifier, @@ -190,6 +194,7 @@ contract CRISPProgramDeploy is Script { checkerFactory, policyFactory, inputValidatorFactory, + honkVerifier, ImageID.VOTING_ID ); console2.log("Deployed CRISPProgram to", address(crisp)); diff --git a/examples/CRISP/docker-compose.yaml b/examples/CRISP/docker-compose.yaml index 48a25604be..75c8f2c363 100644 --- a/examples/CRISP/docker-compose.yaml +++ b/examples/CRISP/docker-compose.yaml @@ -1,24 +1,26 @@ services: enclave-dev: - user: devuser platform: linux/amd64 build: context: . args: - USER_UID: ${USER_UID:-1000} - USER_GID: ${USER_GID:-1000} - USERNAME: devuser + USER_UID: ${USER_UID:-1001} + USER_GID: ${USER_GID:-118} + USERNAME: ubuntu volumes: - ../..:/app - git-folder:/app/.git - - cargo-bin:/home/devuser/.cargo/bin - - cargo-registry:/home/devuser/.cargo/registry + - cargo-bin:/home/ubuntu/.cargo/bin + - cargo-registry:/home/ubuntu/.cargo/registry - server-target:/app/examples/CRISP/apps/server/target - evm-node-modules:/app/packages/evm/node_modules - root-node-modules:/app/node_modules - client-node-modules:/app/examples/CRISP/apps/client/node_modules - crisp-node-modules:/app/examples/CRISP/node_modules - crisp-foundry-cache:/app/examples/CRISP/out + - synpress-cache:/app/examples/CRISP/.cache-synpress + - test-results:/app/examples/CRISP/test-results + - playwright-report:/app/examples/CRISP/playwright-report entrypoint: - "" ports: @@ -27,8 +29,9 @@ services: - "4000:4000" command: > /bin/bash -c ' - sudo chown -R devuser:devuser /app && - sudo chown -R devuser:devuser /home/devuser && + sudo chown -R ubuntu:ubuntu /app && + sudo chown -R ubuntu:ubuntu /home/ubuntu && + sudo chmod -R 777 /app/examples/CRISP && tail -f /dev/null ' @@ -42,3 +45,7 @@ volumes: crisp-node-modules: crisp-foundry-cache: git-folder: + synpress-cache: + test-results: + playwright-report: + diff --git a/examples/CRISP/foundry.toml b/examples/CRISP/foundry.toml index 5d2e4d85e0..26dd697d6b 100644 --- a/examples/CRISP/foundry.toml +++ b/examples/CRISP/foundry.toml @@ -5,7 +5,7 @@ libs = ["lib"] test = "tests" ffi = true fs_permissions = [{ access = "read-write", path = "./"}] -via_ir = true +via_ir = false optimizer = true optimizer-runs = 10_000_000 diff --git a/examples/CRISP/scripts/compile_circuits.sh b/examples/CRISP/scripts/compile_circuits.sh new file mode 100755 index 0000000000..16845e1cd6 --- /dev/null +++ b/examples/CRISP/scripts/compile_circuits.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Ensure we're in the right directory +cd "$(dirname "$0")/.." + +# Run the compilation script +./scripts/tasks/compile_circuits.sh \ No newline at end of file diff --git a/examples/CRISP/scripts/tasks/compile_circuits.sh b/examples/CRISP/scripts/tasks/compile_circuits.sh new file mode 100755 index 0000000000..5fa618f260 --- /dev/null +++ b/examples/CRISP/scripts/tasks/compile_circuits.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echo "noir" +# Ensure we're in the right directory +cd /app/examples/CRISP + +# Compile the circuit +echo "Compiling Noir circuit..." +if ! (cd circuits && nargo compile); then + echo "Error: Noir circuit compilation failed" + exit 1 +fi + +# Create the public circuits directory +echo "Creating public circuits directory..." +mkdir -p apps/client/libs/noir + +# Copy the compiled artifacts +echo "Copying circuit artifacts..." +if ! cp -r circuits/target/* apps/client/libs/noir/; then + echo "Error: Failed to copy circuit artifacts" + exit 1 +fi + +# Generate the Verifier +echo "Generating Verifier Key..." +if ! bb write_vk -b circuits/target/*.json -o circuits/target --oracle_hash keccak; then + echo "Error: Failed to generate Verifier Key" + exit 1 +fi + +echo "Generating Solidity Verifier..." +if ! bb write_solidity_verifier -k circuits/target/vk -o circuits/target/CRISPVerifier.sol; then + echo "Error: Failed to generate Solidity Verifier" + exit 1 +fi + +# Copy the Solidity Verifier to the contracts folder +echo "Copying Solidity Verifier to contracts folder..." +if ! cp circuits/target/CRISPVerifier.sol contracts/CRISPVerifier.sol; then + echo "Error: Failed to copy Solidity Verifier to contracts folder" + exit 1 +fi + +echo "Noir setup completed successfully" \ No newline at end of file diff --git a/examples/CRISP/scripts/tasks/setup.sh b/examples/CRISP/scripts/tasks/setup.sh index 0ac2e08d74..6ddd4e991b 100755 --- a/examples/CRISP/scripts/tasks/setup.sh +++ b/examples/CRISP/scripts/tasks/setup.sh @@ -21,3 +21,5 @@ echo "crisp-wasm-crypto" (cd ./apps/wasm-crypto && cargo check) echo "client" (cd ./apps/client && if [[ ! -f .env ]]; then cp .env.example .env; fi) +echo "noir" +./scripts/tasks/compile_circuits.sh diff --git a/packages/evm/package.json b/packages/evm/package.json index 7b2a85d555..f45fb9aacd 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -54,7 +54,7 @@ "ts-generator": "^0.1.1", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^5.3.3" + "typescript": "^5.8.3" }, "files": [ "contracts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8aab62af59..ec5c45113f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: dependencies: next: specifier: ^14.2.1 - version: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^2.13.4 - version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: ^2.13.4 - version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -31,17 +31,17 @@ importers: version: 18.3.1(react@18.3.1) sharp: specifier: ^0.34.1 - version: 0.34.1 + version: 0.34.2 devDependencies: '@types/node': specifier: 20.10.4 version: 20.10.4 '@types/react': specifier: ^18.2.66 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.6(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -59,7 +59,7 @@ importers: version: link:../../packages/evm '@semaphore-protocol/contracts': specifier: ^4.9.2 - version: 4.9.2 + version: 4.11.1 '@zk-kit/lean-imt.sol': specifier: 2.0.0 version: 2.0.0 @@ -68,32 +68,32 @@ importers: version: 0.0.5 solady: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.19 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 - version: 1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.5 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(a7f0110eca458f09074d1c2612ad945e) + version: 5.0.0(d1703b8c85cc657c19a30d0af9337a0a) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.5 version: 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -120,64 +120,70 @@ importers: version: 9.1.2 hardhat: specifier: ^2.22.10 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.4 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) playwright: specifier: 1.52.0 version: 1.52.0 solidity-coverage: specifier: ^0.8.1 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + version: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) typechain: specifier: ^8.3.0 - version: 8.3.2(typescript@5.8.2) + version: 8.3.2(typescript@5.5.4) typescript: specifier: ^5.5.4 - version: 5.8.2 + version: 5.5.4 wait-on: specifier: ^8.0.3 version: 8.0.3 examples/CRISP/apps/client: dependencies: + '@aztec/bb.js': + specifier: ^0.82.2 + version: 0.82.3 '@emotion/babel-plugin': specifier: ^11.11.0 version: 11.13.5 '@emotion/react': specifier: ^11.11.4 - version: 11.14.0(@types/react@18.3.20)(react@18.3.1) + version: 11.14.0(@types/react@18.3.23)(react@18.3.1) + '@noir-lang/noir_js': + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3 '@phosphor-icons/react': specifier: ^2.1.4 - version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semaphore-protocol/core': specifier: ^4.9.2 - version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@semaphore-protocol/data': specifier: ^4.9.2 - version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 4.11.1(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) '@svgr/rollup': specifier: ^8.1.0 - version: 8.1.0(rollup@4.40.0)(typescript@5.8.2) + version: 8.1.0(rollup@4.41.1)(typescript@5.5.4) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.74.3(react@18.3.1) + version: 5.79.2(react@18.3.1) axios: specifier: ^1.6.8 - version: 1.8.4 + version: 1.9.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.79.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)) ethers: specifier: ^6.12.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) react: specifier: ^18.2.0 version: 18.3.1 @@ -186,56 +192,56 @@ importers: version: 18.3.1(react@18.3.1) react-markdown: specifier: ^9.0.1 - version: 9.1.0(@types/react@18.3.20)(react@18.3.1) + version: 9.1.0(@types/react@18.3.23)(react@18.3.1) react-router-dom: specifier: ^6.22.3 - version: 6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-syntax-highlighter: specifier: ^15.5.0 version: 15.6.1(react@18.3.1) viem: specifier: ^2.27.0 - version: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + version: 0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)) + version: 4.3.2(typescript@5.5.4)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + version: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))) '@types/react': specifier: ^18.2.66 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.6(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) '@types/react-syntax-highlighter': specifier: ^15.5.11 version: 15.5.13 '@typescript-eslint/eslint-plugin': specifier: ^7.2.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.2.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.4(vite@5.4.18(@types/node@22.7.5)) + version: 4.5.0(vite@5.4.19(@types/node@22.7.5)) add: specifier: ^2.0.6 version: 2.0.6 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.3) + version: 10.4.21(postcss@8.5.4) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -244,7 +250,7 @@ importers: version: 4.6.2(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.6 - version: 0.4.19(eslint@8.57.1) + version: 0.4.20(eslint@8.57.1) gh-pages: specifier: ^6.1.1 version: 6.3.0 @@ -256,16 +262,16 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) typescript: specifier: ^5.2.2 - version: 5.8.2 + version: 5.5.4 vite: specifier: ^5.2.0 - version: 5.4.18(@types/node@22.7.5) + version: 5.4.19(@types/node@22.7.5) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) examples/basic: devDependencies: @@ -274,34 +280,34 @@ importers: version: link:../../packages/evm '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(3c85381c0b45919662d061966161e2b7) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(248454f03b5d7796fe0b22b5b4b634ab) + version: 5.0.0(21ac015ac60478c81ef64632993d75d8) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -316,22 +322,22 @@ importers: version: 4.5.0 ethers: specifier: ^6.4.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: ^2.14.0 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: specifier: ^0.8.0 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.5.4) @@ -346,38 +352,38 @@ importers: version: 0.4.0 solady: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.19 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(7a126116ab3a8428fc2292ff3b66a578) + version: 4.0.0(c9628f5d47e1b74ed759ca13ebe35860) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 - version: 5.2.0 + version: 5.3.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.0.2 - version: 5.2.0(@openzeppelin/contracts@5.2.0) + version: 5.3.0(@openzeppelin/contracts@5.3.0) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.5.3) '@typechain/ethers-v6': specifier: ^0.5.1 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -389,13 +395,13 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.10.4 - version: 20.17.30 + version: 20.10.4 '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^7.11.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@zk-kit/lean-imt': specifier: ^2.1.0 version: 2.2.3 @@ -410,7 +416,7 @@ importers: version: 7.0.3 dotenv: specifier: ^16.4.5 - version: 16.4.7 + version: 16.5.0 eslint: specifier: ^8.56.0 version: 8.57.1 @@ -419,19 +425,19 @@ importers: version: 9.1.0(eslint@8.57.1) ethers: specifier: ^6.9.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: specifier: ^11.2.0 version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -449,31 +455,31 @@ importers: version: 3.5.3 prettier-plugin-solidity: specifier: ^1.2.0 - version: 1.4.2(prettier@3.5.3) + version: 1.4.3(prettier@3.5.3) rimraf: specifier: ^5.0.5 version: 5.0.10 solhint: specifier: ^5.0.5 - version: 5.0.5(typescript@5.8.2) + version: 5.1.0(typescript@5.8.3) solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3) + version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3) solidity-coverage: specifier: ^0.8.5 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2) + version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.2 - version: 8.3.2(typescript@5.8.2) + version: 8.3.2(typescript@5.8.3) typescript: - specifier: ^5.3.3 - version: 5.8.2 + specifier: ^5.8.3 + version: 5.8.3 packages: @@ -483,6 +489,9 @@ packages: '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -491,42 +500,46 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@aztec/bb.js@0.82.3': + resolution: {integrity: sha512-jtnCqf+/QLw5yJGOmy818RMQqzHzHqcROtTdQZJybSxp0z3h76xpLSwoDQUBmZZVbP9e46FJjOLqB6gM9gY5cw==} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.3': + resolution: {integrity: sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} '@babel/generator@7.17.7': resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.27.3': + resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -548,99 +561,99 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.27.4': + resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.4': + resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -651,26 +664,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -681,356 +694,356 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/plugin-transform-block-scoping@7.27.3': + resolution: {integrity: sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.3': + resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.3': + resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-constant-elements@7.25.9': - resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + '@babel/plugin-transform-react-display-name@7.27.1': + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + '@babel/plugin-transform-regenerator@7.27.4': + resolution: {integrity: sha512-Glp/0n8xuj+E1588otw5rjJkTXfzW7FjH3IIUrfqiZOPQCd2vbg8e+DQE8jK9g4V5/zrxFW+D9WM9gboRPELpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + '@babel/plugin-transform-typescript@7.27.1': + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1040,40 +1053,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.26.3': - resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.27.4': + resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -1093,11 +1106,11 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@depay/solana-web3.js@1.98.1': - resolution: {integrity: sha512-3Qgf8cooFqaLCVCeA6KxNBU3aBWwS019a2IaPPIlpea/P4IOFAdZL1ZgnIFTsXAvugjqMAbegd2vfVJBd/ZJ6g==} + '@depay/solana-web3.js@1.98.2': + resolution: {integrity: sha512-O7SvHsZ6HGXlzSmjhj7mj0B/VvQQn8mzm/xKQ0SUrEUJVxg9zKFBlwIvxCtgf+IOrWlBJi6VqXRu7UznWvfrCA==} - '@depay/web3-blockchains@9.8.2': - resolution: {integrity: sha512-glJ1aFNG2ZljdmYS8Ei4ok+2eoCHPqK9lseJ4kBqqKTGNTRxZ2nVZQ1GxyiO9stuixyBowVFif0bRy9E6mAYZQ==} + '@depay/web3-blockchains@9.8.6': + resolution: {integrity: sha512-Fp2sGHjvRuqsLivfbL2qdhB447Fk/A0eS/iZj5VlzVnrpfa1Jt+tAKPk1c5T5tOYagnWaGG5DTFMuFNKiqRPkQ==} engines: {node: '>=18'} '@depay/web3-client@10.18.6': @@ -1595,8 +1608,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1621,6 +1634,11 @@ packages: engines: {node: '>=14'} hasBin: true + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -1629,6 +1647,10 @@ packages: resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + '@ethersproject/abi@5.8.0': resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} @@ -1761,14 +1783,14 @@ packages: '@iden3/binfileutils@0.0.12': resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] @@ -1818,55 +1840,61 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1899,8 +1927,8 @@ packages: '@lit-labs/ssr-dom-shim@1.3.0': resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} - '@lit/reactive-element@1.6.3': - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@lit/reactive-element@2.1.0': + resolution: {integrity: sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==} '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -1914,10 +1942,6 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} - '@metamask/eth-sig-util@4.0.1': - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - '@metamask/json-rpc-engine@7.3.3': resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -1989,28 +2013,18 @@ packages: '@motionone/dom@10.12.0': resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} - '@motionone/dom@10.18.0': - resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} - '@motionone/easing@10.18.0': resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} '@motionone/generators@10.18.0': resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} - '@motionone/svelte@10.16.4': - resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - '@motionone/types@10.17.1': resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} '@motionone/utils@10.18.0': resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - '@motionone/vue@10.16.4': - resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} - deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - '@napi-rs/simple-git-android-arm-eabi@0.1.19': resolution: {integrity: sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g==} engines: {node: '>= 10'} @@ -2099,59 +2113,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.28': - resolution: {integrity: sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==} + '@next/env@14.2.29': + resolution: {integrity: sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg==} - '@next/swc-darwin-arm64@14.2.28': - resolution: {integrity: sha512-kzGChl9setxYWpk3H6fTZXXPFFjg7urptLq5o5ZgYezCrqlemKttwMT5iFyx/p1e/JeglTwDFRtb923gTJ3R1w==} + '@next/swc-darwin-arm64@14.2.29': + resolution: {integrity: sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.28': - resolution: {integrity: sha512-z6FXYHDJlFOzVEOiiJ/4NG8aLCeayZdcRSMjPDysW297Up6r22xw6Ea9AOwQqbNsth8JNgIK8EkWz2IDwaLQcw==} + '@next/swc-darwin-x64@14.2.29': + resolution: {integrity: sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.28': - resolution: {integrity: sha512-9ARHLEQXhAilNJ7rgQX8xs9aH3yJSj888ssSjJLeldiZKR4D7N08MfMqljk77fAwZsWwsrp8ohHsMvurvv9liQ==} + '@next/swc-linux-arm64-gnu@14.2.29': + resolution: {integrity: sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.28': - resolution: {integrity: sha512-p6gvatI1nX41KCizEe6JkF0FS/cEEF0u23vKDpl+WhPe/fCTBeGkEBh7iW2cUM0rvquPVwPWdiUR6Ebr/kQWxQ==} + '@next/swc-linux-arm64-musl@14.2.29': + resolution: {integrity: sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.28': - resolution: {integrity: sha512-nsiSnz2wO6GwMAX2o0iucONlVL7dNgKUqt/mDTATGO2NY59EO/ZKnKEr80BJFhuA5UC1KZOMblJHWZoqIJddpA==} + '@next/swc-linux-x64-gnu@14.2.29': + resolution: {integrity: sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.28': - resolution: {integrity: sha512-+IuGQKoI3abrXFqx7GtlvNOpeExUH1mTIqCrh1LGFf8DnlUcTmOOCApEnPJUSLrSbzOdsF2ho2KhnQoO0I1RDw==} + '@next/swc-linux-x64-musl@14.2.29': + resolution: {integrity: sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.28': - resolution: {integrity: sha512-l61WZ3nevt4BAnGksUVFKy2uJP5DPz2E0Ma/Oklvo3sGj9sw3q7vBWONFRgz+ICiHpW5mV+mBrkB3XEubMrKaA==} + '@next/swc-win32-arm64-msvc@14.2.29': + resolution: {integrity: sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.28': - resolution: {integrity: sha512-+Kcp1T3jHZnJ9v9VTJ/yf1t/xmtFAc/Sge4v7mVc1z+NYfYzisi8kJ9AsY8itbgq+WgEwMtOpiLLJsUy2qnXZw==} + '@next/swc-win32-ia32-msvc@14.2.29': + resolution: {integrity: sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.28': - resolution: {integrity: sha512-1gCmpvyhz7DkB1srRItJTnmR2UwQPAUXXIg9r0/56g3O8etGmwlX68skKXJOp9EejW3hhv7nSQUJ2raFiz4MoA==} + '@next/swc-win32-x64-msvc@14.2.29': + resolution: {integrity: sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2160,6 +2174,10 @@ packages: resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} engines: {node: ^14.21.3 || >=16} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} @@ -2174,6 +2192,14 @@ packages: resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -2193,6 +2219,14 @@ packages: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -2208,63 +2242,49 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.8.0': - resolution: {integrity: sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==} - engines: {node: '>= 18'} + '@noir-lang/acvm_js@1.0.0-beta.3': + resolution: {integrity: sha512-Dc6g5rJr/x7tKsWvnTbZvjwqI1uiAtvq+NAz5tcLRzUHJw6NAvDXEH5h117h+BfIAhhsHXuPTkDfDB1Gnqp/Bg==} - '@nomicfoundation/edr-darwin-x64@0.8.0': - resolution: {integrity: sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==} - engines: {node: '>= 18'} + '@noir-lang/noir_js@1.0.0-beta.3': + resolution: {integrity: sha512-Nt/rP7zRMOfNq9urD8+GtRpYqEc0K10FoKXs/v+ZTbGaP6Jkm7+F+UPj2bkWy66k1HNzsN6ortli7c7mnLDHwA==} - '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': - resolution: {integrity: sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==} - engines: {node: '>= 18'} + '@noir-lang/noirc_abi@1.0.0-beta.3': + resolution: {integrity: sha512-L6BI64ennatwTUciHqQ14ahUFsgzL41tzghqUELzO7XojasStcWDaSMjlTxca/2pvpWtEJHDtseKe1VZWIIVXQ==} - '@nomicfoundation/edr-linux-arm64-musl@0.8.0': - resolution: {integrity: sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==} - engines: {node: '>= 18'} + '@noir-lang/types@1.0.0-beta.3': + resolution: {integrity: sha512-BPOmf0qDiTn4wH1Lo7mHa67GTQFueIVaDUcUb+N9+ALiXC5nVU8HrzWmx1yvZB64ZiCEy7yPdNEaNrszSrE2fg==} - '@nomicfoundation/edr-linux-x64-gnu@0.8.0': - resolution: {integrity: sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==} + '@nomicfoundation/edr-darwin-arm64@0.11.0': + resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.8.0': - resolution: {integrity: sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==} + '@nomicfoundation/edr-darwin-x64@0.11.0': + resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.8.0': - resolution: {integrity: sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': + resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.8.0': - resolution: {integrity: sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==} + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': + resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-common@4.0.4': - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': + resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-rlp@5.0.4': - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} - hasBin: true + '@nomicfoundation/edr-linux-x64-musl@0.11.0': + resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-tx@5.0.4': - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': + resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-util@9.0.4': - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true + '@nomicfoundation/edr@0.11.0': + resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} + engines: {node: '>= 18'} '@nomicfoundation/hardhat-chai-matchers@2.0.8': resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} @@ -2348,10 +2368,10 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' - '@nomicfoundation/hardhat-verify@2.0.13': - resolution: {integrity: sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g==} + '@nomicfoundation/hardhat-verify@2.0.14': + resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} peerDependencies: - hardhat: ^2.0.4 + hardhat: ^2.24.1 '@nomicfoundation/ignition-core@0.15.11': resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} @@ -2391,13 +2411,10 @@ packages: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} - '@openzeppelin/contracts-upgradeable@5.2.0': - resolution: {integrity: sha512-mZIu9oa4tQTlGiOJHk6D3LdJlqFqF6oNOSn6S6UVJtzfs9UsY9/dhMEbAVTwElxUtJnjpf6yA062+oBp+eOyPg==} + '@openzeppelin/contracts-upgradeable@5.3.0': + resolution: {integrity: sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg==} peerDependencies: - '@openzeppelin/contracts': 5.2.0 - - '@openzeppelin/contracts@5.2.0': - resolution: {integrity: sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==} + '@openzeppelin/contracts': 5.3.0 '@openzeppelin/contracts@5.3.0': resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} @@ -2406,8 +2423,8 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' - '@phosphor-icons/react@2.1.7': - resolution: {integrity: sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==} + '@phosphor-icons/react@2.1.10': + resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} engines: {node: '>=10'} peerDependencies: react: '>= 16.8' @@ -2446,6 +2463,35 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} + '@reown/appkit-common@1.7.3': + resolution: {integrity: sha512-wKTr6N3z8ly17cc51xBEVkZK4zAd8J1m7RubgsdQ1olFY9YJGe61RYoNv9yFjt6tUVeYT+z7iMUwPhX2PziefQ==} + + '@reown/appkit-controllers@1.7.3': + resolution: {integrity: sha512-aqAcX/nZe0gwqjncyCkVrAk3lEw0qZ9xGrdLOmA207RreO4J0Vxu8OJXCBn4C2AUI2OpBxCPah+vyuKTUJTeHQ==} + + '@reown/appkit-polyfills@1.7.3': + resolution: {integrity: sha512-vQUiAyI7WiNTUV4iNwv27iigdeg8JJTEo6ftUowIrKZ2/gtE2YdMtGpavuztT/qrXhrIlTjDGp5CIyv9WOTu4g==} + + '@reown/appkit-scaffold-ui@1.7.3': + resolution: {integrity: sha512-ssB15fcjmoKQ+VfoCo7JIIK66a4SXFpCH8uK1CsMmXmKIKqPN54ohLo291fniV6mKtnJxh5Xm68slGtGrO3bmA==} + + '@reown/appkit-ui@1.7.3': + resolution: {integrity: sha512-zKmFIjLp0X24pF9KtPtSHmdsh/RjEWIvz+faIbPGm4tQbwcxdg9A35HeoP0rMgKYx49SX51LgPwVXne2gYacqQ==} + + '@reown/appkit-utils@1.7.3': + resolution: {integrity: sha512-8/MNhmfri+2uu8WzBhZ5jm5llofOIa1dyXDXRC/hfrmGmCFJdrQKPpuqOFYoimo2s2g70pK4PYefvOKgZOWzgg==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.3': + resolution: {integrity: sha512-D0pExd0QUE71ursQPp3pq/0iFrz2oz87tOyFifrPANvH5X0RQCYn/34/kXr+BFVQzNFfCBDlYP+CniNA/S0KiQ==} + + '@reown/appkit@1.7.3': + resolution: {integrity: sha512-aA/UIwi/dVzxEB62xlw3qxHa3RK1YcPMjNxoGj/fHNCqL2qWmbcOXT7coCUa9RG7/Bh26FZ3vdVT2v71j6hebQ==} + + '@rolldown/pluginutils@1.0.0-beta.9': + resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} + '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} @@ -2473,121 +2519,121 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.41.1': + resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.41.1': + resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.41.1': + resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.41.1': + resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.41.1': + resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.41.1': + resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.41.1': + resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.41.1': + resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.41.1': + resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.41.1': + resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.41.1': + resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.41.1': + resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.41.1': + resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.41.1': + resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.41.1': + resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} cpu: [x64] os: [win32] - '@safe-global/safe-apps-provider@0.18.5': - resolution: {integrity: sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==} + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} '@safe-global/safe-apps-sdk@9.1.0': resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - '@safe-global/safe-gateway-typescript-sdk@3.22.9': - resolution: {integrity: sha512-7ojVK/crhOaGowEO8uYWaopZzcr5rR76emgllGIfjCLR70aY4PbASpi9Pbs+7jIRzPDBBkM0RBo+zYx5UduX8Q==} + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} engines: {node: '>=16'} '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - '@scure/base@1.2.4': - resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -2601,6 +2647,9 @@ packages: '@scure/bip32@1.6.2': resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -2613,29 +2662,32 @@ packages: '@scure/bip39@1.5.4': resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - '@semaphore-protocol/contracts@4.9.2': - resolution: {integrity: sha512-/DnZ9SOzBsfv06Vz74djVHEPgZwIkdNt7e5Ay2612Rw22EwToedQX5ahJxfG9vbgHleOZ1iAV4y+XKmDhPpDBg==} + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@semaphore-protocol/contracts@4.11.1': + resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} - '@semaphore-protocol/core@4.9.2': - resolution: {integrity: sha512-Dc0ZVCcWuCiCA2Y6GXmsRVjpA+sA06dUiGlx+e6CY/8B6xQtz8TQm10DNWayqe0YkL9Bld/JWyN3rdIoZf3uEA==} + '@semaphore-protocol/core@4.11.1': + resolution: {integrity: sha512-FYF9k5peTC1dvILBma9kxdBaxl6VHJ3Z87Y74rOryzgSrAZMnwLUg87T5BMf6rtmqd6IP507UbGuMB3G7eTk3g==} - '@semaphore-protocol/data@4.9.2': - resolution: {integrity: sha512-wKkxRrKY6RrTMyaglRH/62cq+zP+6Xn15ViR6O4wrKVzzEv4X3zLbjBNKBW6XgU9Lnh5UbVQFOdAQplvrrwGFw==} + '@semaphore-protocol/data@4.11.1': + resolution: {integrity: sha512-vOwZ3ywD6wofUSR1s0tpS8wg1pL0H3rs1S8zHOEJ9zLnnBMFPGgjy6eUI68uoRC9kKDB6/hypDj0ncHyFq6nBA==} - '@semaphore-protocol/group@4.9.2': - resolution: {integrity: sha512-NkCYtl3BcaNaGy1Oc5LvDScimDPu47bebqYH9cm+21nLKOsCFNmFcG70if2TY2e1Q/eyvB8tnK01a39nHs4pLw==} + '@semaphore-protocol/group@4.11.1': + resolution: {integrity: sha512-YJwLpAc0sOzlgZwDw62QRj1BJ3PXPQdFYqt0lhNvbhPosFAmjfHW+gr7xYuBku/oQJ4clm+fLQniAd37a+ZXHg==} - '@semaphore-protocol/identity@4.9.2': - resolution: {integrity: sha512-kHxcAfOyJ5yfo5Y82JCsIc+UD1+nsYg0NA7tRLg/FqYYnkLd/YZ1BkvRGRccZOKUW7S9VQERN7CVqBzXprxjTg==} + '@semaphore-protocol/identity@4.11.1': + resolution: {integrity: sha512-HVnm8TA7+tz1WiRpLhgiqZspsNfTrtUlArhiYg4GaZz4Xh3Xf8ryjcSVJLIiAmGu0eP46yg8GuRa6vW6I9Oi+g==} - '@semaphore-protocol/proof@4.9.2': - resolution: {integrity: sha512-bf8xg12R3mWsywIarEFOFTP/atmrEGPJIwneRliC3dFKT7kzdrZvta2czJGejNURp3PIVIKNRONPkp+JyThNAw==} + '@semaphore-protocol/proof@4.11.1': + resolution: {integrity: sha512-wnSIAUFtcAu/QhBZcq20lJE/7X4fwG6qq/LsDFnLB9GKMYXR2fdBCUPhoER34ojjJqSwrwqW+vk/omb3icqplA==} peerDependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/utils@4.9.2': - resolution: {integrity: sha512-cSDwsk5ADLUaQv++3dX+GhCPm3dJB4/gTUK+Rhv6mPc9JEPk2xrmmDDB7DM+/wOAIK7wfo1IksMLwEK+/Du95Q==} + '@semaphore-protocol/utils@4.11.1': + resolution: {integrity: sha512-lTzZo9RV1wUyFXVnDcnSV3cDYfoMfmG17Sl9M1I7L82JX19LBPNJ1olBQbloC6UvyzE6DaqQ783MJnTkWEoDjg==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -2684,8 +2736,8 @@ packages: '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - '@solidity-parser/parser@0.19.0': - resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} + '@solidity-parser/parser@0.20.1': + resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} @@ -2765,71 +2817,71 @@ packages: resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==} engines: {node: '>=14'} - '@swc/core-darwin-arm64@1.11.16': - resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} + '@swc/core-darwin-arm64@1.11.29': + resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.16': - resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} + '@swc/core-darwin-x64@1.11.29': + resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.16': - resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} + '@swc/core-linux-arm-gnueabihf@1.11.29': + resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.16': - resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} + '@swc/core-linux-arm64-gnu@1.11.29': + resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.16': - resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} + '@swc/core-linux-arm64-musl@1.11.29': + resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.16': - resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} + '@swc/core-linux-x64-gnu@1.11.29': + resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.16': - resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} + '@swc/core-linux-x64-musl@1.11.29': + resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.16': - resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} + '@swc/core-win32-arm64-msvc@1.11.29': + resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.16': - resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} + '@swc/core-win32-ia32-msvc@1.11.29': + resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.16': - resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} + '@swc/core-win32-x64-msvc@1.11.29': + resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.16': - resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} + '@swc/core@1.11.29': + resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': '*' + '@swc/helpers': '>=0.5.17' peerDependenciesMeta: '@swc/helpers': optional: true @@ -2837,9 +2889,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -2887,22 +2936,22 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.74.3': - resolution: {integrity: sha512-Mqk+5o3qTuAiZML248XpNH8r2cOzl15+LTbUsZQEwvSvn1GU4VQhvqzAbil36p+MBxpr/58oBSnRzhrBevDhfg==} + '@tanstack/query-core@5.79.2': + resolution: {integrity: sha512-kr+KQrBuqd6495eP9S41BoftFI1H50XA9O+6FmbnTx/Te6bjiq1mj8rt9rJjW3YZSO2aaUNUres0TWesJW1j1g==} - '@tanstack/react-query@5.74.3': - resolution: {integrity: sha512-QrycUn0wxjVPzITvQvOxFRdhlAwIoOQSuav7qWD4SWCoKCdLbyRZ2vji2GuBq/glaxbF4wBx3fqcYRDOt8KDTA==} + '@tanstack/react-query@5.79.2': + resolution: {integrity: sha512-kadeprsH6bWuhHCpqukXHRykJkxcLBxAaF0cQ05yawPmLZ/KiCpR1DyQenonF7A/70rnRUxhJD0RJejqk9wImQ==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.8': - resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} + '@tanstack/react-virtual@3.13.9': + resolution: {integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.8': - resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} + '@tanstack/virtual-core@3.13.9': + resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} '@theguild/remark-mermaid@0.0.5': resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} @@ -2967,9 +3016,6 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} @@ -3057,9 +3103,6 @@ packages: '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - '@types/node@20.17.30': - resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} - '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -3078,19 +3121,19 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - '@types/react-dom@18.3.6': - resolution: {integrity: sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 '@types/react-syntax-highlighter@15.5.13': resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@18.3.23': + resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} '@types/resolve@0.0.8': resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} @@ -3174,24 +3217,24 @@ packages: '@viem/anvil@0.0.7': resolution: {integrity: sha512-F+3ljCT1bEt8T4Fzm9gWpIgO3Dc7bzG1TtUtkStkJFMuummqZ8kvYc3UFMo5j3F51fSWZZvEkjs3+i7qf0AOqQ==} - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + '@vitejs/plugin-react@4.5.0': + resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@wagmi/connectors@5.7.12': - resolution: {integrity: sha512-pLFuZ1PsLkNyY11mx0+IOrMM7xACWCBRxaulfX17osqixkDFeOAyqFGBjh/XxkvRyrDJUdO4F+QHEeSoOiPpgg==} + '@wagmi/connectors@5.8.3': + resolution: {integrity: sha512-U4SJgi91+ny/XDGQWAMmawMafDx1BofcbYkPT/WSU6XrGL+apa7VltscqY7PVmwVGi/CYTqe8nlQiK/wmQ8D3A==} peerDependencies: - '@wagmi/core': 2.16.7 + '@wagmi/core': 2.17.2 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/core@2.16.7': - resolution: {integrity: sha512-Kpgrw6OXV0VBhDs4toQVKQ0NK5yUO6uxEqnvRGjNjbO85d93Gbfsp5BlxSLeWq6iVMSBFSitdl5i9W7b1miq1g==} + '@wagmi/core@2.17.2': + resolution: {integrity: sha512-p1z8VU0YuRClx2bdPoFObDF7M2Reitz9AdByrJ+i5zcPCHuJ/UjaWPv6xD7ydhkWVK0hoa8vQ/KtaiEwEQS7Mg==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -3206,11 +3249,15 @@ packages: resolution: {integrity: sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==} engines: {node: '>=18'} + '@walletconnect/core@2.20.2': + resolution: {integrity: sha512-48XnarxQQrpJ0KZJOjit56DxuzfVRYUdL8XVMvUh/ZNUiX2FB5w6YuljUUeTLfYOf04Et6qhVGEUkmX3W+9/8w==} + engines: {node: '>=18'} + '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - '@walletconnect/ethereum-provider@2.19.2': - resolution: {integrity: sha512-NzPzNcjMLqow6ha2nssB1ciMD0cdHZesYcHSQKjCi9waIDMov9Fr2yEJccbiVFE3cxek7f9dCPsoZez2q8ihvg==} + '@walletconnect/ethereum-provider@2.20.2': + resolution: {integrity: sha512-fGNJtytHuBWZcmMXRIG1djlfEiPMvPJ0R3JlfJjAx2VfVN+O+1xdF6QSWcZxFizviIUFJV+f1zWt0V2VVD61Rg==} '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -3244,15 +3291,6 @@ packages: '@walletconnect/logger@2.1.2': resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - '@walletconnect/modal-core@2.7.0': - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - - '@walletconnect/modal-ui@2.7.0': - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - - '@walletconnect/modal@2.7.0': - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} - '@walletconnect/relay-api@1.0.11': resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} @@ -3265,18 +3303,30 @@ packages: '@walletconnect/sign-client@2.19.2': resolution: {integrity: sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==} + '@walletconnect/sign-client@2.20.2': + resolution: {integrity: sha512-KyeDToypZ1OjCbij4Jx0cAg46bMwZ6zCKt0HzCkqENcex3Zchs7xBp9r8GtfEMGw+PUnXwqrhzmLBH0x/43oIQ==} + '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} '@walletconnect/types@2.19.2': resolution: {integrity: sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==} + '@walletconnect/types@2.20.2': + resolution: {integrity: sha512-XPPbJM/mGU05i6jUxhC3yI/YvhSF6TYJQ5SXTWM53lVe6hs6ukvlEhPctu9ZBTGwGFhwPXIjtK/eWx+v4WY5iw==} + '@walletconnect/universal-provider@2.19.2': resolution: {integrity: sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==} + '@walletconnect/universal-provider@2.20.2': + resolution: {integrity: sha512-6uVu1E88tioaXEEJCbJKwCIQlOHif1nmfY092BznZEnBn2lli5ICzQh2bxtUDNmNNLKsMDI3FV1fODFeWMVJTQ==} + '@walletconnect/utils@2.19.2': resolution: {integrity: sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==} + '@walletconnect/utils@2.20.2': + resolution: {integrity: sha512-2uRUDvpYSIJFYcr1WIuiFy6CEszLF030o6W8aDMkGk9/MfAZYEJQHMJcjWyaNMPHLJT0POR5lPaqkYOpuyPIQQ==} + '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -3526,8 +3576,8 @@ packages: axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -3585,6 +3635,9 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -3607,11 +3660,11 @@ packages: bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3665,8 +3718,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3766,8 +3819,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001713: - resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} + caniuse-lite@1.0.30001720: + resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3929,6 +3982,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -3954,6 +4010,10 @@ packages: resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} engines: {node: '>=18'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -4020,8 +4080,8 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4077,8 +4137,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.4: - resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} @@ -4291,8 +4351,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4364,6 +4424,11 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} @@ -4434,8 +4499,8 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -4451,8 +4516,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.14: - resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} ejs@3.1.10: @@ -4460,8 +4525,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.137: - resolution: {integrity: sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==} + electron-to-chromium@1.5.162: + resolution: {integrity: sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4560,6 +4625,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} @@ -4577,8 +4647,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.19: - resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: eslint: '>=8.40' @@ -4627,6 +4697,10 @@ packages: resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} engines: {node: '>=0.10.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4696,13 +4770,6 @@ packages: ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - deprecated: This library has been deprecated and usage is discouraged. - - ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} @@ -4714,18 +4781,14 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} - ethers@6.13.5: - resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + ethers@6.14.3: + resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} - ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} @@ -4818,8 +4881,8 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4829,6 +4892,9 @@ packages: ffjavascript@0.3.0: resolution: {integrity: sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5126,8 +5192,8 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - h3@1.15.1: - resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} + h3@1.15.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -5142,13 +5208,13 @@ packages: peerDependencies: hardhat: ^2.0.2 - hardhat-gas-reporter@2.2.2: - resolution: {integrity: sha512-xlg3d00wrgUvP2S5tw3Zf6nO7OyS5crK3P6/ZP69i24pz4grM+6oFHGW/eJPSGqiDWBYX+gKp9XoqP4rwRXrdQ==} + hardhat-gas-reporter@2.3.0: + resolution: {integrity: sha512-ySdA+044xMQv1BlJu5CYXToHzMexKFfIWxlQTBNNoerx1x96+d15IMdN01iQZ/TJ7NH2V5sU73bz77LoS/PEVw==} peerDependencies: hardhat: ^2.16.0 - hardhat@2.22.19: - resolution: {integrity: sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==} + hardhat@2.24.1: + resolution: {integrity: sha512-3iwrO2liEGCw1rz/l/mlB1rSNexCc4CFcMj0DlvjXGChzmD3sGUgLwWDOZPf+ya8MEm5ZhO1oprRVmb/wVi0YA==} hasBin: true peerDependencies: ts-node: '*' @@ -5289,8 +5355,8 @@ packages: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -5335,8 +5401,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - idb-keyval@6.2.1: - resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5558,6 +5624,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -5722,14 +5793,14 @@ packages: listenercount@1.0.1: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + lit-element@4.2.0: + resolution: {integrity: sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==} - lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + lit-html@3.3.0: + resolution: {integrity: sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==} - lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + lit@3.1.0: + resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} @@ -5954,9 +6025,15 @@ packages: mermaid@10.9.3: resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -6209,9 +6286,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -6254,8 +6328,8 @@ packages: react: '>=16.x <=18.x' react-dom: '>=16.x <=18.x' - next-seo@6.6.0: - resolution: {integrity: sha512-0VSted/W6XNtgAtH3D+BZrMLLudqfm0D5DYNJRXHcDgan/1ZF1tDFIsWrmvQlYngALyphPfZ3ZdOqlKpKdvG6w==} + next-seo@6.8.0: + resolution: {integrity: sha512-zcxaV67PFXCSf8e6SXxbxPaOTgc8St/esxfsYXfQXMM24UESUVSXFm7f2A9HMkAwa0Gqn4s64HxYZAGfdF4Vhg==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' @@ -6268,8 +6342,8 @@ packages: react: '*' react-dom: '*' - next@14.2.28: - resolution: {integrity: sha512-QLEIP/kYXynIxtcKB6vNjtWLVs3Y4Sb+EClTC/CSVzdLD1gIuItccpu/n1lhmduffI32iPGEK2cLLxxt28qgYA==} + next@14.2.29: + resolution: {integrity: sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -6459,8 +6533,8 @@ packages: typescript: optional: true - ox@0.6.9: - resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + ox@0.7.1: + resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -6509,6 +6583,9 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -6715,12 +6792,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.8: + resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -6734,8 +6811,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.4.2: - resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} + prettier-plugin-solidity@1.4.3: + resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' @@ -6837,8 +6914,8 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -6846,8 +6923,8 @@ packages: protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} - proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -6934,19 +7011,19 @@ packages: '@types/react': '>=18' react: '>=18' - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@6.30.0: - resolution: {integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==} + react-router-dom@6.30.1: + resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.30.0: - resolution: {integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==} + react-router@6.30.1: + resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -7022,12 +7099,6 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -7173,8 +7244,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.41.1: + resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7237,8 +7308,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -7268,8 +7339,8 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - sharp@0.34.1: - resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: @@ -7288,8 +7359,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} shelljs@0.8.5: @@ -7352,8 +7423,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - solady@0.1.13: - resolution: {integrity: sha512-AA/VFTwxihDxk/LE2oN5xBiwE1vQtvmqOl55EDH2RwMuqLmUH1aOEMoGLCO0jyPMBZ3qnvXKfg2oRKy6s7V/zg==} + solady@0.1.19: + resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} solady@0.1.4: resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} @@ -7369,12 +7440,12 @@ packages: prettier: ^3.0.0 prettier-plugin-solidity: ^1.0.0 - solhint@5.0.5: - resolution: {integrity: sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==} + solhint@5.1.0: + resolution: {integrity: sha512-KWg4gnOnznxHXzH0fUvnhnxnk+1R50GiPChcPeQgA7SKQTSF1LLIEh8R1qbkCEn/fFzz4CfJs+Gh7Rl9uhHy+g==} hasBin: true - solidity-coverage@0.8.14: - resolution: {integrity: sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==} + solidity-coverage@0.8.16: + resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -7565,6 +7636,9 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -7653,8 +7727,8 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} tinygradient@1.1.5: @@ -7753,8 +7827,8 @@ packages: '@swc/wasm': optional: true - tsconfck@3.1.5: - resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -7797,12 +7871,6 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -7845,8 +7913,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -7973,8 +8041,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unstorage@1.15.0: - resolution: {integrity: sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==} + unstorage@1.16.0: + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -7982,7 +8050,7 @@ packages: '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 '@deno/kv': '>=0.9.0' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 @@ -8094,8 +8162,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - valtio@1.11.2: - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=16.8' @@ -8132,16 +8200,16 @@ packages: typescript: optional: true - viem@2.27.0: - resolution: {integrity: sha512-pKw2dcwDi6TaWlTzLHYazOgjO1GgbUpE1zdLsLNSiCjHNrMTpL/teL0wVHnJDLiB2tR5CL19LBqefYNtRUkH5Q==} + viem@2.23.7: + resolution: {integrity: sha512-Gbyz0uE3biWDPxECrEyzILWPsnIgDREgfRMuLSWHSSnM6ktefSC/lqQNImnxESdDEixa8/6EWXjmf2H6L9VV0A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - viem@2.7.14: - resolution: {integrity: sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==} + viem@2.30.6: + resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -8179,8 +8247,8 @@ packages: vite: optional: true - vite@5.4.18: - resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8219,8 +8287,8 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - wagmi@2.14.16: - resolution: {integrity: sha512-njOPvB8L0+jt3m1FTJiVF44T1u+kcjLtVWKvwI0mZnIesZTQZ/xDF0M/NHj3Uljyn3qJw3pyHjJe31NC+VVHMA==} + wagmi@2.15.4: + resolution: {integrity: sha512-0m7uo6t/oSFS+4UCUTBnmIhDSP7PGJz1qx4VtALcsBnw81UPPIXMSM8oGVrUNV9CptryiDgBlh4iYmRldg9iaA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -8247,6 +8315,9 @@ packages: web-worker@1.2.0: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} @@ -8363,8 +8434,8 @@ packages: utf-8-validate: optional: true - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -8403,9 +8474,9 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@18.1.3: @@ -8453,8 +8524,8 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.48: + resolution: {integrity: sha512-0X1mz8FtgEIvaxGjdIImYpZEaZMrund9pGXm3M6vM7Reba0e2eI71KPjSCGXBfwKDPwPoywf6waUKc3/tFvX2Q==} zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} @@ -8483,6 +8554,8 @@ snapshots: '@adraffy/ens-normalize@1.10.1': {} + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -8490,28 +8563,39 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.26.2': + '@aztec/bb.js@0.82.3': + dependencies: + comlink: 4.4.2 + commander: 12.1.0 + debug: 4.4.1(supports-color@5.5.0) + fflate: 0.8.2 + pako: 2.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.3': {} - '@babel/core@7.26.10': + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.4 + '@babel/parser': 7.27.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8520,56 +8604,56 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.27.0': + '@babel/generator@7.27.3': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -8577,711 +8661,709 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9(supports-color@5.5.0)': + '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.0': + '@babel/helpers@7.27.4': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 - '@babel/parser@7.27.0': + '@babel/parser@7.27.4': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoping@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.27.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/compat-data': 7.27.3 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.4(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.3 esutils: 2.0.3 - '@babel/preset-react@7.26.3(@babel/core@7.26.10)': + '@babel/preset-react@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.4': {} - '@babel/template@7.27.0': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 '@babel/traverse@7.23.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.3 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@5.5.0) + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.0(supports-color@5.5.0)': + '@babel/traverse@7.27.4(supports-color@5.5.0)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@5.5.0) + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.3 + '@babel/parser': 7.27.4 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.17.0': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 to-fast-properties: 2.0.0 - '@babel/types@7.27.0': + '@babel/types@7.27.3': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@braintree/sanitize-url@6.0.4': {} '@coinbase/wallet-sdk@3.9.3': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 buffer: 6.0.3 clsx: 1.2.1 eth-block-tracker: 7.1.0 eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.26.5 + preact: 10.26.8 sha.js: 2.4.11 transitivePeerDependencies: - supports-color '@coinbase/wallet-sdk@4.3.0': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.26.5 + preact: 10.26.8 '@colors/colors@1.5.0': optional: true @@ -9290,20 +9372,20 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@depay/solana-web3.js@1.98.1': + '@depay/solana-web3.js@1.98.2': dependencies: bs58: 5.0.0 - '@depay/web3-blockchains@9.8.2': {} + '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': dependencies: - '@depay/solana-web3.js': 1.98.1 - '@depay/web3-blockchains': 9.8.2 + '@depay/solana-web3.js': 1.98.2 + '@depay/web3-blockchains': 9.8.6 '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/web3-blockchains': 9.8.2 + '@depay/web3-blockchains': 9.8.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -9311,16 +9393,16 @@ snapshots: '@depay/web3-mock@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/solana-web3.js': 1.98.1 - '@depay/web3-blockchains': 9.8.2 + '@depay/solana-web3.js': 1.98.2 + '@depay/web3-blockchains': 9.8.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@ecies/ciphers@0.2.3(@noble/ciphers@1.2.1)': + '@ecies/ciphers@0.2.3(@noble/ciphers@1.3.0)': dependencies: - '@noble/ciphers': 1.2.1 + '@noble/ciphers': 1.3.0 '@emnapi/runtime@1.4.3': dependencies: @@ -9329,8 +9411,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/runtime': 7.27.0 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/runtime': 7.27.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -9367,9 +9449,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -9379,7 +9461,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 transitivePeerDependencies: - supports-color @@ -9614,7 +9696,7 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -9624,7 +9706,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -9644,6 +9726,8 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} + '@ethereumjs/rlp@5.0.2': {} + '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 @@ -9657,6 +9741,11 @@ snapshots: ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + '@ethersproject/abi@5.8.0': dependencies: '@ethersproject/address': 5.8.0 @@ -9716,7 +9805,7 @@ snapshots: dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 '@ethersproject/bytes@5.8.0': dependencies: @@ -9849,7 +9938,7 @@ snapshots: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 '@ethersproject/properties': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 elliptic: 6.6.1 hash.js: 1.1.7 @@ -9923,7 +10012,7 @@ snapshots: '@excubiae/contracts@0.4.0': dependencies: '@openzeppelin/contracts': 5.3.0 - '@semaphore-protocol/contracts': 4.9.2 + '@semaphore-protocol/contracts': 4.11.1 solady: 0.1.4 '@fastify/busboy@2.1.1': {} @@ -9936,7 +10025,7 @@ snapshots: '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9944,7 +10033,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9960,12 +10049,12 @@ snapshots: fastfile: 0.0.20 ffjavascript: 0.3.0 - '@img/sharp-darwin-arm64@0.34.1': + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.34.1': + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true @@ -9997,45 +10086,48 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.34.1': + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.34.1': + '@img/sharp-linux-arm@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.34.1': + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.34.1': + '@img/sharp-linux-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.34.1': + '@img/sharp-wasm32@0.34.2': dependencies: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.34.1': + '@img/sharp-win32-arm64@0.34.2': optional: true - '@img/sharp-win32-x64@0.34.1': + '@img/sharp-win32-ia32@0.34.2': + optional: true + + '@img/sharp-win32-x64@0.34.2': optional: true '@isaacs/cliui@8.0.2': @@ -10071,7 +10163,7 @@ snapshots: '@lit-labs/ssr-dom-shim@1.3.0': {} - '@lit/reactive-element@1.6.3': + '@lit/reactive-element@2.1.0': dependencies: '@lit-labs/ssr-dom-shim': 1.3.0 @@ -10100,7 +10192,7 @@ snapshots: '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.20 + '@types/react': 18.3.23 react: 18.3.1 '@metamask/eth-json-rpc-provider@1.0.1': @@ -10111,14 +10203,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@metamask/eth-sig-util@4.0.1': - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - '@metamask/json-rpc-engine@7.3.3': dependencies: '@metamask/rpc-errors': 6.4.0 @@ -10181,13 +10265,13 @@ snapshots: '@metamask/safe-event-emitter@3.1.2': {} - '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.0(supports-color@5.5.0) - eciesjs: 0.4.14 + debug: 4.4.1(supports-color@5.5.0) + eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -10202,23 +10286,23 @@ snapshots: '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.32.0 '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.0(supports-color@5.5.0) - eciesjs: 0.4.14 + debug: 4.4.1(supports-color@5.5.0) + eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 obj-multiplex: 1.0.0 pump: 3.0.2 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - tslib: 2.7.0 + tslib: 2.8.1 util: 0.12.5 uuid: 8.3.2 transitivePeerDependencies: @@ -10233,8 +10317,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@5.5.0) - semver: 7.7.1 + debug: 4.4.1(supports-color@5.5.0) + semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -10243,12 +10327,12 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.2.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 - semver: 7.7.1 + semver: 7.7.2 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10257,12 +10341,12 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.2.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 - semver: 7.7.1 + semver: 7.7.2 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10275,15 +10359,6 @@ snapshots: tslib: 2.8.1 '@motionone/dom@10.12.0': - dependencies: - '@motionone/animation': 10.18.0 - '@motionone/generators': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - hey-listen: 1.0.8 - tslib: 2.7.0 - - '@motionone/dom@10.18.0': dependencies: '@motionone/animation': 10.18.0 '@motionone/generators': 10.18.0 @@ -10303,11 +10378,6 @@ snapshots: '@motionone/utils': 10.18.0 tslib: 2.8.1 - '@motionone/svelte@10.16.4': - dependencies: - '@motionone/dom': 10.18.0 - tslib: 2.8.1 - '@motionone/types@10.17.1': {} '@motionone/utils@10.18.0': @@ -10316,11 +10386,6 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - '@motionone/vue@10.16.4': - dependencies: - '@motionone/dom': 10.18.0 - tslib: 2.8.1 - '@napi-rs/simple-git-android-arm-eabi@0.1.19': optional: true @@ -10380,37 +10445,39 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@14.2.28': {} + '@next/env@14.2.29': {} - '@next/swc-darwin-arm64@14.2.28': + '@next/swc-darwin-arm64@14.2.29': optional: true - '@next/swc-darwin-x64@14.2.28': + '@next/swc-darwin-x64@14.2.29': optional: true - '@next/swc-linux-arm64-gnu@14.2.28': + '@next/swc-linux-arm64-gnu@14.2.29': optional: true - '@next/swc-linux-arm64-musl@14.2.28': + '@next/swc-linux-arm64-musl@14.2.29': optional: true - '@next/swc-linux-x64-gnu@14.2.28': + '@next/swc-linux-x64-gnu@14.2.29': optional: true - '@next/swc-linux-x64-musl@14.2.28': + '@next/swc-linux-x64-musl@14.2.29': optional: true - '@next/swc-win32-arm64-msvc@14.2.28': + '@next/swc-win32-arm64-msvc@14.2.29': optional: true - '@next/swc-win32-ia32-msvc@14.2.28': + '@next/swc-win32-ia32-msvc@14.2.29': optional: true - '@next/swc-win32-x64-msvc@14.2.28': + '@next/swc-win32-x64-msvc@14.2.29': optional: true '@noble/ciphers@1.2.1': {} + '@noble/ciphers@1.3.0': {} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -10427,6 +10494,14 @@ snapshots: dependencies: '@noble/hashes': 1.7.1 + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -10437,6 +10512,10 @@ snapshots: '@noble/hashes@1.7.1': {} + '@noble/hashes@1.7.2': {} + + '@noble/hashes@1.8.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -10451,137 +10530,131 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nomicfoundation/edr-darwin-arm64@0.8.0': {} + '@noir-lang/acvm_js@1.0.0-beta.3': {} - '@nomicfoundation/edr-darwin-x64@0.8.0': {} + '@noir-lang/noir_js@1.0.0-beta.3': + dependencies: + '@noir-lang/acvm_js': 1.0.0-beta.3 + '@noir-lang/noirc_abi': 1.0.0-beta.3 + '@noir-lang/types': 1.0.0-beta.3 - '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': {} + '@noir-lang/noirc_abi@1.0.0-beta.3': + dependencies: + '@noir-lang/types': 1.0.0-beta.3 - '@nomicfoundation/edr-linux-arm64-musl@0.8.0': {} + '@noir-lang/types@1.0.0-beta.3': {} - '@nomicfoundation/edr-linux-x64-gnu@0.8.0': {} + '@nomicfoundation/edr-darwin-arm64@0.11.0': {} - '@nomicfoundation/edr-linux-x64-musl@0.8.0': {} + '@nomicfoundation/edr-darwin-x64@0.11.0': {} - '@nomicfoundation/edr-win32-x64-msvc@0.8.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} - '@nomicfoundation/edr@0.8.0': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.8.0 - '@nomicfoundation/edr-darwin-x64': 0.8.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.8.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.8.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.8.0 - '@nomicfoundation/edr-linux-x64-musl': 0.8.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.8.0 + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} - '@nomicfoundation/ethereumjs-common@4.0.4': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} - '@nomicfoundation/ethereumjs-tx@5.0.4': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} - '@nomicfoundation/ethereumjs-util@9.0.4': + '@nomicfoundation/edr@0.11.0': dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 + '@nomicfoundation/edr-darwin-arm64': 0.11.0 + '@nomicfoundation/edr-darwin-x64': 0.11.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-x64-musl': 0.11.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@5.5.0) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@5.5.0) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@5.5.0) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(3c85381c0b45919662d061966161e2b7)': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10589,15 +10662,15 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10605,89 +10678,89 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(7a126116ab3a8428fc2292ff3b66a578)': + '@nomicfoundation/hardhat-toolbox@4.0.0(c9628f5d47e1b74ed759ca13ebe35860)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.17.30 + '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 - - '@nomicfoundation/hardhat-toolbox@5.0.0(248454f03b5d7796fe0b22b5b4b634ab)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(3c85381c0b45919662d061966161e2b7) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-toolbox@5.0.0(21ac015ac60478c81ef64632993d75d8)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@nomicfoundation/hardhat-toolbox@5.0.0(a7f0110eca458f09074d1c2612ad945e)': + '@nomicfoundation/hardhat-toolbox@5.0.0(d1703b8c85cc657c19a30d0af9337a0a)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@5.5.0) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10696,13 +10769,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@5.5.0) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10711,13 +10784,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@5.5.0) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10731,8 +10804,8 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.0(supports-color@5.5.0) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 lodash: 4.17.21 @@ -10775,17 +10848,15 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@openzeppelin/contracts-upgradeable@5.2.0(@openzeppelin/contracts@5.2.0)': + '@openzeppelin/contracts-upgradeable@5.3.0(@openzeppelin/contracts@5.3.0)': dependencies: - '@openzeppelin/contracts': 5.2.0 - - '@openzeppelin/contracts@5.2.0': {} + '@openzeppelin/contracts': 5.3.0 '@openzeppelin/contracts@5.3.0': {} '@paulmillr/qr@0.2.1': {} - '@phosphor-icons/react@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@phosphor-icons/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10817,124 +10888,345 @@ snapshots: '@remix-run/router@1.23.0': {} - '@rollup/plugin-inject@5.0.5(rollup@4.40.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - estree-walker: 2.0.2 - magic-string: 0.30.17 - optionalDependencies: - rollup: 4.40.0 - - '@rollup/plugin-virtual@3.0.2(rollup@4.40.0)': - optionalDependencies: - rollup: 4.40.0 - - '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: - '@types/estree': 1.0.7 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.40.0 - - '@rollup/rollup-android-arm-eabi@4.40.0': - optional: true - - '@rollup/rollup-android-arm64@4.40.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.40.0': - optional: true - - '@rollup/rollup-darwin-x64@4.40.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.40.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.40.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.40.0': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.40.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.40.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.40.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.40.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.40.0': - optional: true + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-controllers@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.22.9 - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch - bufferutil + - db0 + - encoding + - ioredis + - react - typescript + - uploadthing - utf-8-validate - zod - '@safe-global/safe-gateway-typescript-sdk@3.22.9': {} - - '@scure/base@1.1.9': {} - - '@scure/base@1.2.4': {} - - '@scure/bip32@1.1.5': + '@reown/appkit-polyfills@1.7.3': dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.9 + buffer: 6.0.3 - '@scure/bip32@1.3.2': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48)': dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.9 - + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + lit: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + lit: 3.1.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.3 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@rolldown/pluginutils@1.0.0-beta.9': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.41.1 + + '@rollup/plugin-virtual@3.0.2(rollup@4.41.1)': + optionalDependencies: + rollup: 4.41.1 + + '@rollup/pluginutils@5.1.4(rollup@4.41.1)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.1 + + '@rollup/rollup-android-arm-eabi@4.41.1': + optional: true + + '@rollup/rollup-android-arm64@4.41.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.1': + optional: true + + '@rollup/rollup-darwin-x64@4.41.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.1': + optional: true + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip32@1.3.2': + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.9 + '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.4.2 @@ -10945,7 +11237,13 @@ snapshots: dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@scure/bip39@1.1.1': dependencies: @@ -10965,50 +11263,58 @@ snapshots: '@scure/bip39@1.5.4': dependencies: '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@scure/base': 1.2.6 - '@semaphore-protocol/contracts@4.9.2': + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@semaphore-protocol/contracts@4.11.1': dependencies: '@zk-kit/lean-imt.sol': 2.0.1 - '@semaphore-protocol/core@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/core@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 - '@semaphore-protocol/proof': 4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/proof': 4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@semaphore-protocol/data@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/data@4.11.1(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: - '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/utils': 1.3.0 axios: 1.6.6 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + viem: 2.23.7(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: - bufferutil - debug + - typescript - utf-8-validate + - zod - '@semaphore-protocol/group@4.9.2': + '@semaphore-protocol/group@4.11.1': dependencies: '@zk-kit/lean-imt': 2.2.3 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/identity@4.9.2': + '@semaphore-protocol/identity@4.11.1': dependencies: '@zk-kit/baby-jubjub': 1.0.3 '@zk-kit/eddsa-poseidon': 1.0.4 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/proof@4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/proof@4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 - '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/artifacts': 1.8.0 '@zk-kit/utils': 1.3.0 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11017,9 +11323,9 @@ snapshots: - bufferutil - utf-8-validate - '@semaphore-protocol/utils@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/utils@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11089,58 +11395,58 @@ snapshots: dependencies: antlr4ts: 0.5.0-alpha.4 - '@solidity-parser/parser@0.19.0': {} + '@solidity-parser/parser@0.20.1': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-preset@8.1.0(@babel/core@7.26.10)': + '@svgr/babel-preset@8.1.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.10) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.4) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.4) - '@svgr/core@8.1.0(typescript@5.8.2)': + '@svgr/core@8.1.0(typescript@5.5.4)': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.8.2) + cosmiconfig: 8.3.6(typescript@5.5.4) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -11148,98 +11454,92 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.4))': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) - '@svgr/core': 8.1.0(typescript@5.8.2) + '@babel/core': 7.27.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) + '@svgr/core': 8.1.0(typescript@5.5.4) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4)': dependencies: - '@svgr/core': 8.1.0(typescript@5.8.2) - cosmiconfig: 8.3.6(typescript@5.8.2) + '@svgr/core': 8.1.0(typescript@5.5.4) + cosmiconfig: 8.3.6(typescript@5.5.4) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/rollup@8.1.0(rollup@4.40.0)(typescript@5.8.2)': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - '@svgr/core': 8.1.0(typescript@5.8.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2) + '@svgr/rollup@8.1.0(rollup@4.41.1)(typescript@5.5.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/preset-react': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + '@svgr/core': 8.1.0(typescript@5.5.4) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4) transitivePeerDependencies: - rollup - supports-color - typescript - '@swc/core-darwin-arm64@1.11.16': + '@swc/core-darwin-arm64@1.11.29': optional: true - '@swc/core-darwin-x64@1.11.16': + '@swc/core-darwin-x64@1.11.29': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.16': + '@swc/core-linux-arm-gnueabihf@1.11.29': optional: true - '@swc/core-linux-arm64-gnu@1.11.16': + '@swc/core-linux-arm64-gnu@1.11.29': optional: true - '@swc/core-linux-arm64-musl@1.11.16': + '@swc/core-linux-arm64-musl@1.11.29': optional: true - '@swc/core-linux-x64-gnu@1.11.16': + '@swc/core-linux-x64-gnu@1.11.29': optional: true - '@swc/core-linux-x64-musl@1.11.16': + '@swc/core-linux-x64-musl@1.11.29': optional: true - '@swc/core-win32-arm64-msvc@1.11.16': + '@swc/core-win32-arm64-msvc@1.11.29': optional: true - '@swc/core-win32-ia32-msvc@1.11.16': + '@swc/core-win32-ia32-msvc@1.11.29': optional: true - '@swc/core-win32-x64-msvc@1.11.16': + '@swc/core-win32-x64-msvc@1.11.29': optional: true - '@swc/core@1.11.16(@swc/helpers@0.5.17)': + '@swc/core@1.11.29': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.16 - '@swc/core-darwin-x64': 1.11.16 - '@swc/core-linux-arm-gnueabihf': 1.11.16 - '@swc/core-linux-arm64-gnu': 1.11.16 - '@swc/core-linux-arm64-musl': 1.11.16 - '@swc/core-linux-x64-gnu': 1.11.16 - '@swc/core-linux-x64-musl': 1.11.16 - '@swc/core-win32-arm64-msvc': 1.11.16 - '@swc/core-win32-ia32-msvc': 1.11.16 - '@swc/core-win32-x64-msvc': 1.11.16 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.11.29 + '@swc/core-darwin-x64': 1.11.29 + '@swc/core-linux-arm-gnueabihf': 1.11.29 + '@swc/core-linux-arm64-gnu': 1.11.29 + '@swc/core-linux-arm64-musl': 1.11.29 + '@swc/core-linux-x64-gnu': 1.11.29 + '@swc/core-linux-x64-musl': 1.11.29 + '@swc/core-win32-arm64-msvc': 1.11.29 + '@swc/core-win32-ia32-msvc': 1.11.29 + '@swc/core-win32-x64-msvc': 1.11.29 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - optional: true - '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -11249,14 +11549,14 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.9.9(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11266,7 +11566,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)': + '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -11277,7 +11577,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + tsup: 8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -11294,10 +11594,10 @@ snapshots: dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11314,10 +11614,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11334,14 +11634,14 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11362,28 +11662,28 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) - '@tanstack/query-core@5.74.3': {} + '@tanstack/query-core@5.79.2': {} - '@tanstack/react-query@5.74.3(react@18.3.1)': + '@tanstack/react-query@5.79.2(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.74.3 + '@tanstack/query-core': 5.79.2 react: 18.3.1 - '@tanstack/react-virtual@3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.13.8 + '@tanstack/virtual-core': 3.13.9 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.13.8': {} + '@tanstack/virtual-core@3.13.9': {} '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: @@ -11401,7 +11701,7 @@ snapshots: '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.4 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -11420,44 +11720,44 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': + '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': + '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.5.4) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.8.2) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.8.2) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.5.4) '@types/acorn@4.0.6': dependencies: @@ -11465,28 +11765,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.0 - - '@types/bn.js@4.11.6': - dependencies: - '@types/node': 20.10.4 + '@babel/types': 7.27.3 '@types/bn.js@5.1.6': dependencies: @@ -11580,10 +11876,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.17.30': - dependencies: - undici-types: 6.19.8 - '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -11600,17 +11892,17 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} - '@types/react-dom@18.3.6(@types/react@18.3.20)': + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 - '@types/react@18.3.20': + '@types/react@18.3.23': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -11631,34 +11923,65 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.8.2) + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1(supports-color@5.5.0) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -11667,41 +11990,79 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + debug: 4.4.1(supports-color@5.5.0) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - debug: 4.4.0(supports-color@5.5.0) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.2) + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.8.2) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -11719,35 +12080,36 @@ snapshots: execa: 7.2.0 get-port: 6.1.2 http-proxy: 1.18.1 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug - utf-8-validate - '@vitejs/plugin-react@4.3.4(vite@5.4.18(@types/node@22.7.5))': + '@vitejs/plugin-react@4.5.0(vite@5.4.19(@types/node@22.7.5))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.9 '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.4.18(@types/node@22.7.5) + react-refresh: 0.17.0 + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.7.12(@types/react@18.3.20)(@wagmi/core@2.16.7(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': + '@wagmi/connectors@5.8.3(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@wagmi/core': 2.16.7(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) - '@walletconnect/ethereum-provider': 2.19.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)) + '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11775,22 +12137,22 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.16.7(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))': + '@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.8.2) - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - zustand: 5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + mipd: 0.0.7(typescript@5.5.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.74.3 - typescript: 5.8.2 + '@tanstack/query-core': 5.79.2 + typescript: 5.5.4 transitivePeerDependencies: - '@types/react' - immer - react - use-sync-external-store - '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -11804,7 +12166,50 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -11837,18 +12242,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.19.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: + '@reown/appkit': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/modal': 2.7.0(@types/react@18.3.20)(react@18.3.1) - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.19.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/types': 2.20.2 + '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -11914,21 +12319,143 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.16.0(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.19.2': dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@walletconnect/keyvaluestorage@1.1.1': - dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.15.0(idb-keyval@6.2.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11940,6 +12467,7 @@ snapshots: - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -11948,62 +12476,13 @@ snapshots: - ioredis - uploadthing - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/modal-core@2.7.0(@types/react@18.3.20)(react@18.3.1)': - dependencies: - valtio: 1.11.2(@types/react@18.3.20)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal-ui@2.7.0(@types/react@18.3.20)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.20)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal@2.7.0(@types/react@18.3.20)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.20)(react@18.3.1) - '@walletconnect/modal-ui': 2.7.0(@types/react@18.3.20)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/relay-api@1.0.11': - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.1.0': - dependencies: - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - uint8arrays: 3.1.0 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/types@2.20.2': dependencies: - '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12021,25 +12500,23 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - ioredis - - typescript - uploadthing - - utf-8-validate - - zod - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.19.2': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12057,11 +12534,16 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -12070,9 +12552,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -12100,7 +12582,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -12118,7 +12600,50 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12187,15 +12712,24 @@ snapshots: abbrev@1.0.9: {} - abitype@1.0.0(typescript@5.8.2)(zod@3.24.4): + abitype@1.0.0(typescript@5.5.4)(zod@3.25.48): + optionalDependencies: + typescript: 5.5.4 + zod: 3.25.48 + + abitype@1.0.8(typescript@5.5.4)(zod@3.22.4): + optionalDependencies: + typescript: 5.5.4 + zod: 3.22.4 + + abitype@1.0.8(typescript@5.5.4)(zod@3.25.48): optionalDependencies: - typescript: 5.8.2 - zod: 3.24.4 + typescript: 5.5.4 + zod: 3.25.48 - abitype@1.0.8(typescript@5.8.2)(zod@3.24.4): + abitype@1.0.8(typescript@5.8.3): optionalDependencies: - typescript: 5.8.2 - zod: 3.24.4 + typescript: 5.8.3 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -12217,7 +12751,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12308,7 +12842,7 @@ snapshots: asn1.js@4.10.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 @@ -12342,29 +12876,29 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.3): + autoprefixer@10.4.21(postcss@8.5.4): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001713 + browserslist: 4.25.0 + caniuse-lite: 1.0.30001720 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.4 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@0.21.4(debug@4.4.0): + axios@0.21.4(debug@4.4.1): dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) transitivePeerDependencies: - debug axios@1.6.6: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12372,15 +12906,15 @@ snapshots: axios@1.6.7: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.8.4: + axios@1.9.0: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12390,42 +12924,42 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/compat-data': 7.27.3 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): dependencies: - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -12456,6 +12990,8 @@ snapshots: big-integer@1.6.52: {} + big.js@6.2.2: {} + binary-extensions@2.3.0: {} binary@0.3.0: @@ -12476,9 +13012,9 @@ snapshots: bn.js@4.11.6: {} - bn.js@4.12.1: {} + bn.js@4.12.2: {} - bn.js@5.2.1: {} + bn.js@5.2.2: {} boolbase@1.0.0: {} @@ -12542,13 +13078,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -12563,12 +13099,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.4: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001713 - electron-to-chromium: 1.5.137 + caniuse-lite: 1.0.30001720 + electron-to-chromium: 1.5.162 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs58@4.0.1: dependencies: @@ -12631,7 +13167,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.1 @@ -12664,7 +13200,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001713: {} + caniuse-lite@1.0.30001720: {} caseless@0.12.0: {} @@ -12839,6 +13375,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comlink@4.4.2: {} + comma-separated-tokens@1.0.8: {} comma-separated-tokens@2.0.3: {} @@ -12863,6 +13401,8 @@ snapshots: commander@12.0.0: {} + commander@12.1.0: {} + commander@13.1.0: {} commander@4.1.1: {} @@ -12889,7 +13429,7 @@ snapshots: chalk: 4.1.2 lodash: 4.17.21 rxjs: 7.8.2 - shell-quote: 1.8.2 + shell-quote: 1.8.3 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -12899,12 +13439,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.79.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) + '@tanstack/react-query': 5.79.2(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -12912,9 +13452,9 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + wagmi: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) transitivePeerDependencies: - '@babel/core' - react-is @@ -12931,9 +13471,9 @@ snapshots: cookie@0.4.2: {} - core-js-compat@3.41.0: + core-js-compat@3.42.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 core-util-is@1.0.3: {} @@ -12949,20 +13489,29 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.8.2): + cosmiconfig@8.3.6(typescript@5.5.4): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.5.4 + + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 crc-32@1.2.2: {} create-ecdh@4.0.4: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 elliptic: 6.6.1 create-hash@1.2.0: @@ -13012,7 +13561,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.4: + crossws@0.3.5: dependencies: uncrypto: 0.1.3 @@ -13250,7 +13799,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 dayjs@1.11.13: {} @@ -13260,13 +13809,13 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0(supports-color@5.5.0): + debug@4.4.1(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.4.0(supports-color@8.1.1): + debug@4.4.1(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -13322,6 +13871,10 @@ snapshots: dequal@2.0.3: {} + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)): + dependencies: + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + des.js@1.1.0: dependencies: inherits: 2.0.4 @@ -13345,7 +13898,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -13392,7 +13945,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - dotenv@16.4.7: {} + dotenv@16.5.0: {} dunder-proto@1.0.1: dependencies: @@ -13413,24 +13966,24 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.14: + eciesjs@0.4.15: dependencies: - '@ecies/ciphers': 0.2.3(@noble/ciphers@1.2.1) - '@noble/ciphers': 1.2.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 ejs@3.1.10: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.137: {} + electron-to-chromium@1.5.162: {} elkjs@0.9.3: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -13582,6 +14135,15 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + escodegen@1.8.1: dependencies: esprima: 2.7.3 @@ -13599,7 +14161,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.19(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -13612,7 +14174,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -13623,7 +14185,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -13675,6 +14237,8 @@ snapshots: estraverse@1.9.3: {} + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: @@ -13727,7 +14291,7 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.8.4 + axios: 1.9.0 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -13763,7 +14327,7 @@ snapshots: ethereum-bloom-filters@1.2.0: dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 ethereum-cryptography@0.1.3: dependencies: @@ -13797,25 +14361,10 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - ethereumjs-abi@0.6.8: - dependencies: - bn.js: 4.12.1 - ethereumjs-util: 6.2.1 - - ethereumjs-util@6.2.1: - dependencies: - '@types/bn.js': 4.11.6 - bn.js: 4.12.1 - create-hash: 1.2.0 - elliptic: 6.6.1 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.6 - bn.js: 5.2.1 + bn.js: 5.2.2 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -13869,7 +14418,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -13887,11 +14436,6 @@ snapshots: bn.js: 4.11.6 number-to-bn: 1.7.0 - ethjs-util@0.1.6: - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - eventemitter2@6.4.9: {} eventemitter3@4.0.7: {} @@ -13950,12 +14494,12 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + wagmi: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) fast-deep-equal@3.1.3: {} @@ -13989,7 +14533,7 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -13999,6 +14543,8 @@ snapshots: wasmcurves: 0.2.2 web-worker: 1.2.0 + fflate@0.8.2: {} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -14061,9 +14607,9 @@ snapshots: focus-visible@5.2.1: {} - follow-redirects@1.15.9(debug@4.4.0): + follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -14106,13 +14652,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) style-value-types: 5.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 framesync@6.0.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 fs-extra@10.1.0: dependencies: @@ -14359,10 +14905,10 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - h3@1.15.1: + h3@1.15.3: dependencies: cookie-es: 1.2.2 - crossws: 0.3.4 + crossws: 0.3.5 defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 @@ -14393,11 +14939,11 @@ snapshots: '@ethersproject/solidity': 5.8.0 '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 - '@types/qs': 6.9.18 - axios: 0.21.4(debug@4.4.0) + '@types/qs': 6.14.0 + axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -14411,11 +14957,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14423,11 +14969,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14435,24 +14981,24 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 '@ethersproject/units': 5.8.0 - '@solidity-parser/parser': 0.19.0 - axios: 1.8.4 + '@solidity-parser/parser': 0.20.1 + axios: 1.9.0 brotli-wasm: 2.0.1 chalk: 4.1.2 cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.4.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.7.14(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -14460,14 +15006,11 @@ snapshots: - utf-8-validate - zod - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: + '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -14478,11 +15021,10 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -14491,6 +15033,7 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 + micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -14498,31 +15041,27 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) + solc: 0.8.26(debug@4.4.1) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - bufferutil - - c-kzg - supports-color - utf-8-validate - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10): + hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: + '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -14533,11 +15072,10 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -14546,6 +15084,7 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 + micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -14553,31 +15092,27 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) + solc: 0.8.26(debug@4.4.1) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2) - typescript: 5.8.2 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - - c-kzg - supports-color - utf-8-validate - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10): + hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: + '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -14588,11 +15123,10 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -14601,6 +15135,7 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 + micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -14608,20 +15143,19 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) + solc: 0.8.26(debug@4.4.1) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typescript: 5.8.2 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - - c-kzg - supports-color - utf-8-validate @@ -14697,7 +15231,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.0.0 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -14760,7 +15294,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.16 unist-util-position: 5.0.0 @@ -14804,7 +15338,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 he@1.2.0: {} @@ -14840,7 +15374,7 @@ snapshots: http-response-object: 3.0.2 parse-cache-control: 1.0.1 - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.0: dependencies: @@ -14853,7 +15387,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -14872,7 +15406,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14890,7 +15424,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb-keyval@6.2.1: {} + idb-keyval@6.2.2: {} ieee754@1.2.1: {} @@ -15060,9 +15594,9 @@ snapshots: dependencies: ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) jackspeak@2.3.6: dependencies: @@ -15216,21 +15750,21 @@ snapshots: listenercount@1.0.1: {} - lit-element@3.3.3: + lit-element@4.2.0: dependencies: '@lit-labs/ssr-dom-shim': 1.3.0 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 + '@lit/reactive-element': 2.1.0 + lit-html: 3.3.0 - lit-html@2.8.0: + lit-html@3.3.0: dependencies: '@types/trusted-types': 2.0.7 - lit@2.8.0: + lit@3.1.0: dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 + '@lit/reactive-element': 2.1.0 + lit-element: 4.2.0 + lit-html: 3.3.0 load-tsconfig@0.2.5: {} @@ -15331,7 +15865,7 @@ snapshots: match-sorter@6.3.4: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 remove-accents: 0.5.0 math-intrinsics@1.1.0: {} @@ -15617,15 +16151,25 @@ snapshots: lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.2.0 + stylis: 4.3.6 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.2.0 + web-worker: 1.5.0 transitivePeerDependencies: - supports-color + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + micro-ftch@0.3.1: {} + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.1.0 @@ -15992,7 +16536,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -16014,7 +16558,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16040,7 +16584,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 mime-db@1.52.0: {} @@ -16077,9 +16621,9 @@ snapshots: minipass@7.1.2: {} - mipd@0.0.7(typescript@5.8.2): + mipd@0.0.7(typescript@5.5.4): optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 mkdirp@0.5.6: dependencies: @@ -16096,7 +16640,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -16114,15 +16658,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - motion@10.16.2: - dependencies: - '@motionone/animation': 10.18.0 - '@motionone/dom': 10.18.0 - '@motionone/svelte': 10.16.4 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - '@motionone/vue': 10.16.4 - mri@1.2.0: {} ms@2.1.3: {} @@ -16168,45 +16703,45 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-seo@6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.28 + '@next/env': 14.2.29 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001713 + caniuse-lite: 1.0.30001720 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.28 - '@next/swc-darwin-x64': 14.2.28 - '@next/swc-linux-arm64-gnu': 14.2.28 - '@next/swc-linux-arm64-musl': 14.2.28 - '@next/swc-linux-x64-gnu': 14.2.28 - '@next/swc-linux-x64-musl': 14.2.28 - '@next/swc-win32-arm64-msvc': 14.2.28 - '@next/swc-win32-ia32-msvc': 14.2.28 - '@next/swc-win32-x64-msvc': 14.2.28 + '@next/swc-darwin-arm64': 14.2.29 + '@next/swc-darwin-x64': 14.2.29 + '@next/swc-linux-arm64-gnu': 14.2.29 + '@next/swc-linux-arm64-musl': 14.2.29 + '@next/swc-linux-x64-gnu': 14.2.29 + '@next/swc-linux-x64-musl': 14.2.29 + '@next/swc-win32-arm64-msvc': 14.2.29 + '@next/swc-win32-ia32-msvc': 14.2.29 + '@next/swc-win32-x64-msvc': 14.2.29 '@playwright/test': 1.52.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -16217,16 +16752,16 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 - zod: 3.24.4 + zod: 3.25.48 - nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 @@ -16240,7 +16775,7 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.22 lodash.get: 4.4.2 - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 @@ -16256,7 +16791,7 @@ snapshots: title: 3.5.3 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 - zod: 3.24.4 + zod: 3.25.48 transitivePeerDependencies: - supports-color @@ -16426,31 +16961,62 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.6.7(typescript@5.8.2)(zod@3.24.4): + ox@0.6.7(typescript@5.5.4)(zod@3.25.48): dependencies: - '@adraffy/ens-normalize': 1.10.1 + '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - zod - ox@0.6.9(typescript@5.8.2)(zod@3.24.4): + ox@0.7.1(typescript@5.5.4)(zod@3.22.4): dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.5.4)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - zod + + ox@0.7.1(typescript@5.5.4)(zod@3.25.48): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - zod + + ox@0.7.1(typescript@5.8.3): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - zod @@ -16487,10 +17053,12 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.1 + semver: 7.7.2 pako@1.0.11: {} + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -16527,7 +17095,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -16647,7 +17215,7 @@ snapshots: framesync: 6.0.1 hey-listen: 1.0.8 style-value-types: 5.0.0 - tslib: 2.7.0 + tslib: 2.8.1 poseidon-lite@0.3.0: {} @@ -16655,29 +17223,29 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.4): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 + postcss: 8.5.4 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): + postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)): dependencies: lilconfig: 3.1.3 - yaml: 2.7.1 + yaml: 2.8.0 optionalDependencies: - postcss: 8.5.3 - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + postcss: 8.5.4 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -16698,13 +17266,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.8: {} prelude-ls@1.1.2: {} @@ -16714,11 +17282,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.4.2(prettier@3.5.3): + prettier-plugin-solidity@1.4.3(prettier@3.5.3): dependencies: - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 prettier: 3.5.3 - semver: 7.7.1 + semver: 7.7.2 prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3): dependencies: @@ -16757,13 +17325,13 @@ snapshots: property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} proto-list@1.2.4: {} protocols@2.0.2: {} - proxy-compare@2.5.1: {} + proxy-compare@2.6.0: {} proxy-from-env@1.1.0: {} @@ -16771,7 +17339,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 @@ -16859,11 +17427,11 @@ snapshots: react-is@16.13.1: {} - react-markdown@9.1.0(@types/react@18.3.20)(react@18.3.1): + react-markdown@9.1.0(@types/react@18.3.23)(react@18.3.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 18.3.20 + '@types/react': 18.3.23 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -16877,23 +17445,23 @@ snapshots: transitivePeerDependencies: - supports-color - react-refresh@0.14.2: {} + react-refresh@0.17.0: {} - react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.0(react@18.3.1) + react-router: 6.30.1(react@18.3.1) - react-router@6.30.0(react@18.3.1): + react-router@6.30.1(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -16968,12 +17536,6 @@ snapshots: regenerate@1.4.2: {} - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.0 - regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -17149,34 +17711,34 @@ snapshots: rlp@2.2.7: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 robust-predicates@3.0.2: {} - rollup@4.40.0: + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.41.1 + '@rollup/rollup-android-arm64': 4.41.1 + '@rollup/rollup-darwin-arm64': 4.41.1 + '@rollup/rollup-darwin-x64': 4.41.1 + '@rollup/rollup-freebsd-arm64': 4.41.1 + '@rollup/rollup-freebsd-x64': 4.41.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 + '@rollup/rollup-linux-arm-musleabihf': 4.41.1 + '@rollup/rollup-linux-arm64-gnu': 4.41.1 + '@rollup/rollup-linux-arm64-musl': 4.41.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-musl': 4.41.1 + '@rollup/rollup-linux-s390x-gnu': 4.41.1 + '@rollup/rollup-linux-x64-gnu': 4.41.1 + '@rollup/rollup-linux-x64-musl': 4.41.1 + '@rollup/rollup-win32-arm64-msvc': 4.41.1 + '@rollup/rollup-win32-ia32-msvc': 4.41.1 + '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -17249,7 +17811,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} serialize-javascript@6.0.2: dependencies: @@ -17282,14 +17844,14 @@ snapshots: shallowequal@1.1.0: {} - sharp@0.34.1: + sharp@0.34.2: dependencies: color: 4.2.3 detect-libc: 2.0.4 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.1 - '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 '@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0 @@ -17299,15 +17861,16 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.1 - '@img/sharp-linux-arm64': 0.34.1 - '@img/sharp-linux-s390x': 0.34.1 - '@img/sharp-linux-x64': 0.34.1 - '@img/sharp-linuxmusl-arm64': 0.34.1 - '@img/sharp-linuxmusl-x64': 0.34.1 - '@img/sharp-wasm32': 0.34.1 - '@img/sharp-win32-ia32': 0.34.1 - '@img/sharp-win32-x64': 0.34.1 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 shebang-command@1.2.0: dependencies: @@ -17321,7 +17884,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} + shell-quote@1.8.3: {} shelljs@0.8.5: dependencies: @@ -17385,7 +17948,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 snarkjs@0.7.4: dependencies: @@ -17418,15 +17981,15 @@ snapshots: transitivePeerDependencies: - supports-color - solady@0.1.13: {} + solady@0.1.19: {} solady@0.1.4: {} - solc@0.8.26(debug@4.4.0): + solc@0.8.26(debug@4.4.1): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -17434,22 +17997,22 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3): dependencies: '@prettier/sync': 0.3.0(prettier@3.5.3) prettier: 3.5.3 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.2(prettier@3.5.3) + prettier-plugin-solidity: 1.4.3(prettier@3.5.3) - solhint@5.0.5(typescript@5.8.2): + solhint@5.1.0(typescript@5.8.3): dependencies: - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 ajv: 6.12.6 antlr4: 4.13.2 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.8.2) + cosmiconfig: 8.3.6(typescript@5.8.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 @@ -17457,7 +18020,7 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.7.1 + semver: 7.7.2 strip-ansi: 6.0.1 table: 6.9.0 text-table: 0.2.0 @@ -17466,10 +18029,10 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -17477,7 +18040,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -17485,14 +18048,14 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.1 + semver: 7.7.2 shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -17500,7 +18063,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -17508,14 +18071,14 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.1 + semver: 7.7.2 shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -17523,7 +18086,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -17531,7 +18094,7 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.1 + semver: 7.7.2 shelljs: 0.8.5 web3-utils: 1.10.4 @@ -17585,7 +18148,7 @@ snapshots: static-eval@2.0.2: dependencies: - escodegen: 1.8.1 + escodegen: 1.14.3 statuses@2.0.1: {} @@ -17686,16 +18249,16 @@ snapshots: style-value-types@5.0.0: dependencies: hey-listen: 1.0.8 - tslib: 2.7.0 + tslib: 2.8.1 - styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -17713,6 +18276,8 @@ snapshots: stylis@4.2.0: {} + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -17784,7 +18349,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -17800,11 +18365,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.4 + postcss-import: 15.1.0(postcss@8.5.4) + postcss-js: 4.0.1(postcss@8.5.4) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.5.4) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -17818,7 +18383,7 @@ snapshots: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 '@types/node': 8.10.66 - '@types/qs': 6.9.18 + '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.3 @@ -17849,9 +18414,9 @@ snapshots: tinycolor2@1.6.0: {} - tinyglobby@0.2.12: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 tinygradient@1.1.5: @@ -17900,9 +18465,13 @@ snapshots: tryer@1.0.1: {} - ts-api-utils@1.4.3(typescript@5.8.2): + ts-api-utils@1.4.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-command-line-args@2.5.1: dependencies: @@ -17919,9 +18488,9 @@ snapshots: dependencies: typescript: 5.5.4 - ts-essentials@7.0.3(typescript@5.8.2): + ts-essentials@7.0.3(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-generator@0.1.1: dependencies: @@ -17937,7 +18506,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -17955,29 +18524,29 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) + '@swc/core': 1.11.29 - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.2): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.30 + '@types/node': 20.10.4 acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.2 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) + '@swc/core': 1.11.29 - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -17991,15 +18560,15 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.2 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) + '@swc/core': 1.11.29 - tsconfck@3.1.5(typescript@5.8.2): + tsconfck@3.1.6(typescript@5.5.4): optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 tslib@1.14.1: {} @@ -18009,36 +18578,32 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2): + tsup@8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4): dependencies: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) resolve-from: 5.0.0 - rollup: 4.40.0 + rollup: 4.41.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - postcss: 8.5.3 - typescript: 5.8.2 + '@swc/core': 1.11.29 + postcss: 8.5.4 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - ts-node tty-browserify@0.0.1: {} - tweetnacl-util@0.15.1: {} - - tweetnacl@1.0.3: {} - type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -18060,7 +18625,7 @@ snapshots: typechain@8.3.2(typescript@5.5.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18073,10 +18638,10 @@ snapshots: transitivePeerDependencies: - supports-color - typechain@8.3.2(typescript@5.8.2): + typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18084,8 +18649,8 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.8.2) - typescript: 5.8.2 + ts-essentials: 7.0.3(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -18093,7 +18658,7 @@ snapshots: typescript@5.5.4: {} - typescript@5.8.2: {} + typescript@5.8.3: {} typical@4.0.0: {} @@ -18241,18 +18806,18 @@ snapshots: unpipe@1.0.0: {} - unstorage@1.15.0(idb-keyval@6.2.1): + unstorage@1.16.0(idb-keyval@6.2.2): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 destr: 2.0.5 - h3: 1.15.1 + h3: 1.15.3 lru-cache: 10.4.3 node-fetch-native: 1.6.6 ofetch: 1.4.1 ufo: 1.6.1 optionalDependencies: - idb-keyval: 6.2.1 + idb-keyval: 6.2.2 unzip-crx-3@0.2.0: dependencies: @@ -18273,9 +18838,9 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -18327,12 +18892,13 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valtio@1.11.2(@types/react@18.3.20)(react@18.3.1): + valtio@1.13.2(@types/react@18.3.23)(react@18.3.1): dependencies: - proxy-compare: 2.5.1 + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)) + proxy-compare: 2.6.0 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 react: 18.3.1 vfile-location@5.0.3: @@ -18368,112 +18934,146 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.2)(zod@3.24.4) + ox: 0.6.7(typescript@5.5.4)(zod@3.25.48) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.23.7(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) - isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.9(typescript@5.8.2)(zod@3.24.4) - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.5.4)(zod@3.25.48) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.7.14(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.2)(zod@3.24.4) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.5.4)(zod@3.22.4) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.7.1(typescript@5.5.4)(zod@3.22.4) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.7.1(typescript@5.5.4)(zod@3.25.48) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.7.1(typescript@5.8.3) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.9.9(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.0(typescript@5.5.4)(zod@3.25.48) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-node-polyfills@0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.40.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.41.1) node-stdlib-browser: 1.3.1 - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - rollup - vite-plugin-top-level-await@1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-top-level-await@1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.40.0) - '@swc/core': 1.11.16(@swc/helpers@0.5.17) + '@rollup/plugin-virtual': 3.0.2(rollup@4.41.1) + '@swc/core': 1.11.29 uuid: 10.0.0 - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.4.1(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.7.5)): dependencies: - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) - vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.0(supports-color@5.5.0) + debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.8.2) + tsconfck: 3.1.6(typescript@5.5.4) optionalDependencies: - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color - typescript - vite@5.4.18(@types/node@22.7.5): + vite@5.4.19(@types/node@22.7.5): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.0 + postcss: 8.5.4 + rollup: 4.41.1 optionalDependencies: '@types/node': 22.7.5 fsevents: 2.3.3 @@ -18484,16 +19084,16 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.14.16(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4): + wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) - '@wagmi/connectors': 5.7.12(@types/react@18.3.20)(@wagmi/core@2.16.7(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) - '@wagmi/core': 2.16.7(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) + '@tanstack/react-query': 5.79.2(react@18.3.1) + '@wagmi/connectors': 5.8.3(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.27.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) optionalDependencies: - typescript: 5.8.2 + typescript: 5.5.4 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -18524,7 +19124,7 @@ snapshots: wait-on@8.0.3: dependencies: - axios: 1.8.4 + axios: 1.9.0 joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -18542,10 +19142,12 @@ snapshots: web-worker@1.2.0: {} + web-worker@1.5.0: {} + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 + bn.js: 5.2.2 ethereum-bloom-filters: 1.2.0 ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 @@ -18645,7 +19247,7 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 @@ -18666,7 +19268,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.7.1: {} + yaml@2.8.0: {} yargs-parser@18.1.3: dependencies: @@ -18728,11 +19330,11 @@ snapshots: zod@3.22.4: {} - zod@3.24.4: {} + zod@3.25.48: {} - zustand@5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): + zustand@5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 immer: 10.0.2 react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) From 48f86387fff094e780834ceb74d8b5ec9805a62e Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 3 Jun 2025 19:05:04 +0500 Subject: [PATCH 038/106] Switch BFV helpers Encoding to use Alloy (#469) * Switch BFV Encoding to use Alloy * Fix tests --- crates/bfv-helpers/src/lib.rs | 127 +++++++++++++----- .../apps/client/libs/wasm/pkg/crisp_worker.js | 2 +- 2 files changed, 97 insertions(+), 32 deletions(-) diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index 9372a948a2..d55b2f7c48 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -1,8 +1,7 @@ use alloy::dyn_abi::{DynSolType, DynSolValue}; +use alloy::primitives::U256; use fhe_rs::bfv::{BfvParameters, BfvParametersBuilder}; -use fhe_traits::{Deserialize, Serialize}; use std::sync::Arc; - /// Predefined BFV parameters for common use cases pub mod params { /// Standard BFV parameters sets @@ -80,10 +79,11 @@ pub fn build_bfv_params_arc( } } -/// Serializes BFV parameters into raw bytes. +/// Serializes BFV parameters into ABI-encoded bytes. /// -/// This function converts BFV parameters into a raw byte representation -/// without any specific encoding format. +/// This function converts BFV parameters into a tuple structure of (degree, plaintext_modulus, moduli[]) +/// and then ABI-encodes the tuple using Solidity ABI format. The resulting bytes can be used +/// in smart contracts or for cross-platform serialization. /// /// # Arguments /// @@ -91,19 +91,31 @@ pub fn build_bfv_params_arc( /// /// # Returns /// -/// Returns a `Vec` containing the raw serialized parameters. +/// Returns a `Vec` containing the ABI-encoded parameters as a tuple (uint256, uint256, uint256[]). pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { - params.to_bytes() + let value = DynSolValue::Tuple(vec![ + DynSolValue::Uint(U256::from(params.degree()), 256), + DynSolValue::Uint(U256::from(params.plaintext()), 256), + DynSolValue::Array( + params + .moduli() + .iter() + .map(|val| DynSolValue::Uint(U256::from(*val), 256)) + .collect(), + ), + ]); + value.abi_encode() } -/// Deserializes BFV parameters from raw bytes. +/// Deserializes BFV parameters from ABI-encoded bytes. /// -/// This function converts raw bytes back into BFV parameters. -/// The bytes should be in the raw format produced by `serialize_bfv_params`. +/// This function converts ABI-encoded bytes back into BFV parameters. +/// The bytes should represent a tuple (uint256, uint256, uint256[]) containing +/// (degree, plaintext_modulus, moduli[]) as produced by `serialize_bfv_params`. /// /// # Arguments /// -/// * `bytes` - The raw bytes containing the serialized parameters +/// * `bytes` - The ABI-encoded bytes containing the serialized parameters /// /// # Returns /// @@ -111,22 +123,74 @@ pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { /// /// # Panics /// -/// Panics if the deserialization fails. +/// Panics if the deserialization fails due to invalid format or parameter values. pub fn deserialize_bfv_params(bytes: &[u8]) -> BfvParameters { - match BfvParameters::try_deserialize(bytes) { - Ok(params) => params, - Err(e) => panic!("Failed to deserialize BFV Parameters: {}", e), + // Define the expected tuple type: (uint256, uint256, uint256[]) + let tuple_type = DynSolType::Tuple(vec![ + DynSolType::Uint(256), // degree + DynSolType::Uint(256), // plaintext_modulus + DynSolType::Array(Box::new(DynSolType::Uint(256))), // moduli array + ]); + + let decoded = tuple_type + .abi_decode(bytes) + .expect("Failed to ABI decode bytes"); + + match decoded { + DynSolValue::Tuple(inner_values) => { + // Extract degree (first element) + let degree: u64 = match &inner_values[0] { + DynSolValue::Uint(val, _) => { + (*val).try_into().expect("Failed to convert degree to u64") + } + _ => panic!("Expected uint256 for degree"), + }; + + // Extract plaintext modulus (second element) + let plaintext: u64 = match &inner_values[1] { + DynSolValue::Uint(val, _) => (*val) + .try_into() + .expect("Failed to convert plaintext to u64"), + _ => panic!("Expected uint256 for plaintext modulus"), + }; + + // Extract moduli array (third element) + let moduli: Vec = match &inner_values[2] { + DynSolValue::Array(moduli_array) => moduli_array + .iter() + .map(|val| match val { + DynSolValue::Uint(modulus, _) => (*modulus) + .try_into() + .expect("Failed to convert modulus to u64"), + _ => panic!("Expected uint256 for modulus value"), + }) + .collect::>(), + _ => panic!("Expected array for moduli"), + }; + + let params = BfvParametersBuilder::new() + .set_degree(degree as usize) + .set_plaintext_modulus(plaintext) + .set_moduli(&moduli) + .build() + .expect("Failed to build BFV Parameters"); + + params + } + _ => panic!("Expected tuple value in ABI encoding"), } } -/// Deserializes BFV parameters from raw bytes and wraps them in an `Arc`. +/// Deserializes BFV parameters from ABI-encoded bytes and wraps them in an `Arc`. /// /// This is a convenience function that combines `deserialize_bfv_params` with `Arc::new` /// to provide thread-safe shared ownership of the deserialized parameters. +/// The input bytes should represent a tuple (uint256, uint256, uint256[]) containing +/// (degree, plaintext_modulus, moduli[]) in ABI-encoded format. /// /// # Arguments /// -/// * `bytes` - The raw bytes containing the serialized parameters +/// * `bytes` - The ABI-encoded bytes containing the serialized parameters /// /// # Returns /// @@ -139,10 +203,12 @@ pub fn deserialize_bfv_params_arc(bytes: &[u8]) -> Arc { Arc::new(deserialize_bfv_params(bytes)) } -/// ABI-encodes BFV parameters using the Solidity ABI format. +/// ABI-encodes BFV parameters as bytes using the Solidity ABI format. /// -/// This function takes BFV parameters, serializes them to raw bytes, -/// and then ABI-encodes those bytes using the Solidity ABI format. +/// This function takes BFV parameters, converts them to a tuple structure, +/// and then wraps the result in a DynSolValue::Bytes before ABI-encoding. +/// This creates a double-encoded structure: the outer layer is bytes, +/// and the inner layer is the tuple (uint256, uint256, uint256[]). /// /// # Arguments /// @@ -150,19 +216,20 @@ pub fn deserialize_bfv_params_arc(bytes: &[u8]) -> Arc { /// /// # Returns /// -/// Returns a `Vec` containing the ABI-encoded parameters. +/// Returns a `Vec` containing the ABI-encoded parameters wrapped as bytes. pub fn encode_bfv_params(params: &BfvParameters) -> Vec { - DynSolValue::Bytes(serialize_bfv_params(params)).abi_encode_params() + DynSolValue::Bytes(serialize_bfv_params(params)).abi_encode() } -/// ABI-decodes BFV parameters from Solidity ABI format. +/// ABI-decodes BFV parameters from double-encoded Solidity ABI format. /// -/// This function takes ABI-encoded bytes, decodes them using the Solidity ABI format, -/// and then deserializes the resulting bytes into BFV parameters. +/// This function takes ABI-encoded bytes where the outer layer is bytes type, +/// and the inner layer contains the serialized BFV parameters. It first decodes +/// the outer bytes layer, then uses the native BFV deserialization on the inner bytes. /// /// # Arguments /// -/// * `bytes` - The ABI-encoded bytes containing the parameters +/// * `bytes` - The double ABI-encoded bytes containing the parameters /// /// # Returns /// @@ -178,21 +245,19 @@ pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { .expect("Failed to ABI decode bytes"); match decoded { - DynSolValue::Bytes(inner_bytes) => { - BfvParameters::try_deserialize(&inner_bytes).expect("Could not decode Bfv Params") - } + DynSolValue::Bytes(inner_bytes) => deserialize_bfv_params(&inner_bytes), _ => panic!("Expected bytes value in ABI encoding"), } } -/// ABI-decodes BFV parameters from Solidity ABI format and wraps them in an `Arc`. +/// ABI-decodes BFV parameters from double-encoded Solidity ABI format and wraps them in an `Arc`. /// /// This function is similar to `decode_bfv_params` but returns the parameters /// wrapped in an `Arc` for thread-safe shared ownership. /// /// # Arguments /// -/// * `bytes` - The ABI-encoded bytes containing the parameters +/// * `bytes` - The double ABI-encoded bytes containing the parameters /// /// # Returns /// diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js index 7dadde0896..67a7c88ee5 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_worker.js @@ -22,7 +22,7 @@ self.onmessage = async function (event) { } const result = encryptInstance.encrypt_vote(voteId, publicKey); const circuitInputs = JSON.parse(result.circuit_inputs); - console.log('vote generated', circuitInputs); + self.postMessage({ type: 'encrypt_vote', success: true, From 1c9505487d597c7154273731dafce530663f9f6b Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 3 Jun 2025 20:19:29 +0500 Subject: [PATCH 039/106] Switch BFV Encoding to use Alloy (#470) --- crates/bfv-helpers/src/lib.rs | 167 ++++++++-------------------------- 1 file changed, 40 insertions(+), 127 deletions(-) diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index d55b2f7c48..5228f6351b 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -79,7 +79,7 @@ pub fn build_bfv_params_arc( } } -/// Serializes BFV parameters into ABI-encoded bytes. +/// Encodes BFV parameters into ABI-encoded bytes. /// /// This function converts BFV parameters into a tuple structure of (degree, plaintext_modulus, moduli[]) /// and then ABI-encodes the tuple using Solidity ABI format. The resulting bytes can be used @@ -87,12 +87,12 @@ pub fn build_bfv_params_arc( /// /// # Arguments /// -/// * `params` - The BFV parameters to serialize +/// * `params` - The BFV parameters to encode /// /// # Returns /// /// Returns a `Vec` containing the ABI-encoded parameters as a tuple (uint256, uint256, uint256[]). -pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { +pub fn encode_bfv_params(params: &BfvParameters) -> Vec { let value = DynSolValue::Tuple(vec![ DynSolValue::Uint(U256::from(params.degree()), 256), DynSolValue::Uint(U256::from(params.plaintext()), 256), @@ -107,24 +107,24 @@ pub fn serialize_bfv_params(params: &BfvParameters) -> Vec { value.abi_encode() } -/// Deserializes BFV parameters from ABI-encoded bytes. +/// Decodes BFV parameters from ABI-encoded bytes. /// /// This function converts ABI-encoded bytes back into BFV parameters. /// The bytes should represent a tuple (uint256, uint256, uint256[]) containing -/// (degree, plaintext_modulus, moduli[]) as produced by `serialize_bfv_params`. +/// (degree, plaintext_modulus, moduli[]) as produced by `encode_bfv_params`. /// /// # Arguments /// -/// * `bytes` - The ABI-encoded bytes containing the serialized parameters +/// * `bytes` - The ABI-encoded bytes containing the encoded parameters /// /// # Returns /// -/// Returns a `BfvParameters` instance deserialized from the bytes. +/// Returns a `BfvParameters` instance decoded from the bytes. /// /// # Panics /// -/// Panics if the deserialization fails due to invalid format or parameter values. -pub fn deserialize_bfv_params(bytes: &[u8]) -> BfvParameters { +/// Panics if the decoding fails due to invalid format or parameter values. +pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { // Define the expected tuple type: (uint256, uint256, uint256[]) let tuple_type = DynSolType::Tuple(vec![ DynSolType::Uint(256), // degree @@ -181,91 +181,24 @@ pub fn deserialize_bfv_params(bytes: &[u8]) -> BfvParameters { } } -/// Deserializes BFV parameters from ABI-encoded bytes and wraps them in an `Arc`. +/// Decodes BFV parameters from ABI-encoded bytes and wraps them in an `Arc`. /// -/// This is a convenience function that combines `deserialize_bfv_params` with `Arc::new` -/// to provide thread-safe shared ownership of the deserialized parameters. +/// This is a convenience function that combines `decode_bfv_params` with `Arc::new` +/// to provide thread-safe shared ownership of the decoded parameters. /// The input bytes should represent a tuple (uint256, uint256, uint256[]) containing /// (degree, plaintext_modulus, moduli[]) in ABI-encoded format. /// /// # Arguments /// -/// * `bytes` - The ABI-encoded bytes containing the serialized parameters -/// -/// # Returns -/// -/// Returns an `Arc` instance deserialized from the bytes. -/// -/// # Panics -/// -/// Panics if the deserialization fails (see `deserialize_bfv_params`). -pub fn deserialize_bfv_params_arc(bytes: &[u8]) -> Arc { - Arc::new(deserialize_bfv_params(bytes)) -} - -/// ABI-encodes BFV parameters as bytes using the Solidity ABI format. -/// -/// This function takes BFV parameters, converts them to a tuple structure, -/// and then wraps the result in a DynSolValue::Bytes before ABI-encoding. -/// This creates a double-encoded structure: the outer layer is bytes, -/// and the inner layer is the tuple (uint256, uint256, uint256[]). -/// -/// # Arguments -/// -/// * `params` - The BFV parameters to encode +/// * `bytes` - The ABI-encoded bytes containing the encoded parameters /// /// # Returns /// -/// Returns a `Vec` containing the ABI-encoded parameters wrapped as bytes. -pub fn encode_bfv_params(params: &BfvParameters) -> Vec { - DynSolValue::Bytes(serialize_bfv_params(params)).abi_encode() -} - -/// ABI-decodes BFV parameters from double-encoded Solidity ABI format. -/// -/// This function takes ABI-encoded bytes where the outer layer is bytes type, -/// and the inner layer contains the serialized BFV parameters. It first decodes -/// the outer bytes layer, then uses the native BFV deserialization on the inner bytes. -/// -/// # Arguments -/// -/// * `bytes` - The double ABI-encoded bytes containing the parameters -/// -/// # Returns -/// -/// Returns a `BfvParameters` instance deserialized from the bytes. +/// Returns an `Arc` instance decoded from the bytes. /// /// # Panics /// -/// Panics if the decoding/deserialization fails. -pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { - let bytes_type = DynSolType::Bytes; - let decoded = bytes_type - .abi_decode(bytes) - .expect("Failed to ABI decode bytes"); - - match decoded { - DynSolValue::Bytes(inner_bytes) => deserialize_bfv_params(&inner_bytes), - _ => panic!("Expected bytes value in ABI encoding"), - } -} - -/// ABI-decodes BFV parameters from double-encoded Solidity ABI format and wraps them in an `Arc`. -/// -/// This function is similar to `decode_bfv_params` but returns the parameters -/// wrapped in an `Arc` for thread-safe shared ownership. -/// -/// # Arguments -/// -/// * `bytes` - The double ABI-encoded bytes containing the parameters -/// -/// # Returns -/// -/// Returns an `Arc` containing the deserialized parameters. -/// -/// # Panics -/// -/// Panics if the decoding/deserialization fails. +/// Panics if the decoding fails (see `decode_bfv_params`). pub fn decode_bfv_params_arc(bytes: &[u8]) -> Arc { Arc::new(decode_bfv_params(bytes)) } @@ -299,56 +232,36 @@ mod tests { } #[test] - fn test_raw_serialization_roundtrip() { + fn test_encoding_roundtrip() { let degree = 2048; let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; let params = build_bfv_params(degree, plaintext_modulus, &moduli); - let serialized = serialize_bfv_params(¶ms); - let deserialized = deserialize_bfv_params(&serialized); + let encoded = encode_bfv_params(¶ms); + let decoded = decode_bfv_params(&encoded); - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli.as_slice()); + assert_eq!(decoded.degree(), degree); + assert_eq!(decoded.plaintext(), plaintext_modulus); + assert_eq!(decoded.moduli(), moduli.as_slice()); } #[test] - fn test_abi_encoding_roundtrip() { + fn test_encoding_deterministic() { let degree = 2048; let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; let params = build_bfv_params(degree, plaintext_modulus, &moduli); - // First serialize to raw bytes - let serialized = serialize_bfv_params(¶ms); - - // Then ABI encode the raw bytes - let encoded = encode_bfv_params(¶ms); - - // Verify the encoded result is deterministic - let encoded_again = encode_bfv_params(¶ms); - assert_eq!( - encoded, encoded_again, - "ABI encoding should be deterministic" - ); - - // Verify the ABI-encoded result is different from the raw serialized bytes - assert_ne!( - encoded, serialized, - "ABI-encoded result should be different from raw serialized bytes" - ); - - // Verify we can ABI-decode and deserialize back to the original parameters - let decoded = decode_bfv_params(&encoded); - assert_eq!(decoded.degree(), degree); - assert_eq!(decoded.plaintext(), plaintext_modulus); - assert_eq!(decoded.moduli(), moduli.as_slice()); + // Verify the encoding result is deterministic + let encoded1 = encode_bfv_params(¶ms); + let encoded2 = encode_bfv_params(¶ms); + assert_eq!(encoded1, encoded2, "ABI encoding should be deterministic"); } #[test] - fn test_abi_encoding_roundtrip_arc() { + fn test_encoding_roundtrip_arc() { let degree = 2048; let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; @@ -356,7 +269,7 @@ mod tests { let params = build_bfv_params(degree, plaintext_modulus, &moduli); let encoded = encode_bfv_params(¶ms); - // Verify we can ABI-decode and deserialize back to the original parameters with Arc + // Verify we can decode back to the original parameters with Arc let decoded = decode_bfv_params_arc(&encoded); assert_eq!(decoded.degree(), degree); assert_eq!(decoded.plaintext(), plaintext_modulus); @@ -402,29 +315,29 @@ mod tests { } #[test] - fn test_params_serialization_roundtrip() { + fn test_params_encoding_roundtrip() { let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; let params = build_bfv_params(degree, plaintext_modulus, &moduli); - let serialized = serialize_bfv_params(¶ms); - let deserialized = deserialize_bfv_params(&serialized); + let encoded = encode_bfv_params(¶ms); + let decoded = decode_bfv_params(&encoded); let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); + assert_eq!(decoded.degree(), degree); + assert_eq!(decoded.plaintext(), plaintext_modulus); + assert_eq!(decoded.moduli(), moduli); } #[test] - fn test_params_arc_serialization_roundtrip() { + fn test_params_arc_encoding_roundtrip() { let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); - let serialized = serialize_bfv_params(¶ms); - let deserialized = deserialize_bfv_params_arc(&serialized); + let encoded = encode_bfv_params(¶ms); + let decoded = decode_bfv_params_arc(&encoded); let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - assert_eq!(deserialized.degree(), degree); - assert_eq!(deserialized.plaintext(), plaintext_modulus); - assert_eq!(deserialized.moduli(), moduli); + assert_eq!(decoded.degree(), degree); + assert_eq!(decoded.plaintext(), plaintext_modulus); + assert_eq!(decoded.moduli(), moduli); } } } From e6b44d7ade20dd17eeb5a01ef28b96c8b9c842b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 4 Jun 2025 10:09:46 +0000 Subject: [PATCH 040/106] Fix UID malarchy (#468) --- examples/CRISP/Dockerfile | 4 ++-- examples/CRISP/docker-compose.yaml | 5 ++--- examples/CRISP/scripts/tasks/dockerize.sh | 3 ++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index 35a6f190dd..d402e56c71 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -28,8 +28,8 @@ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ # Non-root user (skip if it already exists) # ──────────────────────────────────────────────────────────────────────────────── ARG USERNAME=ubuntu -ARG USER_UID=1001 -ARG USER_GID=118 # use any free GID you like +ARG USER_UID=1000 +ARG USER_GID=100 # use any free GID you like RUN set -eux; \ if ! id -u "${USERNAME}" 2>/dev/null; then \ diff --git a/examples/CRISP/docker-compose.yaml b/examples/CRISP/docker-compose.yaml index 75c8f2c363..42095512b8 100644 --- a/examples/CRISP/docker-compose.yaml +++ b/examples/CRISP/docker-compose.yaml @@ -4,8 +4,8 @@ services: build: context: . args: - USER_UID: ${USER_UID:-1001} - USER_GID: ${USER_GID:-118} + USER_UID: ${USER_UID:-1000} + USER_GID: ${USER_GID:-100} USERNAME: ubuntu volumes: - ../..:/app @@ -48,4 +48,3 @@ volumes: synpress-cache: test-results: playwright-report: - diff --git a/examples/CRISP/scripts/tasks/dockerize.sh b/examples/CRISP/scripts/tasks/dockerize.sh index ca9b3493ae..99c7ad1c2d 100755 --- a/examples/CRISP/scripts/tasks/dockerize.sh +++ b/examples/CRISP/scripts/tasks/dockerize.sh @@ -25,7 +25,8 @@ function run_in_docker() { else # Not in container, start Docker and run inside echo "Running outside container, starting Docker and executing command" - docker compose up -d # ensure our container is running + # Passing in the following on first run should theoretically bake the current group and user id into the container so if you build locally using this script the container shouldn't clobber your files with the wrong user + USER_UID=$(id -u) USER_GID=$(id -g) docker compose up -d # ensure our container is running if [ $# -eq 0 ]; then docker compose exec enclave-dev bash From 2d71ffe436328e9adc1e78400c6a5f96f4cbcdc1 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:21:05 +0500 Subject: [PATCH 041/106] `enclave init` client template (#471) * Init Basic Client * Update UI [skip ci] * Update UI * Move Client to examples * Update wasm inside client * Update wasm package json * Update Lockfile * Compute Plaintext Output * Format * Fix test * Update Import Paths --- Cargo.toml | 1 + crates/fhe/src/fhe.rs | 8 +- crates/indexer/src/indexer.rs | 27 +- crates/test-helpers/src/plaintext_writer.rs | 6 +- .../tests/test_aggregation_and_decryption.rs | 6 +- examples/CRISP/apps/client/package.json | 2 +- .../CRISP/apps/server/src/server/indexer.rs | 8 +- examples/CRISP/deploy/Deploy.s.sol | 4 + examples/basic/client/.env.example | 6 + examples/basic/client/.eslintrc.cjs | 19 + examples/basic/client/.gitignore | 39 + examples/basic/client/.prettierignore | 5 + examples/basic/client/.prettierrc | 11 + examples/basic/client/index.html | 48 + examples/basic/client/package.json | 49 + examples/basic/client/postcss.config.cjs | 6 + examples/basic/client/public/favicon.ico | Bin 0 -> 15165 bytes examples/basic/client/public/favicon.png | Bin 0 -> 15165 bytes examples/basic/client/public/manifest.json | 15 + examples/basic/client/src/App.tsx | 13 + .../basic/client/src/abis/enclave.abi.json | 2136 ++++++ examples/basic/client/src/globals.css | 314 + .../client/src/hooks/useEnclaveContract.ts | 268 + .../basic/client/src/hooks/useWebAssembly.tsx | 41 + examples/basic/client/src/main.tsx | 42 + examples/basic/client/src/pages/Wizard.tsx | 862 +++ .../src/pages/components/CardContent.tsx | 15 + .../src/pages/components/EnvironmentError.tsx | 60 + .../client/src/pages/components/Spinner.tsx | 14 + examples/basic/client/src/utils/bfv.ts | 114 + .../basic/client/src/utils/enclave.config.ts | 42 + examples/basic/client/src/vite-env.d.ts | 7 + examples/basic/client/tailwind.config.js | 34 + examples/basic/client/tsconfig.json | 29 + examples/basic/client/tsconfig.node.json | 11 + examples/basic/client/vite.config.ts | 41 + examples/basic/client/wasm/Cargo.lock | 5777 +++++++++++++++++ examples/basic/client/wasm/Cargo.toml | 33 + examples/basic/client/wasm/README.md | 35 + examples/basic/client/wasm/src/lib.rs | 39 + .../evm/contracts/interfaces/IEnclave.sol | 14 + pnpm-lock.yaml | 4916 ++++++++------ pnpm-workspace.yaml | 1 + 43 files changed, 13215 insertions(+), 1903 deletions(-) create mode 100644 examples/basic/client/.env.example create mode 100644 examples/basic/client/.eslintrc.cjs create mode 100644 examples/basic/client/.gitignore create mode 100644 examples/basic/client/.prettierignore create mode 100644 examples/basic/client/.prettierrc create mode 100644 examples/basic/client/index.html create mode 100644 examples/basic/client/package.json create mode 100644 examples/basic/client/postcss.config.cjs create mode 100644 examples/basic/client/public/favicon.ico create mode 100644 examples/basic/client/public/favicon.png create mode 100644 examples/basic/client/public/manifest.json create mode 100644 examples/basic/client/src/App.tsx create mode 100644 examples/basic/client/src/abis/enclave.abi.json create mode 100644 examples/basic/client/src/globals.css create mode 100644 examples/basic/client/src/hooks/useEnclaveContract.ts create mode 100644 examples/basic/client/src/hooks/useWebAssembly.tsx create mode 100644 examples/basic/client/src/main.tsx create mode 100644 examples/basic/client/src/pages/Wizard.tsx create mode 100644 examples/basic/client/src/pages/components/CardContent.tsx create mode 100644 examples/basic/client/src/pages/components/EnvironmentError.tsx create mode 100644 examples/basic/client/src/pages/components/Spinner.tsx create mode 100644 examples/basic/client/src/utils/bfv.ts create mode 100644 examples/basic/client/src/utils/enclave.config.ts create mode 100644 examples/basic/client/src/vite-env.d.ts create mode 100644 examples/basic/client/tailwind.config.js create mode 100644 examples/basic/client/tsconfig.json create mode 100644 examples/basic/client/tsconfig.node.json create mode 100644 examples/basic/client/vite.config.ts create mode 100644 examples/basic/client/wasm/Cargo.lock create mode 100644 examples/basic/client/wasm/Cargo.toml create mode 100644 examples/basic/client/wasm/README.md create mode 100644 examples/basic/client/wasm/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index c36e8b7701..70242ed321 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ exclude = [ "examples/CRISP/apps/server", "examples/CRISP/apps/program", "examples/CRISP/apps/wasm-crypto", + "examples/basic/client/wasm", "crates/support" # client needs to be able to build this independently ] resolver = "2" diff --git a/crates/fhe/src/fhe.rs b/crates/fhe/src/fhe.rs index 535f51710a..12cb074e6d 100644 --- a/crates/fhe/src/fhe.rs +++ b/crates/fhe/src/fhe.rs @@ -114,9 +114,13 @@ impl Fhe { .iter() .map(|k| DecryptionShare::deserialize(k, &self.params, arc_ct.clone())) .aggregate()?; - let decoded = Vec::::try_decode(&plaintext, Encoding::poly())?; - Ok(bincode::serialize(&decoded)?) + let mut bytes = Vec::with_capacity(decoded.len() * 8); + for value in decoded { + bytes.extend_from_slice(&value.to_le_bytes()); + } + + Ok(bytes) } } diff --git a/crates/indexer/src/indexer.rs b/crates/indexer/src/indexer.rs index 17a26b805a..e56bc092b4 100644 --- a/crates/indexer/src/indexer.rs +++ b/crates/indexer/src/indexer.rs @@ -1,6 +1,7 @@ use crate::E3Repository; use super::{models::E3, DataStore}; +use alloy::hex; use alloy::primitives::Uint; use alloy::providers::Provider; use alloy::sol_types::SolEvent; @@ -198,7 +199,12 @@ impl EnclaveIndexer { let contract = contract.clone(); async move { - println!("E3Activated:{:?}", e); + println!( + "E3Activated: id={}, expiration={}, pubkey=0x{}...", + e.e3Id, + e.expiration, + hex::encode(&e.committeePublicKey[..8.min(e.committeePublicKey.len())]) + ); let e3_id = u64_try_from(e.e3Id)?; let e3 = contract.get_e3(e.e3Id).await?; let duration = u64_try_from(e3.duration)?; @@ -245,7 +251,12 @@ impl EnclaveIndexer { .add_event_handler(move |e: InputPublished| { let store = SharedStore::new(store.clone()); async move { - println!("InputPublished:{:?}", e); + println!( + "InputPublished: e3_id={}, index={}, data=0x{}...", + e.e3Id, + e.index, + hex::encode(&e.data[..8.min(e.data.len())]) + ); let e3_id = u64_try_from(e.e3Id)?; let mut repo = E3Repository::new(store, e3_id); @@ -264,7 +275,11 @@ impl EnclaveIndexer { .add_event_handler(move |e: CiphertextOutputPublished| { let store = SharedStore::new(store.clone()); async move { - println!("CiphertextOutputPublished:{:?}", e); + println!( + "CiphertextOutputPublished: e3_id={}, output=0x{}...", + e.e3Id, + hex::encode(&e.ciphertextOutput[..8.min(e.ciphertextOutput.len())]) + ); let e3_id = u64_try_from(e.e3Id)?; let mut repo = E3Repository::new(store, e3_id); @@ -284,7 +299,11 @@ impl EnclaveIndexer { .add_event_handler(move |e: PlaintextOutputPublished| { let store = SharedStore::new(store.clone()); async move { - println!("PlaintextOutputPublished:{:?}", e); + println!( + "PlaintextOutputPublished: e3_id={}, output=0x{}...", + e.e3Id, + hex::encode(&e.plaintextOutput[..8.min(e.plaintextOutput.len())]) + ); let e3_id = u64_try_from(e.e3Id)?; let mut repo = E3Repository::new(store, e3_id); repo.set_plaintext_output(e.plaintextOutput.to_vec()) diff --git a/crates/test-helpers/src/plaintext_writer.rs b/crates/test-helpers/src/plaintext_writer.rs index 8b68c1113c..f759ea25a4 100644 --- a/crates/test-helpers/src/plaintext_writer.rs +++ b/crates/test-helpers/src/plaintext_writer.rs @@ -31,7 +31,11 @@ impl Handler for PlaintextWriter { type Result = (); fn handle(&mut self, msg: EnclaveEvent, _: &mut Self::Context) -> Self::Result { if let EnclaveEvent::PlaintextAggregated { data, .. } = msg.clone() { - let output: Vec = bincode::deserialize(&data.decrypted_output).unwrap(); + let output: Vec = data + .decrypted_output + .chunks_exact(8) + .map(|chunk| u64::from_le_bytes(chunk.try_into().unwrap())) + .collect(); info!(path = ?&self.path, "Writing Plaintext To Path"); let contents: Vec = output.iter().map(|&num| num.to_string()).collect(); diff --git a/crates/tests/tests/test_aggregation_and_decryption.rs b/crates/tests/tests/test_aggregation_and_decryption.rs index 5efc06caa8..6b55ab18f1 100644 --- a/crates/tests/tests/test_aggregation_and_decryption.rs +++ b/crates/tests/tests/test_aggregation_and_decryption.rs @@ -179,7 +179,11 @@ fn encrypt_ciphertext( raw_plaintext: Vec, ) -> Result<(Arc, Vec)> { let padded = &pad_end(&raw_plaintext, 0, 2048); - let expected = bincode::serialize(&padded)?; + let mut bytes = Vec::with_capacity(padded.len() * 8); + for value in padded { + bytes.extend_from_slice(&value.to_le_bytes()); + } + let expected = bytes; let pt = Plaintext::try_encode(&raw_plaintext, Encoding::poly(), ¶ms)?; let ciphertext = pubkey.try_encrypt(&pt, &mut ChaCha20Rng::seed_from_u64(42))?; Ok((Arc::new(ciphertext), expected)) diff --git a/examples/CRISP/apps/client/package.json b/examples/CRISP/apps/client/package.json index 56c2a1026d..859f486098 100644 --- a/examples/CRISP/apps/client/package.json +++ b/examples/CRISP/apps/client/package.json @@ -34,7 +34,7 @@ "react-markdown": "^9.0.1", "react-router-dom": "^6.22.3", "react-syntax-highlighter": "^15.5.0", - "viem": "^2.27.0", + "viem": "^2.30.6", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-top-level-await": "^1.4.1", "vite-tsconfig-paths": "^4.3.2", diff --git a/examples/CRISP/apps/server/src/server/indexer.rs b/examples/CRISP/apps/server/src/server/indexer.rs index 7978d3836e..2115026800 100644 --- a/examples/CRISP/apps/server/src/server/indexer.rs +++ b/examples/CRISP/apps/server/src/server/indexer.rs @@ -132,8 +132,12 @@ pub async fn register_plaintext_output_published( // The plaintextOutput from the event contains the result of the FHE computation. // The computation sums the encrypted votes: '0' for Option 1, '1' for Option 2. // Thus, the decrypted sum directly represents the number of votes for Option 2. - // The output is expected to be a bincode-serialized Vec. - let decoded: Vec = bincode::deserialize(&event.plaintextOutput.to_vec())?; + // The output is expected to be a Vec in little endian format of u64s. + let decoded: Vec = event + .plaintextOutput + .chunks_exact(8) + .map(|chunk| u64::from_le_bytes(chunk.try_into().unwrap())) + .collect(); // decoded[0] is the sum of all encrypted votes (0s and 1s). // Since Option 1 votes are encrypted as '0' and Option 2 votes as '1', diff --git a/examples/CRISP/deploy/Deploy.s.sol b/examples/CRISP/deploy/Deploy.s.sol index 359a16da6e..13b194837d 100644 --- a/examples/CRISP/deploy/Deploy.s.sol +++ b/examples/CRISP/deploy/Deploy.s.sol @@ -25,6 +25,7 @@ import {ControlID} from "risc0/groth16/ControlID.sol"; import {CRISPProgram} from "../contracts/CRISPProgram.sol"; import {CRISPPolicy} from "../contracts/CRISPPolicy.sol"; import {CRISPChecker} from "../contracts/CRISPChecker.sol"; +import {IE3Program} from "@gnosis-guild/enclave/contracts/interfaces/IE3Program.sol"; import {IEnclave} from "@gnosis-guild/enclave/contracts/interfaces/IEnclave.sol"; import {Semaphore} from "@semaphore-protocol/contracts/Semaphore.sol"; import {SemaphoreVerifier} from "@semaphore-protocol/contracts/base/SemaphoreVerifier.sol"; @@ -198,5 +199,8 @@ contract CRISPProgramDeploy is Script { ImageID.VOTING_ID ); console2.log("Deployed CRISPProgram to", address(crisp)); + + enclave.enableE3Program(IE3Program(address(crisp))); + console2.log("Enabled E3 Program on Enclave"); } } diff --git a/examples/basic/client/.env.example b/examples/basic/client/.env.example new file mode 100644 index 0000000000..00ac09d8d6 --- /dev/null +++ b/examples/basic/client/.env.example @@ -0,0 +1,6 @@ +VITE_WALLETCONNECT_PROJECT_ID= +VITE_ENCLAVE_ADDRESS=0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 # Default enclave address from anvil +VITE_REGISTRY_ADDRESS=0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 # Default filter registry address from anvil +VITE_FILTER_REGISTRY_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 # Default naive registry filter address from anvil +VITE_E3_PROGRAM_ADDRESS=0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1 # Default E3 program address from anvil + diff --git a/examples/basic/client/.eslintrc.cjs b/examples/basic/client/.eslintrc.cjs new file mode 100644 index 0000000000..fc8d761de0 --- /dev/null +++ b/examples/basic/client/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + 'prettier' + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/examples/basic/client/.gitignore b/examples/basic/client/.gitignore new file mode 100644 index 0000000000..f57eb99b0c --- /dev/null +++ b/examples/basic/client/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz +.DS_Store + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts +/dist/ diff --git a/examples/basic/client/.prettierignore b/examples/basic/client/.prettierignore new file mode 100644 index 0000000000..b5971906d5 --- /dev/null +++ b/examples/basic/client/.prettierignore @@ -0,0 +1,5 @@ + +out/ +dist/ +build/ +node_modules/ \ No newline at end of file diff --git a/examples/basic/client/.prettierrc b/examples/basic/client/.prettierrc new file mode 100644 index 0000000000..6f412dcc66 --- /dev/null +++ b/examples/basic/client/.prettierrc @@ -0,0 +1,11 @@ +{ + "printWidth": 140, + "useTabs": false, + "tabWidth": 2, + "singleQuote": true, + "jsxSingleQuote": true, + "semi": false, + "trailingComma": "all", + "arrowParens": "always", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/examples/basic/client/index.html b/examples/basic/client/index.html new file mode 100644 index 0000000000..e9dc495af7 --- /dev/null +++ b/examples/basic/client/index.html @@ -0,0 +1,48 @@ + + + + + Enclave + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+
+ + + + \ No newline at end of file diff --git a/examples/basic/client/package.json b/examples/basic/client/package.json new file mode 100644 index 0000000000..c7e455c732 --- /dev/null +++ b/examples/basic/client/package.json @@ -0,0 +1,49 @@ +{ + "name": "enclave-client", + "private": true, + "version": "1.0.0", + "type": "module", + "author": { + "name": "gnosisguild", + "url": "https://github.com/gnosisguild" + }, + "homepage": "https://github.com/gnosisguild/enclave", + "scripts": { + "build-wasm": "command -v wasm-pack >/dev/null 2>&1 || { echo 'Error: wasm-pack is not installed. Please install it by running: cargo install wasm-pack'; exit 1; }; [ ! -f libs/wasm/pkg/wasm_crypto.js ] && (cd wasm && wasm-pack build --target web --release --out-dir ../libs/wasm/pkg) || echo 'WASM package already exists'", + "dev": "npm run build-wasm && vite --no-open --host", + "build": "npm run build-wasm && tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@phosphor-icons/react": "^2.1.4", + "@tanstack/react-query": "^5.74.3", + "@wagmi/core": "^2.17.2", + "connectkit": "^1.9.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viem": "^2.30.6", + "wagmi": "^2.15.4" + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.12", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.13", + "tailwindcss": "^3.4.2", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vite-plugin-wasm": "^3.3.0", + "vite-plugin-top-level-await": "^1.4.1", + "vite-tsconfig-paths": "^4.3.2" + }, + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" +} \ No newline at end of file diff --git a/examples/basic/client/postcss.config.cjs b/examples/basic/client/postcss.config.cjs new file mode 100644 index 0000000000..33ad091d26 --- /dev/null +++ b/examples/basic/client/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/basic/client/public/favicon.ico b/examples/basic/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0485337a2a0755401d6ff0511ea28bba933025d3 GIT binary patch literal 15165 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 literal 0 HcmV?d00001 diff --git a/examples/basic/client/public/favicon.png b/examples/basic/client/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..0485337a2a0755401d6ff0511ea28bba933025d3 GIT binary patch literal 15165 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 literal 0 HcmV?d00001 diff --git a/examples/basic/client/public/manifest.json b/examples/basic/client/public/manifest.json new file mode 100644 index 0000000000..57757aca82 --- /dev/null +++ b/examples/basic/client/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Enclave", + "name": "Enclave Encrypted Execution Environment", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} \ No newline at end of file diff --git a/examples/basic/client/src/App.tsx b/examples/basic/client/src/App.tsx new file mode 100644 index 0000000000..811b175878 --- /dev/null +++ b/examples/basic/client/src/App.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import Wizard from './pages/Wizard' +import './globals.css' + +const App: React.FC = () => { + return ( +
+ +
+ ) +} + +export default App diff --git a/examples/basic/client/src/abis/enclave.abi.json b/examples/basic/client/src/abis/enclave.abi.json new file mode 100644 index 0000000000..dbd0852dd0 --- /dev/null +++ b/examples/basic/client/src/abis/enclave.abi.json @@ -0,0 +1,2136 @@ +{ + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract ICiphernodeRegistry", + "name": "_ciphernodeRegistry", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maxDuration", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "_e3ProgramsParams", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "CiphertextOutputAlreadyPublished", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "CiphertextOutputNotPublished", + "type": "error" + }, + { + "inputs": [], + "name": "CommitteeSelectionFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "E3AlreadyActivated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "E3DoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "E3Expired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "E3NotActivated", + "type": "error" + }, + { + "inputs": [], + "name": "E3NotReady", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3ProgramNotAllowed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + } + ], + "name": "InputDeadlineNotPassed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + } + ], + "name": "InputDeadlinePassed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "contract ICiphernodeRegistry", + "name": "ciphernodeRegistry", + "type": "address" + } + ], + "name": "InvalidCiphernodeRegistry", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + } + ], + "name": "InvalidComputationRequest", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "InvalidDuration", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "InvalidEncryptionScheme", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInput", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "output", + "type": "bytes" + } + ], + "name": "InvalidOutput", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidStartWindow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + } + ], + "name": "InvalidThreshold", + "type": "error" + }, + { + "inputs": [], + "name": "LeafAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "LeafCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "LeafGreaterThanSnarkScalarField", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ModuleAlreadyEnabled", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ModuleNotEnabled", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PaymentRequired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "PlaintextOutputAlreadyPublished", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes[]", + "name": "e3ProgramParams", + "type": "bytes[]" + } + ], + "name": "AllowedE3ProgramsParamsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "ciphernodeRegistry", + "type": "address" + } + ], + "name": "CiphernodeRegistrySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "ciphertextOutput", + "type": "bytes" + } + ], + "name": "CiphertextOutputPublished", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "committeePublicKey", + "type": "bytes" + } + ], + "name": "E3Activated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3ProgramDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3ProgramEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + }, + { + "indexed": false, + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3Requested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "EncryptionSchemeDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "EncryptionSchemeEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inputHash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "InputPublished", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxDuration", + "type": "uint256" + } + ], + "name": "MaxDurationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "name": "PlaintextOutputPublished", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + } + ], + "name": "activate", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ciphernodeRegistry", + "outputs": [ + { + "internalType": "contract ICiphernodeRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "decryptionVerifiers", + "outputs": [ + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "disableE3Program", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "disableEncryptionScheme", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "e3Programs", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + } + ], + "name": "e3ProgramsParams", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "e3s", + "outputs": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "enableE3Program", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "getDecryptionVerifier", + "outputs": [ + { + "internalType": "contract IDecryptionVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "getE3", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "getInputRoot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "contract ICiphernodeRegistry", + "name": "_ciphernodeRegistry", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maxDuration", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "_e3ProgramsParams", + "type": "bytes[]" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "inputCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "inputCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "inputs", + "outputs": [ + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depth", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nexte3Id", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ciphertextOutput", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "publishCiphertextOutput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "publishInput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "publishPlaintextOutput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "computeProviderParams", + "type": "bytes" + } + ], + "name": "request", + "outputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "requests", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ICiphernodeRegistry", + "name": "_ciphernodeRegistry", + "type": "address" + } + ], + "name": "setCiphernodeRegistry", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + } + ], + "name": "setDecryptionVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "_e3ProgramsParams", + "type": "bytes[]" + } + ], + "name": "setE3ProgramsParams", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxDuration", + "type": "uint256" + } + ], + "name": "setMaxDuration", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "transactionIndex": 0, + "gasUsed": "2348382", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000001000000000000000000100000000000000000020000000000000100000800000000000000000000800000000400420000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210000000000001000000000002004000000000000000020000000000000000000000000000001000000000800000000800000000000000000", + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29", + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000278d00", + "logIndex": 1, + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 2, + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000ffffffff00001", + "logIndex": 3, + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 4, + "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" + } + ], + "blockNumber": 2, + "cumulativeGasUsed": "2348382", + "status": 1, + "byzantium": true + }, + "args": [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x0000000000000000000000000000000000000001", + 2592000, + [ + "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000ffffffff00001" + ] + ], + "numDeployments": 1, + "solcInputHash": "80cb5ee2e1fd6ae6ae6f35878559ec6f", + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeSelectionFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3AlreadyActivated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3DoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3Expired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3NotActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3NotReady\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlineNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlinePassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"InvalidCiphernodeRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"}],\"name\":\"InvalidComputationRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"InvalidEncryptionScheme\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"output\",\"type\":\"bytes\"}],\"name\":\"InvalidOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStartWindow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafGreaterThanSnarkScalarField\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"PaymentRequired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"PlaintextOutputAlreadyPublished\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"e3ProgramParams\",\"type\":\"bytes[]\"}],\"name\":\"AllowedE3ProgramsParamsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"CiphernodeRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"}],\"name\":\"CiphertextOutputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"committeePublicKey\",\"type\":\"bytes\"}],\"name\":\"E3Activated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3Requested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inputHash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"InputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxDuration\",\"type\":\"uint256\"}],\"name\":\"MaxDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"name\":\"PlaintextOutputPublished\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"activate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ciphernodeRegistry\",\"outputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"decryptionVerifiers\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"disableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"disableEncryptionScheme\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"e3Programs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"}],\"name\":\"e3ProgramsParams\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"e3s\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"enableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"getDecryptionVerifier\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getE3\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getInputRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputCounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"inputCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nexte3Id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishCiphertextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"publishInput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishPlaintextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"computeProviderParams\",\"type\":\"bytes\"}],\"name\":\"request\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"setCiphernodeRegistry\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"name\":\"setDecryptionVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"name\":\"setE3ProgramsParams\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"setMaxDuration\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"AllowedE3ProgramsParamsSet(bytes[])\":{\"params\":{\"e3ProgramParams\":\"Array of encoded encryption scheme parameters (e.g, for BFV)\"}},\"CiphernodeRegistrySet(address)\":{\"params\":{\"ciphernodeRegistry\":\"The address of the CiphernodeRegistry contract.\"}},\"CiphertextOutputPublished(uint256,bytes)\":{\"params\":{\"ciphertextOutput\":\"ABI encoded ciphertext output.\",\"e3Id\":\"ID of the E3.\"}},\"E3Activated(uint256,uint256,bytes)\":{\"params\":{\"committeePublicKey\":\"Public key of the committee.\",\"e3Id\":\"ID of the E3.\",\"expiration\":\"Timestamp when committee duties expire.\"}},\"E3ProgramDisabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3ProgramEnabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"params\":{\"e3\":\"Details of the E3.\",\"e3Id\":\"ID of the E3.\",\"e3Program\":\"Address of the Computation module selected.\",\"filter\":\"Address of the pool of nodes from which the Cipher Node committee was selected.\"}},\"EncryptionSchemeDisabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was disabled.\"}},\"EncryptionSchemeEnabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was enabled.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"params\":{\"data\":\"ABI encoded input data.\",\"e3Id\":\"ID of the E3.\"}},\"MaxDurationSet(uint256)\":{\"params\":{\"maxDuration\":\"The maximum duration of a computation in seconds.\"}},\"PlaintextOutputPublished(uint256,bytes)\":{\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\"}}},\"kind\":\"dev\",\"methods\":{\"activate(uint256,bytes)\":{\"details\":\"This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"publicKey\":\"Public key of the committee.\"},\"returns\":{\"success\":\"True if the E3 was successfully activated.\"}},\"constructor\":{\"params\":{\"_e3ProgramsParams\":\"Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\",\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"getE3(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"e3\":\"The struct representing the requested E3.\"}},\"getInputRoot(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"_0\":\"The root of the input merkle tree.\"}},\"initialize(address,address,uint256,bytes[])\":{\"params\":{\"_ciphernodeRegistry\":\"The address of the ciphernode registry\",\"_e3ProgramsParams\":\"Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\",\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST emit the CiphertextOutputPublished event.\",\"params\":{\"ciphertextOutput\":\"ABI encoded output data to verify.\",\"e3Id\":\"ID of the E3.\",\"proof\":\"ABI encoded data to verify the ciphertextOutput.\"},\"returns\":{\"success\":\"True if the output was successfully published.\"}},\"publishInput(uint256,bytes)\":{\"details\":\"This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.\",\"params\":{\"data\":\"ABI encoded input data to publish.\",\"e3Id\":\"ID of the E3.\"},\"returns\":{\"success\":\"True if the input was successfully published.\"}},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\",\"proof\":\"ABI encoded data to verify the plaintextOutput.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"details\":\"This function MUST emit the E3Requested event.\",\"params\":{\"computeProviderParams\":\"ABI encoded compute provider parameters.\",\"duration\":\"The duration of the computation in seconds.\",\"e3Program\":\"Address of the E3 Program.\",\"e3ProgramParams\":\"ABI encoded computation parameters.\",\"filter\":\"IDs of the pool of nodes from which to select the committee.\",\"threshold\":\"The M/N threshold for the committee.\"},\"returns\":{\"e3\":\"The E3 struct.\",\"e3Id\":\"ID of the E3.\"}},\"setMaxDuration(uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds.\"},\"returns\":{\"success\":\"True if the max duration was successfully set.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"AllowedE3ProgramsParamsSet(bytes[])\":{\"notice\":\"Emitted when the allowed E3 encryption scheme parameters are configured.\"},\"CiphernodeRegistrySet(address)\":{\"notice\":\"This event MUST be emitted any time the CiphernodeRegistry is set.\"},\"CiphertextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published.\"},\"E3Activated(uint256,uint256,bytes)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\"},\"E3ProgramDisabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is disabled.\"},\"E3ProgramEnabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is enabled.\"},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\"},\"EncryptionSchemeDisabled(bytes32)\":{\"notice\":\"This event MUST be emitted any time an encryption scheme is disabled.\"},\"EncryptionSchemeEnabled(bytes32)\":{\"notice\":\"The event MUST be emitted any time an encryption scheme is enabled.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published.\"},\"MaxDurationSet(uint256)\":{\"notice\":\"This event MUST be emitted any time the `maxDuration` is set.\"},\"PlaintextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published.\"}},\"kind\":\"user\",\"methods\":{\"activate(uint256,bytes)\":{\"notice\":\"This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input.\"},\"e3ProgramsParams(bytes)\":{\"notice\":\"Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV).\"},\"getE3(uint256)\":{\"notice\":\"This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\"},\"getInputRoot(uint256)\":{\"notice\":\"This function returns root of the input merkle tree for a given E3.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function should be called to publish output data for an Encrypted Execution Environment (E3).\"},\"publishInput(uint256,bytes)\":{\"notice\":\"This function should be called to publish input data for Encrypted Execution Environment (E3).\"},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function publishes the plaintext output of an Encrypted Execution Environment (E3).\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"notice\":\"This function should be called to request a computation within an Encrypted Execution Environment (E3).\"},\"setMaxDuration(uint256)\":{\"notice\":\"This function should be called to set the maximum duration of requested computations.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Enclave.sol\":\"Enclave\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\\n *\\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\\n */\\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\\n return INITIALIZABLE_STORAGE;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n bytes32 slot = _initializableStorageSlot();\\n assembly {\\n $.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"@zk-kit/lean-imt.sol/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xb1944a1d9f63069b2f22260935adb2d11546f82fbb7d12d853a90134a92f4b5b\",\"license\":\"UNLICENSED\"},\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\nimport {SNARK_SCALAR_FIELD} from \\\"./Constants.sol\\\";\\n\\nstruct LeanIMTData {\\n // Tracks the current number of leaves in the tree.\\n uint256 size;\\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\\n uint256 depth;\\n // A mapping from each level of the tree to the node value of the last even position at that level.\\n // Used for efficient inserts, updates and root calculations.\\n mapping(uint256 => uint256) sideNodes;\\n // A mapping from leaf values to their respective indices in the tree.\\n // This facilitates checks for leaf existence and retrieval of leaf positions.\\n mapping(uint256 => uint256) leaves;\\n}\\n\\nerror WrongSiblingNodes();\\nerror LeafGreaterThanSnarkScalarField();\\nerror LeafCannotBeZero();\\nerror LeafAlreadyExists();\\nerror LeafDoesNotExist();\\n\\n/// @title Lean Incremental binary Merkle tree.\\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\\n/// it is updated based on the number of leaves in the tree. This approach\\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\\nlibrary InternalLeanIMT {\\n /// @dev Inserts a new leaf into the incremental merkle tree.\\n /// The function ensures that the leaf is valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the new leaf to be inserted into the tree.\\n /// @return The new hash of the node after the leaf has been inserted.\\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\\n if (leaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaf == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = self.size;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // A new insertion can increase a tree's depth by at most 1,\\n // and only if the number of leaves supported by the current\\n // depth is less than the number of leaves to be supported after insertion.\\n if (2 ** treeDepth < index + 1) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n uint256 node = leaf;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n node = PoseidonT3.hash([self.sideNodes[level], node]);\\n } else {\\n self.sideNodes[level] = node;\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n self.size = ++index;\\n\\n self.sideNodes[treeDepth] = node;\\n self.leaves[leaf] = index;\\n\\n return node;\\n }\\n\\n /// @dev Inserts many leaves into the incremental merkle tree.\\n /// The function ensures that the leaves are valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaves: The values of the new leaves to be inserted into the tree.\\n /// @return The root after the leaves have been inserted.\\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\\n // Cache tree size to optimize gas\\n uint256 treeSize = self.size;\\n\\n // Check that all the new values are correct to be added.\\n for (uint256 i = 0; i < leaves.length; ) {\\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaves[i] == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaves[i])) {\\n revert LeafAlreadyExists();\\n }\\n\\n self.leaves[leaves[i]] = treeSize + 1 + i;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Array to save the nodes that will be used to create the next level of the tree.\\n uint256[] memory currentLevelNewNodes;\\n\\n currentLevelNewNodes = leaves;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // Calculate the depth of the tree after adding the new values.\\n // Unlike the 'insert' function, we need a while here as\\n // N insertions can increase the tree's depth more than once.\\n while (2 ** treeDepth < treeSize + leaves.length) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n // First index to change in every level.\\n uint256 currentLevelStartIndex = treeSize;\\n\\n // Size of the level used to create the next level.\\n uint256 currentLevelSize = treeSize + leaves.length;\\n\\n // The index where changes begin at the next level.\\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\\n\\n // The size of the next level.\\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n // The number of nodes for the new level that will be created,\\n // only the new values, not the entire level.\\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\\n for (uint256 i = 0; i < numberOfNewNodes; ) {\\n uint256 leftNode;\\n\\n // Assign the left node using the saved path or the position in the array.\\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\\n leftNode = self.sideNodes[level];\\n } else {\\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\\n }\\n\\n uint256 rightNode;\\n\\n // Assign the right node if the value exists.\\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\\n }\\n\\n uint256 parentNode;\\n\\n // Assign the parent node.\\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\\n // it will be the leftNode.\\n if (rightNode != 0) {\\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\\n } else {\\n parentNode = leftNode;\\n }\\n\\n nextLevelNewNodes[i] = parentNode;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Update the `sideNodes` variable.\\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\\n // will be the value before the last one.\\n // If it is even and there is only one element, there is no need to save anything because\\n // the correct value for this level was already saved before.\\n if (currentLevelSize & 1 == 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\\n } else if (currentLevelNewNodes.length > 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\\n }\\n\\n currentLevelStartIndex = nextLevelStartIndex;\\n\\n // Calculate the next level startIndex value.\\n // It is the position of the parent node which is pos/2.\\n nextLevelStartIndex >>= 1;\\n\\n // Update the next array that will be used to calculate the next level.\\n currentLevelNewNodes = nextLevelNewNodes;\\n\\n currentLevelSize = nextLevelSize;\\n\\n // Calculate the size of the next level.\\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n // Update tree size\\n self.size = treeSize + leaves.length;\\n\\n // Update tree root\\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\\n\\n return currentLevelNewNodes[0];\\n }\\n\\n /// @dev Updates the value of an existing leaf and recalculates hashes\\n /// to maintain tree integrity.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf that is to be updated.\\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\\n /// @return The new hash of the updated node after the leaf has been updated.\\n function _update(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256 newLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n if (newLeaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (!_has(self, oldLeaf)) {\\n revert LeafDoesNotExist();\\n } else if (_has(self, newLeaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = _indexOf(self, oldLeaf);\\n uint256 node = newLeaf;\\n uint256 oldRoot = oldLeaf;\\n\\n uint256 lastIndex = self.size - 1;\\n uint256 i = 0;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([siblingNodes[i], node]);\\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n if (index >> level != lastIndex >> level) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([node, siblingNodes[i]]);\\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n self.sideNodes[i] = node;\\n }\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n if (oldRoot != _root(self)) {\\n revert WrongSiblingNodes();\\n }\\n\\n self.sideNodes[treeDepth] = node;\\n\\n if (newLeaf != 0) {\\n self.leaves[newLeaf] = self.leaves[oldLeaf];\\n }\\n\\n self.leaves[oldLeaf] = 0;\\n\\n return node;\\n }\\n\\n /// @dev Removes a leaf from the tree by setting its value to zero.\\n /// This function utilizes the update function to set the leaf's value\\n /// to zero and update the tree's state accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf to be removed.\\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\\n /// @return The new root hash of the tree after the leaf has been removed.\\n function _remove(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n return _update(self, oldLeaf, 0, siblingNodes);\\n }\\n\\n /// @dev Checks if a leaf exists in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf to check for existence.\\n /// @return A boolean value indicating whether the leaf exists in the tree.\\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\\n return self.leaves[leaf] != 0;\\n }\\n\\n /// @dev Retrieves the index of a given leaf in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf whose index is to be found.\\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\\n /// reverts with a custom error.\\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\\n if (self.leaves[leaf] == 0) {\\n revert LeafDoesNotExist();\\n }\\n\\n return self.leaves[leaf] - 1;\\n }\\n\\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\\n /// current tree depth.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @return The root hash of the tree.\\n function _root(LeanIMTData storage self) internal view returns (uint256) {\\n return self.sideNodes[self.depth];\\n }\\n}\\n\",\"keccak256\":\"0x6385ce9153d11d9824163464193d4ba3dd304e662dccd365ba2fc381a359762b\",\"license\":\"MIT\"},\"contracts/Enclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IEnclave, E3, IE3Program } from \\\"./interfaces/IEnclave.sol\\\";\\nimport { IInputValidator } from \\\"./interfaces/IInputValidator.sol\\\";\\nimport { ICiphernodeRegistry } from \\\"./interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./interfaces/IDecryptionVerifier.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n InternalLeanIMT,\\n LeanIMTData,\\n PoseidonT3\\n} from \\\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\\\";\\n\\ncontract Enclave is IEnclave, OwnableUpgradeable {\\n using InternalLeanIMT for LeanIMTData;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n ICiphernodeRegistry public ciphernodeRegistry; // address of the Ciphernode registry.\\n uint256 public maxDuration; // maximum duration of a computation in seconds.\\n uint256 public nexte3Id; // ID of the next E3.\\n uint256 public requests; // total number of requests made to Enclave.\\n\\n // Mapping of allowed E3 Programs.\\n mapping(IE3Program e3Program => bool allowed) public e3Programs;\\n\\n // Mapping of E3s.\\n mapping(uint256 e3Id => E3 e3) public e3s;\\n\\n // Mapping of input merkle trees.\\n mapping(uint256 e3Id => LeanIMTData imt) public inputs;\\n\\n // Mapping counting the number of inputs for each E3.\\n mapping(uint256 e3Id => uint256 inputCount) public inputCounts;\\n\\n // Mapping of enabled encryption schemes.\\n mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier)\\n public decryptionVerifiers;\\n\\n /// Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV).\\n mapping(bytes e3ProgramParams => bool allowed) public e3ProgramsParams;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeSelectionFailed();\\n error E3ProgramNotAllowed(IE3Program e3Program);\\n error E3AlreadyActivated(uint256 e3Id);\\n error E3Expired();\\n error E3NotActivated(uint256 e3Id);\\n error E3NotReady();\\n error E3DoesNotExist(uint256 e3Id);\\n error ModuleAlreadyEnabled(address module);\\n error ModuleNotEnabled(address module);\\n error InvalidEncryptionScheme(bytes32 encryptionSchemeId);\\n error InputDeadlinePassed(uint256 e3Id, uint256 expiration);\\n error InputDeadlineNotPassed(uint256 e3Id, uint256 expiration);\\n error InvalidComputationRequest(IInputValidator inputValidator);\\n error InvalidCiphernodeRegistry(ICiphernodeRegistry ciphernodeRegistry);\\n error InvalidDuration(uint256 duration);\\n error InvalidOutput(bytes output);\\n error InvalidInput();\\n error InvalidStartWindow();\\n error InvalidThreshold(uint32[2] threshold);\\n error CiphertextOutputAlreadyPublished(uint256 e3Id);\\n error CiphertextOutputNotPublished(uint256 e3Id);\\n error PaymentRequired(uint256 value);\\n error PlaintextOutputAlreadyPublished(uint256 e3Id);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\\n constructor(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration,\\n bytes[] memory _e3ProgramsParams\\n ) {\\n initialize(\\n _owner,\\n _ciphernodeRegistry,\\n _maxDuration,\\n _e3ProgramsParams\\n );\\n }\\n\\n /// @param _owner The owner of this contract\\n /// @param _ciphernodeRegistry The address of the ciphernode registry\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\\n function initialize(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration,\\n bytes[] memory _e3ProgramsParams\\n ) public initializer {\\n __Ownable_init(msg.sender);\\n setMaxDuration(_maxDuration);\\n setCiphernodeRegistry(_ciphernodeRegistry);\\n setE3ProgramsParams(_e3ProgramsParams);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3) {\\n // TODO: allow for other payment methods or only native tokens?\\n // TODO: should payment checks be somewhere else? Perhaps in the E3 Program or ciphernode registry?\\n require(msg.value > 0, PaymentRequired(msg.value));\\n require(\\n threshold[1] >= threshold[0] && threshold[0] > 0,\\n InvalidThreshold(threshold)\\n );\\n require(\\n // TODO: do we need a minimum start window to allow time for committee selection?\\n startWindow[1] >= startWindow[0] &&\\n startWindow[1] >= block.timestamp,\\n InvalidStartWindow()\\n );\\n require(\\n duration > 0 && duration <= maxDuration,\\n InvalidDuration(duration)\\n );\\n require(e3Programs[e3Program], E3ProgramNotAllowed(e3Program));\\n\\n // TODO: should IDs be incremental or produced deterministically?\\n e3Id = nexte3Id;\\n nexte3Id++;\\n uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id)));\\n\\n (bytes32 encryptionSchemeId, IInputValidator inputValidator) = e3Program\\n .validate(e3Id, seed, e3ProgramParams, computeProviderParams);\\n IDecryptionVerifier decryptionVerifier = decryptionVerifiers[\\n encryptionSchemeId\\n ];\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n require(\\n address(inputValidator) != address(0),\\n InvalidComputationRequest(inputValidator)\\n );\\n\\n e3 = E3({\\n seed: seed,\\n threshold: threshold,\\n requestBlock: block.number,\\n startWindow: startWindow,\\n duration: duration,\\n expiration: 0,\\n encryptionSchemeId: encryptionSchemeId,\\n e3Program: e3Program,\\n e3ProgramParams: e3ProgramParams,\\n inputValidator: inputValidator,\\n decryptionVerifier: decryptionVerifier,\\n committeePublicKey: hex\\\"\\\",\\n ciphertextOutput: hex\\\"\\\",\\n plaintextOutput: hex\\\"\\\"\\n });\\n e3s[e3Id] = e3;\\n\\n require(\\n ciphernodeRegistry.requestCommittee(e3Id, filter, threshold),\\n CommitteeSelectionFailed()\\n );\\n\\n emit E3Requested(e3Id, e3, filter, e3Program);\\n }\\n\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n require(e3.expiration == 0, E3AlreadyActivated(e3Id));\\n require(e3.startWindow[0] <= block.timestamp, E3NotReady());\\n // TODO: handle what happens to the payment if the start window has passed.\\n require(e3.startWindow[1] >= block.timestamp, E3Expired());\\n\\n bytes32 publicKeyHash = ciphernodeRegistry.committeePublicKey(e3Id);\\n require(\\n keccak256(publicKey) == publicKeyHash,\\n CommitteeSelectionFailed()\\n );\\n uint256 expiresAt = block.timestamp + e3.duration;\\n e3s[e3Id].expiration = expiresAt;\\n e3s[e3Id].committeePublicKey = keccak256(publicKey);\\n\\n emit E3Activated(e3Id, expiresAt, publicKey);\\n\\n return true;\\n }\\n\\n function publishInput(\\n uint256 e3Id,\\n bytes memory data\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n // TODO: should we have an input window, including both a start and end timestamp?\\n require(\\n e3.expiration > block.timestamp,\\n InputDeadlinePassed(e3Id, e3.expiration)\\n );\\n\\n bytes memory input = e3.inputValidator.validate(msg.sender, data);\\n uint256 inputHash = PoseidonT3.hash(\\n [uint256(keccak256(input)), inputCounts[e3Id]]\\n );\\n\\n inputCounts[e3Id]++;\\n inputs[e3Id]._insert(inputHash);\\n success = true;\\n\\n emit InputPublished(e3Id, input, inputHash, inputCounts[e3Id] - 1);\\n }\\n\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.expiration <= block.timestamp,\\n InputDeadlineNotPassed(e3Id, e3.expiration)\\n );\\n // TODO: should the output verifier be able to change its mind?\\n //i.e. should we be able to call this multiple times?\\n require(\\n e3.ciphertextOutput == bytes32(0),\\n CiphertextOutputAlreadyPublished(e3Id)\\n );\\n bytes32 ciphertextOutputHash = keccak256(ciphertextOutput);\\n (success) = e3.e3Program.verify(e3Id, ciphertextOutputHash, proof);\\n require(success, InvalidOutput(ciphertextOutput));\\n e3s[e3Id].ciphertextOutput = ciphertextOutputHash;\\n\\n emit CiphertextOutputPublished(e3Id, ciphertextOutput);\\n }\\n\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.ciphertextOutput != bytes32(0),\\n CiphertextOutputNotPublished(e3Id)\\n );\\n require(\\n e3.plaintextOutput.length == 0,\\n PlaintextOutputAlreadyPublished(e3Id)\\n );\\n (success) = e3.decryptionVerifier.verify(\\n e3Id,\\n keccak256(plaintextOutput),\\n proof\\n );\\n require(success, InvalidOutput(plaintextOutput));\\n e3s[e3Id].plaintextOutput = plaintextOutput;\\n\\n emit PlaintextOutputPublished(e3Id, plaintextOutput);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) public onlyOwner returns (bool success) {\\n maxDuration = _maxDuration;\\n success = true;\\n emit MaxDurationSet(_maxDuration);\\n }\\n\\n function setCiphernodeRegistry(\\n ICiphernodeRegistry _ciphernodeRegistry\\n ) public onlyOwner returns (bool success) {\\n require(\\n address(_ciphernodeRegistry) != address(0) &&\\n _ciphernodeRegistry != ciphernodeRegistry,\\n InvalidCiphernodeRegistry(_ciphernodeRegistry)\\n );\\n ciphernodeRegistry = _ciphernodeRegistry;\\n success = true;\\n emit CiphernodeRegistrySet(address(_ciphernodeRegistry));\\n }\\n\\n function enableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(\\n !e3Programs[e3Program],\\n ModuleAlreadyEnabled(address(e3Program))\\n );\\n e3Programs[e3Program] = true;\\n success = true;\\n emit E3ProgramEnabled(e3Program);\\n }\\n\\n function disableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(e3Programs[e3Program], ModuleNotEnabled(address(e3Program)));\\n delete e3Programs[e3Program];\\n success = true;\\n emit E3ProgramDisabled(e3Program);\\n }\\n\\n function setDecryptionVerifier(\\n bytes32 encryptionSchemeId,\\n IDecryptionVerifier decryptionVerifier\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifier != IDecryptionVerifier(address(0)) &&\\n decryptionVerifiers[encryptionSchemeId] != decryptionVerifier,\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = decryptionVerifier;\\n success = true;\\n emit EncryptionSchemeEnabled(encryptionSchemeId);\\n }\\n\\n function disableEncryptionScheme(\\n bytes32 encryptionSchemeId\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = IDecryptionVerifier(\\n address(0)\\n );\\n success = true;\\n emit EncryptionSchemeDisabled(encryptionSchemeId);\\n }\\n\\n function setE3ProgramsParams(\\n bytes[] memory _e3ProgramsParams\\n ) public onlyOwner returns (bool success) {\\n uint256 length = _e3ProgramsParams.length;\\n for (uint256 i; i < length; ) {\\n e3ProgramsParams[_e3ProgramsParams[i]] = true;\\n unchecked {\\n ++i;\\n }\\n }\\n success = true;\\n emit AllowedE3ProgramsParamsSet(_e3ProgramsParams);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function getE3(uint256 e3Id) public view returns (E3 memory e3) {\\n e3 = e3s[e3Id];\\n require(e3.e3Program != IE3Program(address(0)), E3DoesNotExist(e3Id));\\n }\\n\\n function getInputRoot(uint256 e3Id) public view returns (uint256) {\\n require(\\n e3s[e3Id].e3Program != IE3Program(address(0)),\\n E3DoesNotExist(e3Id)\\n );\\n return InternalLeanIMT._root(inputs[e3Id]);\\n }\\n\\n function getDecryptionVerifier(\\n bytes32 encryptionSchemeId\\n ) public view returns (IDecryptionVerifier) {\\n return decryptionVerifiers[encryptionSchemeId];\\n }\\n}\\n\",\"keccak256\":\"0x1292264979903b363daa16b2585aa48e1dbfcccf24c103340def18a41986e724\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IDecryptionVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IDecryptionVerifier {\\n /// @notice This function should be called by the Enclave contract to verify the\\n /// decryption of output of a computation.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutputHash The keccak256 hash of the plaintext output to be verified.\\n /// @param proof ABI encoded proof of the given output hash.\\n /// @return success Whether or not the plaintextOutputHash was successfully verified.\\n function verify(\\n uint256 e3Id,\\n bytes32 plaintextOutputHash,\\n bytes memory proof\\n ) external view returns (bool success);\\n}\\n\",\"keccak256\":\"0xb92991a581d3c18cdc273497687ec1c6e3016674314f21fe56917aece5d10863\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\nimport { IE3Program } from \\\"./IE3Program.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./IDecryptionVerifier.sol\\\";\\n\\n/// @title E3 struct\\n/// @notice This struct represents an E3 computation.\\n/// @param threshold M/N threshold for the committee.\\n/// @param requestBlock Block number when the E3 was requested.\\n/// @param startWindow Start window for the computation: index zero is minimum, index 1 is the maxium.\\n/// @param duration Duration of the E3.\\n/// @param expiration Timestamp when committee duties expire.\\n/// @param e3Program Address of the E3 Program contract.\\n/// @param e3ProgramParams ABI encoded computation parameters.\\n/// @param computeProvider Address of the compute provider contract.\\n/// @param inputValidator Address of the input validator contract.\\n/// @param decryptionVerifier Address of the output verifier contract.\\n/// @param committeeId ID of the selected committee.\\n/// @param ciphertextOutput Encrypted output data.\\n/// @param plaintextOutput Decrypted output data.\\nstruct E3 {\\n uint256 seed;\\n uint32[2] threshold;\\n uint256 requestBlock;\\n uint256[2] startWindow;\\n uint256 duration;\\n uint256 expiration;\\n bytes32 encryptionSchemeId;\\n IE3Program e3Program;\\n bytes e3ProgramParams;\\n IInputValidator inputValidator;\\n IDecryptionVerifier decryptionVerifier;\\n bytes32 committeePublicKey;\\n bytes32 ciphertextOutput;\\n bytes plaintextOutput;\\n}\\n\",\"keccak256\":\"0x9c18920667ddc73d14c6c8cbccf283c89b1a29b0c79d5262ffe7c93787b2397d\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3Program.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\n\\ninterface IE3Program {\\n /// @notice This function should be called by the Enclave contract to validate the computation parameters.\\n /// @param e3Id ID of the E3.\\n /// @param seed Seed for the computation.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return encryptionSchemeId ID of the encryption scheme to be used for the computation.\\n /// @return inputValidator The input validator to be used for the computation.\\n function validate(\\n uint256 e3Id,\\n uint256 seed,\\n bytes calldata e3ProgramParams,\\n bytes calldata computeProviderParams\\n )\\n external\\n returns (bytes32 encryptionSchemeId, IInputValidator inputValidator);\\n\\n /// @notice This function should be called by the Enclave contract to verify the decrypted output of an E3.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutputHash The keccak256 hash of output data to be verified.\\n /// @param proof ABI encoded data to verify the ciphertextOutputHash.\\n /// @return success Whether the output data is valid.\\n function verify(\\n uint256 e3Id,\\n bytes32 ciphertextOutputHash,\\n bytes memory proof\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xd60e92b5b6498daf0b7f1238d354156c67d25c03caaaabbc601368e9e4a295b2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IEnclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { E3, IE3Program } from \\\"./IE3.sol\\\";\\n\\ninterface IEnclave {\\n ////////////////////////////////////////////////////////////\\n // //\\n // Events //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\\n /// @param e3Id ID of the E3.\\n /// @param e3 Details of the E3.\\n /// @param filter Address of the pool of nodes from which the Cipher Node committee was selected.\\n /// @param e3Program Address of the Computation module selected.\\n event E3Requested(\\n uint256 e3Id,\\n E3 e3,\\n address filter,\\n IE3Program indexed e3Program\\n );\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\\n /// @param e3Id ID of the E3.\\n /// @param expiration Timestamp when committee duties expire.\\n /// @param committeePublicKey Public key of the committee.\\n event E3Activated(\\n uint256 e3Id,\\n uint256 expiration,\\n bytes committeePublicKey\\n );\\n\\n /// @notice This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is\\n /// successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data.\\n event InputPublished(\\n uint256 indexed e3Id,\\n bytes data,\\n uint256 inputHash,\\n uint256 index\\n );\\n\\n /// @notice This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput);\\n\\n /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded ciphertext output.\\n event CiphertextOutputPublished(\\n uint256 indexed e3Id,\\n bytes ciphertextOutput\\n );\\n\\n /// @notice This event MUST be emitted any time the `maxDuration` is set.\\n /// @param maxDuration The maximum duration of a computation in seconds.\\n event MaxDurationSet(uint256 maxDuration);\\n\\n /// @notice This event MUST be emitted any time the CiphernodeRegistry is set.\\n /// @param ciphernodeRegistry The address of the CiphernodeRegistry contract.\\n event CiphernodeRegistrySet(address ciphernodeRegistry);\\n\\n /// @notice The event MUST be emitted any time an encryption scheme is enabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was enabled.\\n event EncryptionSchemeEnabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time an encryption scheme is disabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was disabled.\\n event EncryptionSchemeDisabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is enabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramEnabled(IE3Program e3Program);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is disabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramDisabled(IE3Program e3Program);\\n\\n /// @notice Emitted when the allowed E3 encryption scheme parameters are configured.\\n /// @param e3ProgramParams Array of encoded encryption scheme parameters (e.g, for BFV)\\n event AllowedE3ProgramsParamsSet(bytes[] e3ProgramParams);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to request a computation within an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the E3Requested event.\\n /// @param filter IDs of the pool of nodes from which to select the committee.\\n /// @param threshold The M/N threshold for the committee.\\n /// @param duration The duration of the computation in seconds.\\n /// @param e3Program Address of the E3 Program.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return e3Id ID of the E3.\\n /// @return e3 The E3 struct.\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3);\\n\\n /// @notice This function should be called to activate an Encrypted Execution Environment (E3) once it has been\\n /// initialized and is ready for input.\\n /// @dev This function MUST emit the E3Activated event.\\n /// @dev This function MUST revert if the given E3 has not yet been requested.\\n /// @dev This function MUST revert if the selected node committee has not yet published a public key.\\n /// @param e3Id ID of the E3.\\n /// @param publicKey Public key of the committee.\\n /// @return success True if the E3 was successfully activated.\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish input data for Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 is not yet activated.\\n /// @dev This function MUST emit the InputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data to publish.\\n /// @return success True if the input was successfully published.\\n function publishInput(\\n uint256 e3Id,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish output data for an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the CiphertextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded output data to verify.\\n /// @param proof ABI encoded data to verify the ciphertextOutput.\\n /// @return success True if the output was successfully published.\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n /// @notice This function publishes the plaintext output of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the output has not been published.\\n /// @dev This function MUST emit the PlaintextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n /// @param proof ABI encoded data to verify the plaintextOutput.\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to set the maximum duration of requested computations.\\n /// @param _maxDuration The maximum duration of a computation in seconds.\\n /// @return success True if the max duration was successfully set.\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return e3 The struct representing the requested E3.\\n function getE3(uint256 e3Id) external view returns (E3 memory e3);\\n\\n /// @notice This function returns root of the input merkle tree for a given E3.\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return root The root of the input merkle tree.\\n function getInputRoot(uint256 e3Id) external view returns (uint256 root);\\n}\\n\",\"keccak256\":\"0x0c0e1ceded42a214489cdbb6d3cdeb7a7589f69750bd7fbd32f754d12d921f4b\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IInputValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IInputValidator {\\n /// @notice This function should be called by the Enclave contract to validate the\\n /// input of a computation.\\n /// @param sender The account that is submitting the input.\\n /// @param data The input to be verified.\\n /// @return input The decoded, policy-approved application payload.\\n function validate(\\n address sender,\\n bytes memory data\\n ) external returns (bytes memory input);\\n}\\n\",\"keccak256\":\"0x20d4016bd59c317c5571cfe6c3e8f46cbabddc0b926dc64019eeae8d29788653\",\"license\":\"LGPL-3.0-only\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523461047d57612ccb8038038061001981610498565b928339810160808282031261047d578151906001600160a01b0382169081830361047d5760208401516001600160a01b0381169081900361047d576040850151606086015190956001600160401b03821161047d57019082601f8301121561047d578151926001600160401b038411610482578360051b92602061009e818601610498565b809681520191602083958301019181831161047d5760208101935b838510610409575050600080516020612cab83398151915254604081901c60ff16159993509150506001600160401b03811680159081610401575b60011490816103f7575b1590816103ee575b506103dd576001600160401b03198116600117600080516020612cab833981519152557fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355291602091896103b2575b5061015d610556565b610165610556565b61016e336104e0565b610176610584565b80600155604051908152a1610189610584565b8015158061039d575b1561038957600080546001600160a01b031916821790556040519081527f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690602090a16101dd610584565b815160005b81811061032c5750506040519160208301906020845251809152604083019060408160051b85010192916000905b8282106102e9575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600080516020612c8b833981519152546001600160a01b0316036102d2575b50610276575b6040516126d090816105bb8239f35b68ff000000000000000019600080516020612cab8339815191525416600080516020612cab833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1610267565b6102e3906102de610584565b6104e0565b38610261565b9091929360208080600193603f198a82030186528851610314815180928185528580860191016104bd565b601f01601f1916010196019493919091019101610210565b8351811015610373578061035960208060019460051b8801015181604051938285809451938492016104bd565b810160098152030190208260ff19825416179055016101e2565b634e487b7160e01b600052603260045260246000fd5b6375ac4eb760e11b60005260045260246000fd5b506000546001600160a01b0316811415610192565b6001600160481b0319166801000000000000000117600080516020612cab8339815191525538610154565b63f92ee8a960e01b60005260046000fd5b90501538610106565b303b1591506100fe565b8991506100f4565b84516001600160401b03811161047d5782019083603f8301121561047d576020820151906001600160401b0382116104825761044e601f8301601f1916602001610498565b828152604084840101861061047d57610472602094938594604086850191016104bd565b8152019401936100b9565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761048257604052565b60005b8381106104d05750506000910152565b81810151838201526020016104c0565b6001600160a01b0316801561054057600080516020612c8b83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff600080516020612cab8339815191525460401c161561057357565b631afcd79f60e31b60005260046000fd5b600080516020612c8b833981519152546001600160a01b031633036105a557565b63118cdaa760e01b6000523360045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611c1d5780630ef81b2f14611be857806310bc628114611be85780634017daf014611afb578063406ed35c14611ac8578063459d929414611a665780634e92ec63146119d85780634fc7726414611938578063503f3288146116e65780635314e9fa1461155e5780636db5c8fd14611540578063715018a6146114a75780637edcd7ab1461124e5780638da5cb5b146112085780638dcdd86b146111e157806393b58f86146109ec5780639c8570c814610879578063b3c88d671461084d578063b68fd1be14610812578063b74cb2db146107f4578063c4ccafa2146107b5578063cb64961714610797578063cbd16872146106de578063cf0f34c4146106c0578063d016b08d1461028f578063ddef9ea11461025a578063f2fde38b1461022f578063fad8e111146102025763fd2f3d011461015b57600080fd5b346101fd5760203660031901126101fd576001600160a01b0361017c611f87565b61018461263b565b1680600052600460205260ff604060002054166101e9576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101fd5760203660031901126101fd576020610225610220611f87565b6125b0565b6040519015158152f35b346101fd5760203660031901126101fd5761025861024b611f87565b61025361263b565b61250a565b005b346101fd5760203660031901126101fd5760043560005260066020526040806000206001815491015482519182526020820152f35b346101fd5761029d36612027565b6102a682612151565b60a081016102b784825115156122a1565b51428111156106a857506103026000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611dde565b03925af180156105a757600090610623575b6103709150733333333C0A88F9BE4fd23ed0536F9B6c427e3B93602060405161033c81611cd9565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b8352600483016124dc565b0381845af49283156105a7576000936105ef575b50836000526007602052604060002061039d8154612394565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103e5576361c0541760e11b60005260046000fd5b836103fb576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105de57805491600182019283549360ff85116104e857600182018083116104e8576001861b106105ce575b84905585916000905b8582106104fe5750509061045760039392612394565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104e8577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104cf92604051938493606085526060850190611dde565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c16146000146105b3576020610552916040519061052282611cd9565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b8352600483016124dc565b0381855af480156105a757600090610572575b60019150935b0190610441565b6020823d821161059f575b8161058a60209383611cf5565b8101031261059c575060019051610565565b80fd5b3d915061057d565b6040513d6000823e3d90fd5b9280600191600052600286016020528460406000205561056b565b936105d890612394565b93610438565b6312c50cad60e11b60005260046000fd5b90926020823d60201161061b575b8161060a60209383611cf5565b8101031261059c5750519184610384565b3d91506105fd565b3d8082843e6106328184611cf5565b8201916020818403126106a05780519067ffffffffffffffff82116106a4570182601f820112156106a05780519161066983611f24565b936106776040519586611cf5565b8385526020848401011161059c5750829161069b9160208061037096019101611dbb565b610314565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101fd5760203660031901126101fd5760206102256004356124a0565b346101fd5760403660031901126101fd576004356024356001600160a01b0381168091036101fd577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161073361263b565b8015158281610775575b61074691612285565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b031682141590508261073d565b346101fd5760003660031901126101fd576020600254604051908152f35b346101fd5760203660031901126101fd576001600160a01b036107d6611f87565b166000526004602052602060ff604060002054166040519015158152f35b346101fd5760003660031901126101fd576020600354604051908152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd576102256108486020923690600401611f9d565b6123a3565b346101fd5760203660031901126101fd5760043560005260076020526020604060002054604051908152f35b346101fd5761088736612057565b9161089181612151565b9160a083016108a383825115156122a1565b514281116109d457506101808301516109bf5760206108f16000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a600485016122d5565b03925af19283156105a757602094600094610968575b508161095b916109387f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07194876122f1565b8460005260058752600d6040600020015560405191829187835287830190611dde565b0390a26040519015158152f35b61095b919450916109af7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d89116109b8575b6109a78183611cf5565b8101906122bd565b94915091610907565b503d61099d565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101fd57610a01611f87565b366064116101fd573660a4116101fd5760a43560c435916001600160a01b03831683036101fd5760e43567ffffffffffffffff81116101fd57610a48903690600401611f40565b906101043567ffffffffffffffff81116101fd57610a6a903690600401611f40565b90610a736120c2565b5034156111cc5760443563ffffffff8116908181036101fd575063ffffffff610a9a612339565b161115806111b6575b1561119857608435606435811015908161118d575b501561117c5783151580611170575b1561115b576001600160a01b038516600052600460205260ff604060002054161561113d57610b659060025493610afd85612394565b6002556040805160208101904482528783820152828152610b1f606082611cf5565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b536084840187611dde565b83810360031901606485015290611dde565b038160006001600160a01b038c165af19081156105a75760009384926110ec575b506000848152600860205260409020546001600160a01b0390811692610bae86851515612285565b169081156110d75760405195610bc387611cbc565b8652604094855198610bd5878b611cf5565b6000996024815b606482106110bf575050602089015243878901528651610bfc8882611cf5565b6064815b60a482106110af575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c5d8782611cf5565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110875750505060018201558385015160028201556060850151825b600281106110725750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610fb357610d166009840154611c82565b601f8111611041575b508890601f8311600114610fd257600e939291859183610fc7575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610fb3578190610de58454611c82565b601f8111610f7a575b508990601f8311600114610f17578592610f0c575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e546044840161235d565b5af1908115610f02578291610ee5575b5015610ed657507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610ed2959697845191829189835260608b840152610eb56060840189611e03565b958784015216930390a28080519586958652850152830190611e03565b0390f35b630d8dbe2560e01b8152600490fd5b610efc9150873d89116109b8576109a78183611cf5565b88610e64565b84513d84823e3d90fd5b015190508a80610e03565b8486528a86209250601f198416865b8c828210610f64575050908460019594939210610f4b575b505050811b019055610e18565b015160001960f88460031b161c191690558a8080610f3e565b6001859682939686015181550195019301610f26565b610fa3908587528b8720601f850160051c8101918d8610610fa9575b601f0160051c0190612322565b8b610dee565b9091508190610f96565b634e487b7160e01b84526041600452602484fd5b015190508b80610d3a565b9060098401855289852091855b8b601f198616821061102b575050918391600193600e9695601f19811610611012575b505050811b016009820155610d52565b015160001960f88460031b161c191690558b8080611002565b6001849582939585015181550194019201610fdf565b61106c906009850186528a8620601f850160051c8101918c8610610fa957601f0160051c0190612322565b8a610d1f565b81518382016003015590880190600101610c9e565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c7d565b8135815260209182019101610c00565b602080916110cc8461234c565b815201910190610bdc565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d604011611135575b8161110860409383611cf5565b810103126111315760208151910151936001600160a01b038516850361059c5750929088610b86565b8380fd5b3d91506110fb565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610ac7565b6308594fb760e01b60005260046000fd5b905042111586610ab8565b604051633744092160e21b81526044906111b46004820161235d565bfd5b5063ffffffff6111c4612339565b161515610aa3565b638c4fcd9360e01b6000523460045260246000fd5b346101fd5760003660031901126101fd5760206001600160a01b0360005416604051908152f35b346101fd5760003660031901126101fd5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101fd5761125c36612057565b611267839293612151565b6112778360a083015115156122a1565b61018081015115611492576101a08101515161147d576112c692916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b845288600485016122d5565b03915afa9182156105a75760009261145c575b506112e483836122f1565b806000526005602052600e6040600020019280519367ffffffffffffffff8511611446576020946113158254611c82565b601f8111611416575b5085601f821160011461138d5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261095b94600091611382575b508160011b916000199060031b1c19161790555b60405191829187835287830190611dde565b90508301518961135c565b601f1982169083600052806000209160005b8181106113ff57509261095b9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1699896106113e6575b5050811b019055611370565b85015160001960f88460031b161c1916905589806113da565b91928960018192868a01518155019401920161139f565b611440908360005287600020601f840160051c810191898510610fa957601f0160051c0190612322565b8661131e565b634e487b7160e01b600052604160045260246000fd5b61147691925060203d6020116109b8576109a78183611cf5565b90836112d9565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101fd5760003660031901126101fd576114c061263b565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101fd5760003660031901126101fd576020600154604051908152f35b346101fd5761156c36612027565b9061157681612151565b9060a08201516116d2576060820180515142106116c15760204291510151106116b05760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105a75760009361167c575b50835192602085019384200361166b57608001514201918242116104e8577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361165d918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611dde565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d6020116116a8575b8161169860209383611cf5565b810103126101fd575191846115d2565b3d915061168b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101fd5760803660031901126101fd576116ff611f87565b602435906001600160a01b03821682036101fd5760643567ffffffffffffffff81116101fd57611733903690600401611f9d565b917ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549260ff8460401c16159367ffffffffffffffff811680159081611930575b6001149081611926575b15908161191d575b5061190c5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556117fb926117f591866118cd575b506117d3612683565b6117db612683565b6117e43361250a565b6117ef6044356124a0565b506125b0565b506123a3565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036118bb575b5061183e57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6118c79061025361263b565b81611837565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055866117ca565b63f92ee8a960e01b60005260046000fd5b90501586611786565b303b15915061177e565b869150611774565b346101fd5760203660031901126101fd576001600160a01b03611959611f87565b61196161263b565b1680600052600460205260ff60406000205416156119c4576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101fd5760203660031901126101fd577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc6020600435611a1761263b565b8060005260088252611a39816001600160a01b03604060002054161515612285565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd5760ff611ab26020611a9f81943690600401611f40565b8160405193828580945193849201611dbb565b8101600981520301902054166040519015158152f35b346101fd5760203660031901126101fd57610ed2611ae7600435612151565b604051918291602083526020830190611e03565b346101fd5760203660031901126101fd57600435600052600560205260206040600020610ed28154916002810154600582015491600681015492600782015493611bc26001600160a01b03600885015416611b5860098601611d17565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611b8e600e600d8b01549a01611d17565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611dde565b9460e0880152610100870152610120860152610140850152838203610160850152611dde565b346101fd5760203660031901126101fd57600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101fd5760203660031901126101fd57600435806000526005602052611c57816001600160a01b036008604060002001541615156120a6565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b90600182811c92168015611cb2575b6020831014611c9c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611c91565b6101c0810190811067ffffffffffffffff82111761144657604052565b6040810190811067ffffffffffffffff82111761144657604052565b90601f8019910116810190811067ffffffffffffffff82111761144657604052565b9060405191826000825492611d2b84611c82565b8084529360018116908115611d995750600114611d52575b50611d5092500383611cf5565b565b90506000929192526020600020906000915b818310611d7d575050906020611d509282010138611d43565b6020919350806001915483858901015201910190918492611d64565b905060209250611d5094915060ff191682840152151560051b82010138611d43565b60005b838110611dce5750506000910152565b8181015183820152602001611dbe565b90602091611df781518092818552858086019101611dbb565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611f085750505060408101516060840152606081015192608081016000905b60028210611ef2575050611eef929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611e9d610100840151610200610140850152610200840190611dde565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611dde565b90565b6020806001928851815201960191019094611e3a565b60208060019263ffffffff865116815201930191019091611e17565b67ffffffffffffffff811161144657601f01601f191660200190565b81601f820112156101fd57803590611f5782611f24565b92611f656040519485611cf5565b828452602083830101116101fd57816000926020809301838601378301015290565b600435906001600160a01b03821682036101fd57565b9080601f830112156101fd5781359167ffffffffffffffff8311611446578260051b9060405193611fd16020840186611cf5565b8452602080850192820101918383116101fd5760208201905b838210611ff957505050505090565b813567ffffffffffffffff81116101fd5760209161201c87848094880101611f40565b815201910190611fea565b9060406003198301126101fd57600435916024359067ffffffffffffffff82116101fd57611eef91600401611f40565b60606003198201126101fd576004359160243567ffffffffffffffff81116101fd578261208691600401611f40565b916044359067ffffffffffffffff82116101fd57611eef91600401611f40565b156120ae5750565b63cd6f4a4f60e01b60005260045260246000fd5b604051906120cf82611cbc565b60606101a08360008152604080516120e78282611cf5565b8136823760208301526000818301528051906121038183611cf5565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b9061215a6120c2565b5081600052600560205260406000209160405161217681611cbc565b8354815260405163ffffffff6001860154818116835260201c1660208201526121a0604082611cf5565b6020820152600284015460408201526040518060038601906000905b6002821061226f57505050611d509291816121e060406001600160a01b0394611cf5565b606082015260058601546080820152600686015460a0820152600786015460c082015261225f600e836008890154169760e0840198895261222360098201611d17565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611d17565b6101a082015294511615156120a6565b60016020819285548152019301910190916121bc565b1561228d5750565b6381c4951960e01b60005260045260246000fd5b156122a95750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101fd575180151581036101fd5790565b611eef9392606092825260208201528160408201520190611dde565b156122f95750565b604051632f9f8ab960e01b81526020600482015290819061231e906024830190611dde565b0390fd5b81811061232d575050565b60008155600101612322565b60243563ffffffff811681036101fd5790565b359063ffffffff821682036101fd57565b6024906000905b6002821061237157505050565b60208060019263ffffffff6123858761234c565b16815201930191019091612364565b60001981146104e85760010190565b6123ab61263b565b805160005b81811061244357505060405190602082016020835281518091526040830190602060408260051b8601019301916000905b828210612418575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600190565b90919293602080612435600193603f198a82030186528851611dde565b9601920192019092916123e1565b825181101561248a578061247060208060019460051b870101518160405193828580945193849201611dbb565b810160098152030190208260ff19825416179055016123b0565b634e487b7160e01b600052603260045260246000fd5b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916124cc61263b565b80600155604051908152a1600190565b919060408301926000905b600282106124f457505050565b60208060019285518152019301910190916124e7565b6001600160a01b0316801561259a576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b03906125c161263b565b1680151580612626575b15612612576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b03600054168114156125cb565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361266e57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156126b257565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611c1d5780630ef81b2f14611be857806310bc628114611be85780634017daf014611afb578063406ed35c14611ac8578063459d929414611a665780634e92ec63146119d85780634fc7726414611938578063503f3288146116e65780635314e9fa1461155e5780636db5c8fd14611540578063715018a6146114a75780637edcd7ab1461124e5780638da5cb5b146112085780638dcdd86b146111e157806393b58f86146109ec5780639c8570c814610879578063b3c88d671461084d578063b68fd1be14610812578063b74cb2db146107f4578063c4ccafa2146107b5578063cb64961714610797578063cbd16872146106de578063cf0f34c4146106c0578063d016b08d1461028f578063ddef9ea11461025a578063f2fde38b1461022f578063fad8e111146102025763fd2f3d011461015b57600080fd5b346101fd5760203660031901126101fd576001600160a01b0361017c611f87565b61018461263b565b1680600052600460205260ff604060002054166101e9576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101fd5760203660031901126101fd576020610225610220611f87565b6125b0565b6040519015158152f35b346101fd5760203660031901126101fd5761025861024b611f87565b61025361263b565b61250a565b005b346101fd5760203660031901126101fd5760043560005260066020526040806000206001815491015482519182526020820152f35b346101fd5761029d36612027565b6102a682612151565b60a081016102b784825115156122a1565b51428111156106a857506103026000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611dde565b03925af180156105a757600090610623575b610370915073__$75f79a42d9bcbdbb69ad79ebd80f556f39$__602060405161033c81611cd9565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b8352600483016124dc565b0381845af49283156105a7576000936105ef575b50836000526007602052604060002061039d8154612394565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103e5576361c0541760e11b60005260046000fd5b836103fb576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105de57805491600182019283549360ff85116104e857600182018083116104e8576001861b106105ce575b84905585916000905b8582106104fe5750509061045760039392612394565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104e8577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104cf92604051938493606085526060850190611dde565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c16146000146105b3576020610552916040519061052282611cd9565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b8352600483016124dc565b0381855af480156105a757600090610572575b60019150935b0190610441565b6020823d821161059f575b8161058a60209383611cf5565b8101031261059c575060019051610565565b80fd5b3d915061057d565b6040513d6000823e3d90fd5b9280600191600052600286016020528460406000205561056b565b936105d890612394565b93610438565b6312c50cad60e11b60005260046000fd5b90926020823d60201161061b575b8161060a60209383611cf5565b8101031261059c5750519184610384565b3d91506105fd565b3d8082843e6106328184611cf5565b8201916020818403126106a05780519067ffffffffffffffff82116106a4570182601f820112156106a05780519161066983611f24565b936106776040519586611cf5565b8385526020848401011161059c5750829161069b9160208061037096019101611dbb565b610314565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101fd5760203660031901126101fd5760206102256004356124a0565b346101fd5760403660031901126101fd576004356024356001600160a01b0381168091036101fd577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161073361263b565b8015158281610775575b61074691612285565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b031682141590508261073d565b346101fd5760003660031901126101fd576020600254604051908152f35b346101fd5760203660031901126101fd576001600160a01b036107d6611f87565b166000526004602052602060ff604060002054166040519015158152f35b346101fd5760003660031901126101fd576020600354604051908152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd576102256108486020923690600401611f9d565b6123a3565b346101fd5760203660031901126101fd5760043560005260076020526020604060002054604051908152f35b346101fd5761088736612057565b9161089181612151565b9160a083016108a383825115156122a1565b514281116109d457506101808301516109bf5760206108f16000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a600485016122d5565b03925af19283156105a757602094600094610968575b508161095b916109387f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07194876122f1565b8460005260058752600d6040600020015560405191829187835287830190611dde565b0390a26040519015158152f35b61095b919450916109af7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d89116109b8575b6109a78183611cf5565b8101906122bd565b94915091610907565b503d61099d565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101fd57610a01611f87565b366064116101fd573660a4116101fd5760a43560c435916001600160a01b03831683036101fd5760e43567ffffffffffffffff81116101fd57610a48903690600401611f40565b906101043567ffffffffffffffff81116101fd57610a6a903690600401611f40565b90610a736120c2565b5034156111cc5760443563ffffffff8116908181036101fd575063ffffffff610a9a612339565b161115806111b6575b1561119857608435606435811015908161118d575b501561117c5783151580611170575b1561115b576001600160a01b038516600052600460205260ff604060002054161561113d57610b659060025493610afd85612394565b6002556040805160208101904482528783820152828152610b1f606082611cf5565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b536084840187611dde565b83810360031901606485015290611dde565b038160006001600160a01b038c165af19081156105a75760009384926110ec575b506000848152600860205260409020546001600160a01b0390811692610bae86851515612285565b169081156110d75760405195610bc387611cbc565b8652604094855198610bd5878b611cf5565b6000996024815b606482106110bf575050602089015243878901528651610bfc8882611cf5565b6064815b60a482106110af575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c5d8782611cf5565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110875750505060018201558385015160028201556060850151825b600281106110725750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610fb357610d166009840154611c82565b601f8111611041575b508890601f8311600114610fd257600e939291859183610fc7575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610fb3578190610de58454611c82565b601f8111610f7a575b508990601f8311600114610f17578592610f0c575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e546044840161235d565b5af1908115610f02578291610ee5575b5015610ed657507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610ed2959697845191829189835260608b840152610eb56060840189611e03565b958784015216930390a28080519586958652850152830190611e03565b0390f35b630d8dbe2560e01b8152600490fd5b610efc9150873d89116109b8576109a78183611cf5565b88610e64565b84513d84823e3d90fd5b015190508a80610e03565b8486528a86209250601f198416865b8c828210610f64575050908460019594939210610f4b575b505050811b019055610e18565b015160001960f88460031b161c191690558a8080610f3e565b6001859682939686015181550195019301610f26565b610fa3908587528b8720601f850160051c8101918d8610610fa9575b601f0160051c0190612322565b8b610dee565b9091508190610f96565b634e487b7160e01b84526041600452602484fd5b015190508b80610d3a565b9060098401855289852091855b8b601f198616821061102b575050918391600193600e9695601f19811610611012575b505050811b016009820155610d52565b015160001960f88460031b161c191690558b8080611002565b6001849582939585015181550194019201610fdf565b61106c906009850186528a8620601f850160051c8101918c8610610fa957601f0160051c0190612322565b8a610d1f565b81518382016003015590880190600101610c9e565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c7d565b8135815260209182019101610c00565b602080916110cc8461234c565b815201910190610bdc565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d604011611135575b8161110860409383611cf5565b810103126111315760208151910151936001600160a01b038516850361059c5750929088610b86565b8380fd5b3d91506110fb565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610ac7565b6308594fb760e01b60005260046000fd5b905042111586610ab8565b604051633744092160e21b81526044906111b46004820161235d565bfd5b5063ffffffff6111c4612339565b161515610aa3565b638c4fcd9360e01b6000523460045260246000fd5b346101fd5760003660031901126101fd5760206001600160a01b0360005416604051908152f35b346101fd5760003660031901126101fd5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101fd5761125c36612057565b611267839293612151565b6112778360a083015115156122a1565b61018081015115611492576101a08101515161147d576112c692916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b845288600485016122d5565b03915afa9182156105a75760009261145c575b506112e483836122f1565b806000526005602052600e6040600020019280519367ffffffffffffffff8511611446576020946113158254611c82565b601f8111611416575b5085601f821160011461138d5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261095b94600091611382575b508160011b916000199060031b1c19161790555b60405191829187835287830190611dde565b90508301518961135c565b601f1982169083600052806000209160005b8181106113ff57509261095b9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1699896106113e6575b5050811b019055611370565b85015160001960f88460031b161c1916905589806113da565b91928960018192868a01518155019401920161139f565b611440908360005287600020601f840160051c810191898510610fa957601f0160051c0190612322565b8661131e565b634e487b7160e01b600052604160045260246000fd5b61147691925060203d6020116109b8576109a78183611cf5565b90836112d9565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101fd5760003660031901126101fd576114c061263b565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101fd5760003660031901126101fd576020600154604051908152f35b346101fd5761156c36612027565b9061157681612151565b9060a08201516116d2576060820180515142106116c15760204291510151106116b05760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105a75760009361167c575b50835192602085019384200361166b57608001514201918242116104e8577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361165d918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611dde565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d6020116116a8575b8161169860209383611cf5565b810103126101fd575191846115d2565b3d915061168b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101fd5760803660031901126101fd576116ff611f87565b602435906001600160a01b03821682036101fd5760643567ffffffffffffffff81116101fd57611733903690600401611f9d565b917ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549260ff8460401c16159367ffffffffffffffff811680159081611930575b6001149081611926575b15908161191d575b5061190c5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556117fb926117f591866118cd575b506117d3612683565b6117db612683565b6117e43361250a565b6117ef6044356124a0565b506125b0565b506123a3565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036118bb575b5061183e57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6118c79061025361263b565b81611837565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055866117ca565b63f92ee8a960e01b60005260046000fd5b90501586611786565b303b15915061177e565b869150611774565b346101fd5760203660031901126101fd576001600160a01b03611959611f87565b61196161263b565b1680600052600460205260ff60406000205416156119c4576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101fd5760203660031901126101fd577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc6020600435611a1761263b565b8060005260088252611a39816001600160a01b03604060002054161515612285565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd5760ff611ab26020611a9f81943690600401611f40565b8160405193828580945193849201611dbb565b8101600981520301902054166040519015158152f35b346101fd5760203660031901126101fd57610ed2611ae7600435612151565b604051918291602083526020830190611e03565b346101fd5760203660031901126101fd57600435600052600560205260206040600020610ed28154916002810154600582015491600681015492600782015493611bc26001600160a01b03600885015416611b5860098601611d17565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611b8e600e600d8b01549a01611d17565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611dde565b9460e0880152610100870152610120860152610140850152838203610160850152611dde565b346101fd5760203660031901126101fd57600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101fd5760203660031901126101fd57600435806000526005602052611c57816001600160a01b036008604060002001541615156120a6565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b90600182811c92168015611cb2575b6020831014611c9c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611c91565b6101c0810190811067ffffffffffffffff82111761144657604052565b6040810190811067ffffffffffffffff82111761144657604052565b90601f8019910116810190811067ffffffffffffffff82111761144657604052565b9060405191826000825492611d2b84611c82565b8084529360018116908115611d995750600114611d52575b50611d5092500383611cf5565b565b90506000929192526020600020906000915b818310611d7d575050906020611d509282010138611d43565b6020919350806001915483858901015201910190918492611d64565b905060209250611d5094915060ff191682840152151560051b82010138611d43565b60005b838110611dce5750506000910152565b8181015183820152602001611dbe565b90602091611df781518092818552858086019101611dbb565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611f085750505060408101516060840152606081015192608081016000905b60028210611ef2575050611eef929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611e9d610100840151610200610140850152610200840190611dde565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611dde565b90565b6020806001928851815201960191019094611e3a565b60208060019263ffffffff865116815201930191019091611e17565b67ffffffffffffffff811161144657601f01601f191660200190565b81601f820112156101fd57803590611f5782611f24565b92611f656040519485611cf5565b828452602083830101116101fd57816000926020809301838601378301015290565b600435906001600160a01b03821682036101fd57565b9080601f830112156101fd5781359167ffffffffffffffff8311611446578260051b9060405193611fd16020840186611cf5565b8452602080850192820101918383116101fd5760208201905b838210611ff957505050505090565b813567ffffffffffffffff81116101fd5760209161201c87848094880101611f40565b815201910190611fea565b9060406003198301126101fd57600435916024359067ffffffffffffffff82116101fd57611eef91600401611f40565b60606003198201126101fd576004359160243567ffffffffffffffff81116101fd578261208691600401611f40565b916044359067ffffffffffffffff82116101fd57611eef91600401611f40565b156120ae5750565b63cd6f4a4f60e01b60005260045260246000fd5b604051906120cf82611cbc565b60606101a08360008152604080516120e78282611cf5565b8136823760208301526000818301528051906121038183611cf5565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b9061215a6120c2565b5081600052600560205260406000209160405161217681611cbc565b8354815260405163ffffffff6001860154818116835260201c1660208201526121a0604082611cf5565b6020820152600284015460408201526040518060038601906000905b6002821061226f57505050611d509291816121e060406001600160a01b0394611cf5565b606082015260058601546080820152600686015460a0820152600786015460c082015261225f600e836008890154169760e0840198895261222360098201611d17565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611d17565b6101a082015294511615156120a6565b60016020819285548152019301910190916121bc565b1561228d5750565b6381c4951960e01b60005260045260246000fd5b156122a95750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101fd575180151581036101fd5790565b611eef9392606092825260208201528160408201520190611dde565b156122f95750565b604051632f9f8ab960e01b81526020600482015290819061231e906024830190611dde565b0390fd5b81811061232d575050565b60008155600101612322565b60243563ffffffff811681036101fd5790565b359063ffffffff821682036101fd57565b6024906000905b6002821061237157505050565b60208060019263ffffffff6123858761234c565b16815201930191019091612364565b60001981146104e85760010190565b6123ab61263b565b805160005b81811061244357505060405190602082016020835281518091526040830190602060408260051b8601019301916000905b828210612418575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600190565b90919293602080612435600193603f198a82030186528851611dde565b9601920192019092916123e1565b825181101561248a578061247060208060019460051b870101518160405193828580945193849201611dbb565b810160098152030190208260ff19825416179055016123b0565b634e487b7160e01b600052603260045260246000fd5b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916124cc61263b565b80600155604051908152a1600190565b919060408301926000905b600282106124f457505050565b60208060019285518152019301910190916124e7565b6001600160a01b0316801561259a576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b03906125c161263b565b1680151580612626575b15612612576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b03600054168114156125cb565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361266e57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156126b257565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a", + "libraries": { + "PoseidonT3": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" + }, + "devdoc": { + "errors": { + "InvalidInitialization()": [ + { + "details": "The contract is already initialized." + } + ], + "NotInitializing()": [ + { + "details": "The contract is not initializing." + } + ], + "OwnableInvalidOwner(address)": [ + { + "details": "The owner is not a valid owner account. (eg. `address(0)`)" + } + ], + "OwnableUnauthorizedAccount(address)": [ + { + "details": "The caller account is not authorized to perform an operation." + } + ] + }, + "events": { + "AllowedE3ProgramsParamsSet(bytes[])": { + "params": { + "e3ProgramParams": "Array of encoded encryption scheme parameters (e.g, for BFV)" + } + }, + "CiphernodeRegistrySet(address)": { + "params": { + "ciphernodeRegistry": "The address of the CiphernodeRegistry contract." + } + }, + "CiphertextOutputPublished(uint256,bytes)": { + "params": { + "ciphertextOutput": "ABI encoded ciphertext output.", + "e3Id": "ID of the E3." + } + }, + "E3Activated(uint256,uint256,bytes)": { + "params": { + "committeePublicKey": "Public key of the committee.", + "e3Id": "ID of the E3.", + "expiration": "Timestamp when committee duties expire." + } + }, + "E3ProgramDisabled(address)": { + "params": { + "e3Program": "The address of the E3 Program." + } + }, + "E3ProgramEnabled(address)": { + "params": { + "e3Program": "The address of the E3 Program." + } + }, + "E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)": { + "params": { + "e3": "Details of the E3.", + "e3Id": "ID of the E3.", + "e3Program": "Address of the Computation module selected.", + "filter": "Address of the pool of nodes from which the Cipher Node committee was selected." + } + }, + "EncryptionSchemeDisabled(bytes32)": { + "params": { + "encryptionSchemeId": "The ID of the encryption scheme that was disabled." + } + }, + "EncryptionSchemeEnabled(bytes32)": { + "params": { + "encryptionSchemeId": "The ID of the encryption scheme that was enabled." + } + }, + "Initialized(uint64)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "InputPublished(uint256,bytes,uint256,uint256)": { + "params": { + "data": "ABI encoded input data.", + "e3Id": "ID of the E3." + } + }, + "MaxDurationSet(uint256)": { + "params": { + "maxDuration": "The maximum duration of a computation in seconds." + } + }, + "PlaintextOutputPublished(uint256,bytes)": { + "params": { + "e3Id": "ID of the E3.", + "plaintextOutput": "ABI encoded plaintext output." + } + } + }, + "kind": "dev", + "methods": { + "activate(uint256,bytes)": { + "details": "This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.", + "params": { + "e3Id": "ID of the E3.", + "publicKey": "Public key of the committee." + }, + "returns": { + "success": "True if the E3 was successfully activated." + } + }, + "constructor": { + "params": { + "_e3ProgramsParams": "Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)", + "_maxDuration": "The maximum duration of a computation in seconds", + "_owner": "The owner of this contract" + } + }, + "getE3(uint256)": { + "details": "This function MUST revert if the E3 does not exist.", + "params": { + "e3Id": "ID of the E3." + }, + "returns": { + "e3": "The struct representing the requested E3." + } + }, + "getInputRoot(uint256)": { + "details": "This function MUST revert if the E3 does not exist.", + "params": { + "e3Id": "ID of the E3." + }, + "returns": { + "_0": "The root of the input merkle tree." + } + }, + "initialize(address,address,uint256,bytes[])": { + "params": { + "_ciphernodeRegistry": "The address of the ciphernode registry", + "_e3ProgramsParams": "Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)", + "_maxDuration": "The maximum duration of a computation in seconds", + "_owner": "The owner of this contract" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "publishCiphertextOutput(uint256,bytes,bytes)": { + "details": "This function MUST emit the CiphertextOutputPublished event.", + "params": { + "ciphertextOutput": "ABI encoded output data to verify.", + "e3Id": "ID of the E3.", + "proof": "ABI encoded data to verify the ciphertextOutput." + }, + "returns": { + "success": "True if the output was successfully published." + } + }, + "publishInput(uint256,bytes)": { + "details": "This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.", + "params": { + "data": "ABI encoded input data to publish.", + "e3Id": "ID of the E3." + }, + "returns": { + "success": "True if the input was successfully published." + } + }, + "publishPlaintextOutput(uint256,bytes,bytes)": { + "details": "This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.", + "params": { + "e3Id": "ID of the E3.", + "plaintextOutput": "ABI encoded plaintext output.", + "proof": "ABI encoded data to verify the plaintextOutput." + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)": { + "details": "This function MUST emit the E3Requested event.", + "params": { + "computeProviderParams": "ABI encoded compute provider parameters.", + "duration": "The duration of the computation in seconds.", + "e3Program": "Address of the E3 Program.", + "e3ProgramParams": "ABI encoded computation parameters.", + "filter": "IDs of the pool of nodes from which to select the committee.", + "threshold": "The M/N threshold for the committee." + }, + "returns": { + "e3": "The E3 struct.", + "e3Id": "ID of the E3." + } + }, + "setMaxDuration(uint256)": { + "params": { + "_maxDuration": "The maximum duration of a computation in seconds." + }, + "returns": { + "success": "True if the max duration was successfully set." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "events": { + "AllowedE3ProgramsParamsSet(bytes[])": { + "notice": "Emitted when the allowed E3 encryption scheme parameters are configured." + }, + "CiphernodeRegistrySet(address)": { + "notice": "This event MUST be emitted any time the CiphernodeRegistry is set." + }, + "CiphertextOutputPublished(uint256,bytes)": { + "notice": "This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published." + }, + "E3Activated(uint256,uint256,bytes)": { + "notice": "This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated." + }, + "E3ProgramDisabled(address)": { + "notice": "This event MUST be emitted any time a E3 Program is disabled." + }, + "E3ProgramEnabled(address)": { + "notice": "This event MUST be emitted any time a E3 Program is enabled." + }, + "E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)": { + "notice": "This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested." + }, + "EncryptionSchemeDisabled(bytes32)": { + "notice": "This event MUST be emitted any time an encryption scheme is disabled." + }, + "EncryptionSchemeEnabled(bytes32)": { + "notice": "The event MUST be emitted any time an encryption scheme is enabled." + }, + "InputPublished(uint256,bytes,uint256,uint256)": { + "notice": "This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published." + }, + "MaxDurationSet(uint256)": { + "notice": "This event MUST be emitted any time the `maxDuration` is set." + }, + "PlaintextOutputPublished(uint256,bytes)": { + "notice": "This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published." + } + }, + "kind": "user", + "methods": { + "activate(uint256,bytes)": { + "notice": "This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input." + }, + "e3ProgramsParams(bytes)": { + "notice": "Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV)." + }, + "getE3(uint256)": { + "notice": "This function should be called to retrieve the details of an Encrypted Execution Environment (E3)." + }, + "getInputRoot(uint256)": { + "notice": "This function returns root of the input merkle tree for a given E3." + }, + "publishCiphertextOutput(uint256,bytes,bytes)": { + "notice": "This function should be called to publish output data for an Encrypted Execution Environment (E3)." + }, + "publishInput(uint256,bytes)": { + "notice": "This function should be called to publish input data for Encrypted Execution Environment (E3)." + }, + "publishPlaintextOutput(uint256,bytes,bytes)": { + "notice": "This function publishes the plaintext output of an Encrypted Execution Environment (E3)." + }, + "request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)": { + "notice": "This function should be called to request a computation within an Encrypted Execution Environment (E3)." + }, + "setMaxDuration(uint256)": { + "notice": "This function should be called to set the maximum duration of requested computations." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 1396, + "contract": "contracts/Enclave.sol:Enclave", + "label": "ciphernodeRegistry", + "offset": 0, + "slot": "0", + "type": "t_contract(ICiphernodeRegistry)2611" + }, + { + "astId": 1398, + "contract": "contracts/Enclave.sol:Enclave", + "label": "maxDuration", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 1400, + "contract": "contracts/Enclave.sol:Enclave", + "label": "nexte3Id", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 1402, + "contract": "contracts/Enclave.sol:Enclave", + "label": "requests", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 1407, + "contract": "contracts/Enclave.sol:Enclave", + "label": "e3Programs", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_contract(IE3Program)2705,t_bool)" + }, + { + "astId": 1412, + "contract": "contracts/Enclave.sol:Enclave", + "label": "e3s", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(E3)2671_storage)" + }, + { + "astId": 1417, + "contract": "contracts/Enclave.sol:Enclave", + "label": "inputs", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint256,t_struct(LeanIMTData)532_storage)" + }, + { + "astId": 1421, + "contract": "contracts/Enclave.sol:Enclave", + "label": "inputCounts", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 1426, + "contract": "contracts/Enclave.sol:Enclave", + "label": "decryptionVerifiers", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2626)" + }, + { + "astId": 1431, + "contract": "contracts/Enclave.sol:Enclave", + "label": "e3ProgramsParams", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_bytes_memory_ptr,t_bool)" + } + ], + "types": { + "t_array(t_uint256)2_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[2]", + "numberOfBytes": "64" + }, + "t_array(t_uint32)2_storage": { + "base": "t_uint32", + "encoding": "inplace", + "label": "uint32[2]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_memory_ptr": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(ICiphernodeRegistry)2611": { + "encoding": "inplace", + "label": "contract ICiphernodeRegistry", + "numberOfBytes": "20" + }, + "t_contract(IDecryptionVerifier)2626": { + "encoding": "inplace", + "label": "contract IDecryptionVerifier", + "numberOfBytes": "20" + }, + "t_contract(IE3Program)2705": { + "encoding": "inplace", + "label": "contract IE3Program", + "numberOfBytes": "20" + }, + "t_contract(IInputValidator)2906": { + "encoding": "inplace", + "label": "contract IInputValidator", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2626)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => contract IDecryptionVerifier)", + "numberOfBytes": "32", + "value": "t_contract(IDecryptionVerifier)2626" + }, + "t_mapping(t_bytes_memory_ptr,t_bool)": { + "encoding": "mapping", + "key": "t_bytes_memory_ptr", + "label": "mapping(bytes => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_contract(IE3Program)2705,t_bool)": { + "encoding": "mapping", + "key": "t_contract(IE3Program)2705", + "label": "mapping(contract IE3Program => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_uint256,t_struct(E3)2671_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct E3)", + "numberOfBytes": "32", + "value": "t_struct(E3)2671_storage" + }, + "t_mapping(t_uint256,t_struct(LeanIMTData)532_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct LeanIMTData)", + "numberOfBytes": "32", + "value": "t_struct(LeanIMTData)532_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(E3)2671_storage": { + "encoding": "inplace", + "label": "struct E3", + "members": [ + { + "astId": 2637, + "contract": "contracts/Enclave.sol:Enclave", + "label": "seed", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 2641, + "contract": "contracts/Enclave.sol:Enclave", + "label": "threshold", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint32)2_storage" + }, + { + "astId": 2643, + "contract": "contracts/Enclave.sol:Enclave", + "label": "requestBlock", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 2647, + "contract": "contracts/Enclave.sol:Enclave", + "label": "startWindow", + "offset": 0, + "slot": "3", + "type": "t_array(t_uint256)2_storage" + }, + { + "astId": 2649, + "contract": "contracts/Enclave.sol:Enclave", + "label": "duration", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 2651, + "contract": "contracts/Enclave.sol:Enclave", + "label": "expiration", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 2653, + "contract": "contracts/Enclave.sol:Enclave", + "label": "encryptionSchemeId", + "offset": 0, + "slot": "7", + "type": "t_bytes32" + }, + { + "astId": 2656, + "contract": "contracts/Enclave.sol:Enclave", + "label": "e3Program", + "offset": 0, + "slot": "8", + "type": "t_contract(IE3Program)2705" + }, + { + "astId": 2658, + "contract": "contracts/Enclave.sol:Enclave", + "label": "e3ProgramParams", + "offset": 0, + "slot": "9", + "type": "t_bytes_storage" + }, + { + "astId": 2661, + "contract": "contracts/Enclave.sol:Enclave", + "label": "inputValidator", + "offset": 0, + "slot": "10", + "type": "t_contract(IInputValidator)2906" + }, + { + "astId": 2664, + "contract": "contracts/Enclave.sol:Enclave", + "label": "decryptionVerifier", + "offset": 0, + "slot": "11", + "type": "t_contract(IDecryptionVerifier)2626" + }, + { + "astId": 2666, + "contract": "contracts/Enclave.sol:Enclave", + "label": "committeePublicKey", + "offset": 0, + "slot": "12", + "type": "t_bytes32" + }, + { + "astId": 2668, + "contract": "contracts/Enclave.sol:Enclave", + "label": "ciphertextOutput", + "offset": 0, + "slot": "13", + "type": "t_bytes32" + }, + { + "astId": 2670, + "contract": "contracts/Enclave.sol:Enclave", + "label": "plaintextOutput", + "offset": 0, + "slot": "14", + "type": "t_bytes_storage" + } + ], + "numberOfBytes": "480" + }, + "t_struct(LeanIMTData)532_storage": { + "encoding": "inplace", + "label": "struct LeanIMTData", + "members": [ + { + "astId": 521, + "contract": "contracts/Enclave.sol:Enclave", + "label": "size", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 523, + "contract": "contracts/Enclave.sol:Enclave", + "label": "depth", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 527, + "contract": "contracts/Enclave.sol:Enclave", + "label": "sideNodes", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 531, + "contract": "contracts/Enclave.sol:Enclave", + "label": "leaves", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_uint256,t_uint256)" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + } +} \ No newline at end of file diff --git a/examples/basic/client/src/globals.css b/examples/basic/client/src/globals.css new file mode 100644 index 0000000000..f51899eaa6 --- /dev/null +++ b/examples/basic/client/src/globals.css @@ -0,0 +1,314 @@ +@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800&display=swap'); +@tailwind base; +@tailwind utilities; +@tailwind components; + +body, +html { + margin: 0; + padding: 0; + overflow-x: hidden; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +footer { + margin-top: auto; +} + +@layer components { + .toast-alert { + @apply translate-x-[-10rem] opacity-0; /* Start off-screen to the left */ + animation: slideIn 0.5s forwards; + } + + @keyframes slideIn { + from { + opacity: 0; + transform: translateX(-10rem); /* Start from -10rem on the X axis */ + } + to { + opacity: 1; + transform: translateX(0); /* End at 0 on the X axis */ + } + } +} + +@layer base { + /* Global Styles */ + + body { + @apply transition-element bg-slate-200 p-0 font-jakarta text-slate-600; + } + + img { + @apply max-w-full select-none; + -webkit-user-drag: none; + user-drag: none; + -webkit-touch-callout: none; + } + + button, + input { + @apply focus:outline-none; + } + + ol, + ul { + list-style: initial; + } + + select { + @apply outline-none focus:outline-none; + } + + /* Headings & Subtitles */ + h1 { + @apply text-4xl font-bold md:text-6xl; + } + + h2 { + @apply text-3xl font-bold md:text-5xl; + } + + h3 { + @apply text-2xl font-bold md:text-4xl; + } + + h4 { + @apply text-lg font-semibold leading-tight md:text-xl; + } + + h5 { + @apply text-[20px] text-lg font-semibold; + } + + h6 { + @apply text-[20px] text-lg font-medium; + } + + p { + @apply !block whitespace-pre-line text-base font-normal; + } + + .subtitle1 { + @apply font-jakarta text-base font-light text-zinc-400; + } + + .subtitle2 { + @apply text-2xl font-semibold; + } + + .subtext { + @apply font-jakarta text-sm font-normal; + } + + /* Remove Input Arrows & Search X */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + input[type='search']::-webkit-search-decoration, + input[type='search']::-webkit-search-cancel-button, + input[type='search']::-webkit-search-results-button, + input[type='search']::-webkit-search-results-decoration { + -webkit-appearance: none; + } + input[type='number'] { + -moz-appearance: textfield; + } + + /* Selection Color */ + ::selection { + @apply bg-blue-500; + } + + ::-moz-selection { + @apply bg-blue-500; + } +} + +@layer components { + /* Buttons */ + .button-primary { + @apply button-styles border-lime-600/80 bg-lime-400 text-white active:bg-lime-600 active:text-white/70 enabled:shadow-button enabled:hover:bg-lime-500 active:enabled:translate-y-1 active:enabled:shadow-sm disabled:cursor-not-allowed disabled:border-gray-500 disabled:bg-slate-200 disabled:text-gray-500 disabled:shadow-none; + } + + .button-outlined { + @apply button-styles border-lime-400 bg-white text-lime-400 active:bg-lime-200 active:text-lime-400/70 enabled:shadow-button-outlined enabled:hover:bg-lime-100 active:enabled:translate-y-1 active:enabled:shadow-sm disabled:border-gray-500/30 disabled:bg-slate-200 disabled:text-gray-500/30 disabled:shadow-none; + } + + .button-connect { + @apply button h-12 w-full text-lg; + } + + .button-max { + @apply h-[46px] w-auto rounded-2xl px-6; + } + + .button-cancel { + @apply button-styles border-red h-9 border-2 px-3.5 py-2 text-[15px] font-medium; + } + + /* Inputs & Selects */ + .dropdown-select { + @apply flex h-12 cursor-pointer items-center gap-2.5 rounded-full bg-zinc-700 bg-[url('/assets/icons/caret.svg')] bg-[right_16px_center] bg-no-repeat py-4 pl-4 pr-9 text-sm; + } + + /* opacity-5 transition-all duration-300 ease-in-out placeholder:text-slate-600/50 focus:border-slate-600 focus:bg-opacity-20 focus:outline-none */ + .input { + @apply flex h-12 w-full items-center rounded-lg border-2 border-slate-600/20 bg-slate-300/10 px-4 py-2 font-jakarta text-slate-600 focus:border-slate-300 focus:bg-white; + } + + .input-search { + @apply input bg-zinc-800 bg-[url('/assets/icons/search.svg')] bg-[left_16px_center] bg-no-repeat py-3 pl-12 pr-4; + } + + /* Cards */ + .card { + @apply flex flex-col rounded-2xl bg-zinc-800 p-8; + } + + .card-dropdown { + @apply flex flex-col rounded-2xl bg-zinc-700 p-6 shadow; + } + + /* Icons */ + .external-icon { + @apply icon h-[14px] w-[14px] bg-[url('./assets/icons/arrow.svg')]; + } + .close-icon { + @apply icon h-[18px] w-[18px] bg-[url('./assets/icons/close.svg')]; + } + + /* Modals */ + .modal-overlay { + @apply side-padding fixed left-0 top-0 z-50 flex h-full w-full flex-col items-center justify-center bg-zinc-950/50 backdrop-blur-sm; + } + + /* Misc */ + .menu-item { + @apply flex h-12 cursor-pointer items-center gap-2 p-4 text-lg font-medium hover:rounded-lg hover:bg-emerald-900/20; + } + + .menu-text { + @apply text-zinc-300 group-hover:text-emerald-400; + } + + .truncate-2-lines { + @apply truncate-lines; + -webkit-line-clamp: 2; + } + + .page-number { + @apply flex h-6 w-6 cursor-pointer items-center justify-center; + } +} + +@layer utilities { + .button-styles { + @apply flex h-12 items-center justify-center rounded-2xl border-2 px-4 py-1 font-jakarta text-base font-extrabold uppercase leading-none tracking-custom transition-all duration-300 ease-in-out enabled:cursor-pointer; + } + + .icon { + @apply cursor-pointer bg-contain bg-center bg-no-repeat; + } + + .transition-element { + @apply transition-all duration-75 ease-linear; + } + + .side-padding { + @apply px-[5%] md:px-[10%]; + } + + .line { + @apply h-px w-full bg-slate-200; + } + + .icon-placeholder { + @apply h-6 w-6 rounded-full bg-white/50; + } + + .h-screen-minus-header { + height: calc(100vh - 16px); + } + + .h-screen-minus-header-footer { + height: calc(100vh - 156px); + } + + .footer-fixed { + @apply fixed inset-x-0 bottom-0; + } + + .footer-dynamic { + @apply relative mt-auto; + } + + .truncate-lines { + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + } + + .show-scrollbar { + overflow-y: scroll !important; + } + + .hide-scrollbar { + overflow: hidden !important; + } +} + +._1n3pr306 svg g { + fill: #65a30d !important; +} + +/* Custom Scrollbar */ +/* Firefox */ +/* \* { + scrollbar-width: thin; + scrollbar-color: #6b6b6b transparent; +} */ + +/* Chrome, Edge, and Safari */ +/* html::-webkit-scrollbar, +body::-webkit-scrollbar { + width: 9px !important; +} + +::-webkit-scrollbar { + width: 12px; +} + +::-webkit-scrollbar-track { + background: transparent; + margin-right: 4px; +} + +html::-webkit-scrollbar-thumb, +body::-webkit-scrollbar-thumb { + border: none !important; + transition: all 0.4s; + -moz-transition: all 0.4s; + -webkit-transition: all 0.4s; +} + +::-webkit-scrollbar-thumb { + border-right: 4px transparent solid; + background-clip: padding-box; + border-radius: 8px; + background-color: #6b6b6b; + padding-top: 8px; + transition: all 0.4s; + -moz-transition: all 0.4s; + -webkit-transition: all 0.4s; +} + +::-webkit-scrollbar-thumb:hover { + background-color: #4c4b4b; +} */ diff --git a/examples/basic/client/src/hooks/useEnclaveContract.ts b/examples/basic/client/src/hooks/useEnclaveContract.ts new file mode 100644 index 0000000000..38b9130103 --- /dev/null +++ b/examples/basic/client/src/hooks/useEnclaveContract.ts @@ -0,0 +1,268 @@ +import { useState, useEffect, useRef } from 'react' +import { useWriteContract, useWaitForTransactionReceipt, useConfig } from 'wagmi' +import { watchContractEvent } from '@wagmi/core' +import { parseEther, bytesToHex } from 'viem' +import { ENCLAVE_ADDRESS, ENCLAVE_ABI, E3_PROGRAM_ADDRESS, REGISTRY_ADDRESS, FILTER_REGISTRY_ADDRESS, REGISTRY_ABI } from '@/utils/enclave.config' +import { + encodeBfvParams, + encodeComputeProviderParams, + calculateStartWindow, + DEFAULT_COMPUTE_PROVIDER_PARAMS, + DEFAULT_E3_CONFIG +} from '@/utils/bfv' + +export interface E3RequestParams { + threshold?: [number, number] + windowSize?: number + duration?: number + paymentAmount?: string +} + +export interface E3State { + id: bigint | null + isRequested: boolean + isCommitteePublished: boolean + isActivated: boolean + publicKey: `0x${string}` | null + expiresAt: bigint | null + plaintextOutput: string | null + hasPlaintextOutput: boolean +} + +export const useEnclaveContract = () => { + const [e3State, setE3State] = useState({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false + }) + + const config = useConfig() + const unsubscribersRef = useRef void>>([]) + + const { + data: txHash, + writeContract, + error: writeError, + isPending: isWritePending, + } = useWriteContract() + + const { isLoading: isConfirming, isSuccess: isConfirmed } = useWaitForTransactionReceipt({ + hash: txHash, + }) + + // Set up event watchers to listen for blockchain events + useEffect(() => { + // Clean up previous watchers + unsubscribersRef.current.forEach(unsubscribe => unsubscribe()) + unsubscribersRef.current = [] + + // Listen for E3Requested events + const e3RequestedUnsubscribe = watchContractEvent(config, { + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + eventName: 'E3Requested', + chainId: 31337, + onLogs(logs) { + logs.forEach((log) => { + const { e3Id } = (log as any).args + if (e3Id) { + setE3State(prev => ({ + ...prev, + id: e3Id, + isRequested: true + })) + } + }) + } + }) + + // Listen for CommitteePublished events from the Registry + const committeePublishedUnsubscribe = watchContractEvent(config, { + address: REGISTRY_ADDRESS as `0x${string}`, + abi: REGISTRY_ABI, + eventName: 'CommitteePublished', + chainId: 31337, + onLogs(logs) { + logs.forEach((log) => { + const { e3Id, publicKey } = (log as any).args + setE3State(prevState => { + if (e3Id && prevState.id && e3Id === prevState.id && !prevState.isCommitteePublished) { + return { + ...prevState, + isCommitteePublished: true, + publicKey: publicKey as `0x${string}` + } + } + return prevState + }) + }) + } + }) + + // Listen for E3Activated events + const e3ActivatedUnsubscribe = watchContractEvent(config, { + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + eventName: 'E3Activated', + chainId: 31337, + onLogs(logs) { + logs.forEach((log) => { + const { e3Id, expiration } = (log as any).args + setE3State(prevState => { + if (e3Id && prevState.id && e3Id === prevState.id) { + return { + ...prevState, + isActivated: true, + expiresAt: expiration || null + } + } + return prevState + }) + }) + } + }) + + // Listen for PlaintextOutputPublished events + const plaintextOutputUnsubscribe = watchContractEvent(config, { + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + eventName: 'PlaintextOutputPublished', + chainId: 31337, + onLogs(logs) { + logs.forEach((log) => { + const { e3Id, plaintextOutput } = (log as any).args + setE3State(prevState => { + if (e3Id && prevState.id && e3Id === prevState.id) { + return { + ...prevState, + plaintextOutput: plaintextOutput as string, + hasPlaintextOutput: true + } + } + return prevState + }) + }) + } + }) + + // Store unsubscribers for cleanup + unsubscribersRef.current = [ + e3RequestedUnsubscribe, + committeePublishedUnsubscribe, + e3ActivatedUnsubscribe, + plaintextOutputUnsubscribe + ] + + // Cleanup on unmount + return () => { + unsubscribersRef.current.forEach(unsubscribe => unsubscribe()) + unsubscribersRef.current = [] + } + }, [config]) + + const requestComputation = async (params: E3RequestParams = {}) => { + // Reset E3 state for new request + setE3State({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false + }) + + try { + // Prepare parameters with defaults + const threshold: [number, number] = params.threshold || [DEFAULT_E3_CONFIG.threshold_min, DEFAULT_E3_CONFIG.threshold_max] + const startWindow = calculateStartWindow(params.windowSize) + const duration = BigInt(params.duration || DEFAULT_E3_CONFIG.duration) + const paymentAmount = params.paymentAmount || "0.001" + + // Encode parameters for the smart contract + const e3ProgramParams = encodeBfvParams() + const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) + + // Make the contract call + writeContract({ + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + functionName: 'request', + args: [ + FILTER_REGISTRY_ADDRESS as `0x${string}`, + threshold as [number, number], + startWindow, + duration, + E3_PROGRAM_ADDRESS as `0x${string}`, + e3ProgramParams, + computeProviderParams + ], + value: parseEther(paymentAmount) + }) + + } catch (error: any) { + console.error('Failed to request computation:', error) + } + } + + const activateE3 = async () => { + if (!e3State.id || !e3State.publicKey) { + console.error('Cannot activate: Missing E3 ID or public key') + return + } + + try { + writeContract({ + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + functionName: 'activate', + args: [e3State.id, e3State.publicKey] + }) + } catch (error: any) { + console.error('Failed to activate E3:', error) + } + } + + const publishInput = async (encryptedData: Uint8Array) => { + if (!e3State.id) { + console.error('Cannot publish input: Missing E3 ID') + return + } + + if (!e3State.isActivated) { + console.error('Cannot publish input: E3 is not activated') + return + } + + try { + const hexData = bytesToHex(encryptedData) + + writeContract({ + address: ENCLAVE_ADDRESS as `0x${string}`, + abi: ENCLAVE_ABI, + functionName: 'publishInput', + args: [e3State.id, hexData], + gas: 2000000n + }) + } catch (error: any) { + console.error('Failed to publish input:', error) + } + } + + return { + requestComputation, + activateE3, + publishInput, + e3State, + isRequesting: isWritePending || isConfirming, + isSuccess: isConfirmed, + error: writeError, + transactionHash: txHash + } +} \ No newline at end of file diff --git a/examples/basic/client/src/hooks/useWebAssembly.tsx b/examples/basic/client/src/hooks/useWebAssembly.tsx new file mode 100644 index 0000000000..8d5014a830 --- /dev/null +++ b/examples/basic/client/src/hooks/useWebAssembly.tsx @@ -0,0 +1,41 @@ +import { useState, useEffect } from 'react' +import init, { Encrypt } from 'libs/wasm/pkg/wasm_crypto' + +export const useWebAssemblyHook = () => { + const [isLoaded, setIsLoaded] = useState(false) + + useEffect(() => { + const loadWasm = async () => { + try { + await init() + setIsLoaded(true) + console.log('WASM module loaded') + } catch (error) { + console.error('Failed to load WASM module:', error) + } + } + loadWasm() + }, []) + + const encryptInput = async (value: bigint, publicKey: Uint8Array): Promise => { + if (!isLoaded) { + console.error('WASM module not loaded yet') + return null + } + + try { + console.log('Encrypting input') + const encryptor = new Encrypt() + const result = encryptor.encrypt(value, publicKey) + return result + } catch (error) { + console.error('Error encrypting input:', error) + return null + } + } + + return { + isLoaded, + encryptInput + } +} \ No newline at end of file diff --git a/examples/basic/client/src/main.tsx b/examples/basic/client/src/main.tsx new file mode 100644 index 0000000000..c85937ca01 --- /dev/null +++ b/examples/basic/client/src/main.tsx @@ -0,0 +1,42 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { WagmiProvider, createConfig } from 'wagmi' +import { sepolia, anvil } from 'wagmi/chains' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { ConnectKitProvider, getDefaultConfig } from 'connectkit' +import App from './App.tsx' + +// Web3 Configuration +const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID || '' +if (!walletConnectProjectId) { + console.warn('VITE_WALLETCONNECT_PROJECT_ID is not set in .env file. WalletConnect will not function properly.') +} + +const chains = import.meta.env.DEV ? ([sepolia, anvil] as const) : ([sepolia] as const) + +const config = createConfig( + getDefaultConfig({ + appName: 'Enclave E3', + enableFamily: false, + chains, + walletConnectProjectId: walletConnectProjectId, + }), +) + +const queryClient = new QueryClient() + +const connectKitOptions = import.meta.env.DEV + ? { initialChainId: 0 } + : { initialChainId: sepolia.id } + +createRoot(document.getElementById('root')!).render( + + + + + + + + + , +) diff --git a/examples/basic/client/src/pages/Wizard.tsx b/examples/basic/client/src/pages/Wizard.tsx new file mode 100644 index 0000000000..16198604c2 --- /dev/null +++ b/examples/basic/client/src/pages/Wizard.tsx @@ -0,0 +1,862 @@ +import React, { useState, useEffect } from 'react' +import { useAccount } from 'wagmi' +import { ConnectKitButton } from 'connectkit' +import { hexToBytes } from 'viem' + +// Components +import CardContent from './components/CardContent' +import EnvironmentError from './components/EnvironmentError' +import Spinner from './components/Spinner' + +// Hooks and utilities +import { useEnclaveContract } from '@/hooks/useEnclaveContract' +import { useWebAssemblyHook } from '@/hooks/useWebAssembly' + +// Config & Utils +import { HAS_MISSING_ENV_VARS, MISSING_ENV_VARS } from '@/utils/enclave.config' +import { decodePlaintextOutput } from '@/utils/bfv' + +// Icons +import { + Wallet, + Calculator, + Lock, + CheckCircle, + NumberSquareOne, + NumberSquareTwo, + NumberSquareThree, + NumberSquareFour, + NumberSquareFive, + NumberSquareSix +} from '@phosphor-icons/react' + +// ============================================================================ +// TYPES & ENUMS +// ============================================================================ + +enum WizardStep { + CONNECT_WALLET = 1, + REQUEST_COMPUTATION = 2, + ACTIVATE_E3 = 3, + ENTER_INPUTS = 4, + ENCRYPT_SUBMIT = 5, + RESULTS = 6, +} + + +// ============================================================================ +// STEP COMPONENTS +// ============================================================================ + +const ConnectWalletStep: React.FC = () => ( + +
+
+ +
+

Step 1: Connect Your Wallet

+
+

Welcome to Encrypted Computation

+

+ To begin the encrypted computation process, you'll need to connect your wallet. This enables secure + cryptographic operations and ensures your privacy throughout the computation. +

+
+

+ What happens next: After connecting, you'll request a computation session, + wait for committee activation, activate the E3, enter two numbers, and see them encrypted + before being published to the secure computation environment. +

+
+
+
+ +
+
+
+) + +interface RequestComputationStepProps { + e3State: any + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onRequestComputation: () => Promise +} + +const RequestComputationStep: React.FC = ({ + e3State, + isRequesting, + transactionHash, + error, + isSuccess, + onRequestComputation +}) => ( + +
+
+ +
+

Step 2: Request Computation

+
+

Initialize Encrypted Execution Environment

+

+ Request an E3 computation from the Enclave network. This will create a secure + computation environment and wait for the committee to activate it with a public key. +

+
+

+ What happens: Request → Committee Selection → Public Key → Ready for Activation +

+
+ + {/* E3 State Progress */} + {e3State.id !== null && ( +
+
+

+ ✅ E3 ID: {String(e3State.id)} +
+ Status: Computation requested +

+
+ + {e3State.isCommitteePublished && e3State.publicKey ? ( +
+

+ 🔑 Committee Published Public Key! +
+ Public Key: {e3State.publicKey.slice(0, 20)}...{e3State.publicKey.slice(-10)} +
+ Ready to activate E3 environment. +

+
+ ) : ( +
+
+ +

+ ⏳ Waiting for committee to publish public key... +
+ The computation committee is being selected and will provide the public key shortly. +

+
+
+ )} +
+ )} + + {error && ( +
+

+ Error: {error.message} +

+
+ )} + + {isSuccess && transactionHash && ( +
+

+ ✅ Transaction Successful! +
+ Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} +
+ + {isRequesting && ( +
+ +
+ )} + + +
+
+) + +interface ActivateE3StepProps { + e3State: any + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onActivateE3: () => Promise +} + +const ActivateE3Step: React.FC = ({ + e3State, + isRequesting, + transactionHash, + error, + isSuccess, + onActivateE3 +}) => ( + +
+
+ +
+

Step 3: Activate E3

+
+

Activate the Computation Environment

+

+ The committee has published their public key. Now you need to activate the E3 environment + which will allow it to accept encrypted inputs until it expires. +

+
+

🔒 Committee Ready

+
+

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

+ {e3State.publicKey && ( +

Public Key: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

+ )} +
+
+ +
+

+ What activation does: Activating the E3 sets an expiration time and + enables the environment to accept encrypted inputs from authorized users. +

+
+ + {error && ( +
+

+ Error: {error.message} +

+
+ )} + + {isSuccess && transactionHash && e3State.isActivated && ( +
+

+ ✅ E3 Successfully Activated! +
+ Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +
+ Environment is now ready to accept encrypted inputs. +

+
+ )} +
+ + {isRequesting && ( +
+ +
+ )} + + +
+
+) + +interface EnterInputsStepProps { + e3State: any + input1: string + input2: string + onInput1Change: (value: string) => void + onInput2Change: (value: string) => void + onSubmit: (e: React.FormEvent) => void +} + +const EnterInputsStep: React.FC = ({ + e3State, + input1, + input2, + onInput1Change, + onInput2Change, + onSubmit +}) => ( + +
+
+
+ +
+

Step 4: Enter Your Numbers

+

Input Data for Encrypted Computation

+

+ Enter two numbers that will be encrypted using the committee's public key and published to the E3 environment. +

+
+ + {/* E3 Environment Info */} +
+

🔒 Active E3 Environment

+
+

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

+ {e3State.publicKey && ( +

Encryption Key: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

+ )} + {e3State.expiresAt !== null && ( +

Valid Until: {new Date(Number(e3State.expiresAt) * 1000).toLocaleString()}

+ )} +

Status: {e3State.isActivated ? '✅ Activated & Ready for Inputs' : '⏳ Activating...'}

+
+
+ +
+
+ + onInput1Change(e.target.value)} + placeholder='Enter your first number...' + className='w-full rounded-lg border-2 border-slate-300 px-4 py-3 text-slate-700 transition-all duration-200 focus:border-lime-400 focus:outline-none focus:ring-2 focus:ring-lime-400/20 focus:scale-[1.02]' + required + min="0" + max="999999" + /> +
+ +
+ + onInput2Change(e.target.value)} + placeholder='Enter your second number...' + className='w-full rounded-lg border-2 border-slate-300 px-4 py-3 text-slate-700 transition-all duration-200 focus:border-lime-400 focus:outline-none focus:ring-2 focus:ring-lime-400/20 focus:scale-[1.02]' + required + min="0" + max="999999" + /> +
+ +
+

+ Privacy Guarantee: These numbers will be encrypted using the committee's public key + from E3 ID {e3State.id !== null ? String(e3State.id) : 'N/A'}, ensuring they remain completely private + throughout the homomorphic computation process and will be published to the blockchain. +

+
+ + +
+
+
+) + +interface EncryptSubmitStepProps { + inputPublishError: string | null + inputPublishSuccess: boolean + onTryAgain: () => void +} + +const EncryptSubmitStep: React.FC = ({ + inputPublishError, + inputPublishSuccess, + onTryAgain +}) => ( + +
+
+ +
+

Step 5: Encrypting & Publishing

+
+

Processing Your Encrypted Data

+ + {!inputPublishSuccess ? ( +

+ Your numbers are being encrypted using homomorphic encryption and published to the secure computation environment. + Each input is published as a separate transaction to the blockchain. +

+ ) : ( +

+ Your encrypted inputs have been successfully published to the blockchain. + The committee is now performing the homomorphic computation and will publish the decrypted result. +

+ )} + + {!inputPublishSuccess && ( +
+

+ Processing Steps: +
• Encrypting your inputs with FHE +
• Publishing encrypted input 1 to blockchain +
• Publishing encrypted input 2 to blockchain +
• Preparing secure result +

+
+ )} + + {inputPublishSuccess && ( +
+

+ ✅ Inputs Successfully Published! +
+ Both encrypted inputs have been submitted to the blockchain. +
+ ⏳ Waiting for committee to process and decrypt the result... +

+
+ )} + + {inputPublishError && ( +
+

+ ❌ Publishing Failed: +
+ {inputPublishError} +

+
+ )} +
+ +
+ +
+ + {inputPublishError && ( +
+ +
+ )} +
+
+) + +interface ResultsStepProps { + input1: string + input2: string + result: number | null + e3State: any + transactionHash: string | undefined + onReset: () => void +} + +const ResultsStep: React.FC = ({ + input1, + input2, + result, + e3State, + transactionHash, + onReset +}) => ( + +
+
+ +
+

Step 6: Computation Complete

+ +
+

Encrypted Computation Results

+ +
+
+

Your Inputs

+

First Number: {input1}

+

Second Number: {input2}

+
+ +
+

Computed Result

+ {e3State.hasPlaintextOutput ? ( + <> +

+ {decodePlaintextOutput(e3State.plaintextOutput!) ?? 'Decoding failed'} +

+

✅ Decrypted by committee

+ + ) : ( + <> +

{result}

+

⏳ Awaiting committee decryption...

+ + )} +
+
+ + {/* Committee Processing Status */} + {!e3State.hasPlaintextOutput && ( +
+
+ +

Committee Processing

+
+

+ The encrypted inputs have been published to the blockchain. The committee is now performing + the homomorphic computation and will publish the decrypted result once complete. +

+
+ )} + + {/* E3 Environment Details */} +
+

🔒 E3 Computation Details

+
+

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

+ {e3State.publicKey && ( +

Encryption Key Used: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

+ )} + {transactionHash && ( +

Request Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)}

+ )} +

Status: {e3State.hasPlaintextOutput ? '✅ Computation Complete' : '⏳ Inputs Published, Awaiting Result'}

+
+
+ +
+

What Just Happened?

+

+ Your numbers were encrypted using the committee's public key from E3 environment {e3State.id !== null ? String(e3State.id) : 'N/A'}, + published as encrypted inputs to the blockchain{e3State.hasPlaintextOutput + ? ', and the committee has successfully computed and published the decrypted result.' + : ', and are now being processed by the committee for secure computation.' + } Your original numbers remained completely private throughout the entire process. +

+
+ + +
+
+
+) + +// ============================================================================ +// MAIN WIZARD COMPONENT +// ============================================================================ + +const Wizard: React.FC = () => { + // ======================================================================== + // ENVIRONMENT CHECK + // ======================================================================== + if (HAS_MISSING_ENV_VARS) { + return + } + + // ======================================================================== + // STATE MANAGEMENT + // ======================================================================== + + // Wizard flow state + const [currentStep, setCurrentStep] = useState(WizardStep.CONNECT_WALLET) + + // Input state + const [input1, setInput1] = useState('') + const [input2, setInput2] = useState('') + + // Processing state + const [result, setResult] = useState(null) + + // Error and success state + const [inputPublishError, setInputPublishError] = useState(null) + const [inputPublishSuccess, setInputPublishSuccess] = useState(false) + + // ======================================================================== + // HOOKS + // ======================================================================== + + const { encryptInput } = useWebAssemblyHook() + const { isConnected } = useAccount() + const { requestComputation, activateE3, publishInput, e3State, isRequesting, isSuccess, error, transactionHash } = useEnclaveContract() + + // ======================================================================== + // EFFECTS - Wallet Connection Management + // ======================================================================== + + // Auto-advance from step 1 when wallet connects + useEffect(() => { + if (isConnected && currentStep === WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.REQUEST_COMPUTATION) + } + }, [isConnected, currentStep]) + + // Auto-move back to step 1 if wallet disconnects + useEffect(() => { + if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.CONNECT_WALLET) + } + }, [isConnected, currentStep]) + + // ======================================================================== + // EFFECTS - E3 Lifecycle Management + // ======================================================================== + + // Auto-advance when committee publishes public key + useEffect(() => { + if (e3State.isCommitteePublished && e3State.publicKey && currentStep === WizardStep.REQUEST_COMPUTATION) { + setCurrentStep(WizardStep.ACTIVATE_E3) + } + }, [e3State.isCommitteePublished, e3State.publicKey, currentStep]) + + // Auto-advance when E3 is activated + useEffect(() => { + if (e3State.isActivated && currentStep === WizardStep.ACTIVATE_E3) { + setCurrentStep(WizardStep.ENTER_INPUTS) + } + }, [e3State.isActivated, currentStep]) + + // Auto-advance to results when plaintext output is published by committee + useEffect(() => { + if (e3State.hasPlaintextOutput && currentStep === WizardStep.ENCRYPT_SUBMIT) { + setCurrentStep(WizardStep.RESULTS) + } + }, [e3State.hasPlaintextOutput, currentStep]) + + // ======================================================================== + // EVENT HANDLERS + // ======================================================================== + + const handleRequestComputation = async () => { + try { + await requestComputation({ + paymentAmount: "0.001" + }) + } catch (error) { + console.error('Failed to request computation:', error) + } + } + + const handleActivateE3 = async () => { + try { + await activateE3() + } catch (error) { + console.error('Failed to activate E3:', error) + } + } + + const handleInputSubmit = async (e: React.FormEvent) => { + e.preventDefault() + if (!input1.trim() || !input2.trim()) return + + setCurrentStep(WizardStep.ENCRYPT_SUBMIT) + setInputPublishError(null) + setInputPublishSuccess(false) + + try { + // UI feedback delay + await new Promise(resolve => setTimeout(resolve, 1500)) + + // Encrypt inputs + const publicKeyBytes = hexToBytes(e3State.publicKey as `0x${string}`) + const encryptedInput1 = await encryptInput(BigInt(input1), publicKeyBytes) + const encryptedInput2 = await encryptInput(BigInt(input2), publicKeyBytes) + + if (!encryptedInput1 || !encryptedInput2) { + throw new Error('Encryption failed') + } + + // Log encrypted values for debugging + console.log('Encrypted input 1:', encryptedInput1) + console.log('Encrypted input 2:', encryptedInput2) + + // Publish inputs sequentially - wait for first TX to complete before second + await publishInput(encryptedInput1) + // Now publish the second input after first is confirmed + await publishInput(encryptedInput2) + + // Calculate expected result for display until committee decrypts + const sum = parseInt(input1) + parseInt(input2) + setResult(sum) + + setInputPublishSuccess(true) + } catch (error) { + console.error('Encryption or publishing failed:', error) + setInputPublishError(error instanceof Error ? error.message : 'Unknown error occurred') + } + } + + const handleReset = () => { + setCurrentStep(WizardStep.REQUEST_COMPUTATION) + setInput1('') + setInput2('') + setResult(null) + setInputPublishError(null) + setInputPublishSuccess(false) + } + + const handleTryAgain = () => { + setCurrentStep(WizardStep.ENTER_INPUTS) + setInputPublishError(null) + } + + // ======================================================================== + // UTILITY FUNCTIONS + // ======================================================================== + + const getStepIcon = (step: WizardStep) => { + const iconProps = { size: 20, weight: 'bold' as const } + switch (step) { + case WizardStep.CONNECT_WALLET: return + case WizardStep.REQUEST_COMPUTATION: return + case WizardStep.ACTIVATE_E3: return + case WizardStep.ENTER_INPUTS: return + case WizardStep.ENCRYPT_SUBMIT: return + case WizardStep.RESULTS: return + } + } + + const renderStepIndicator = () => ( +
+ {[1, 2, 3, 4, 5, 6].map((step) => ( +
+
+ {getStepIcon(step as WizardStep)} +
+ {step < 6 && ( +
+ )} +
+ ))} +
+ ) + + // ======================================================================== + // STEP ROUTING + // ======================================================================== + + const renderStepContent = () => { + switch (currentStep) { + case WizardStep.CONNECT_WALLET: + return + + case WizardStep.REQUEST_COMPUTATION: + return ( + + ) + + case WizardStep.ACTIVATE_E3: + return ( + + ) + + case WizardStep.ENTER_INPUTS: + return ( + + ) + + case WizardStep.ENCRYPT_SUBMIT: + return ( + + ) + + case WizardStep.RESULTS: + return ( + + ) + + default: + return null + } + } + + // ======================================================================== + // RENDER + // ======================================================================== + + return ( +
+
+
+

Enclave E3

+

+ Confidential computation with Enclave Encrypted Execution Environments +

+
+ + {renderStepIndicator()} + +
+ {renderStepContent()} +
+
+
+ ) +} + +export default Wizard \ No newline at end of file diff --git a/examples/basic/client/src/pages/components/CardContent.tsx b/examples/basic/client/src/pages/components/CardContent.tsx new file mode 100644 index 0000000000..d536e7fd99 --- /dev/null +++ b/examples/basic/client/src/pages/components/CardContent.tsx @@ -0,0 +1,15 @@ +import React from 'react' + +interface CardContentProps { + children: React.ReactNode +} + +const CardContent: React.FC = ({ children }) => { + return ( +
+ {children} +
+ ) +} + +export default CardContent diff --git a/examples/basic/client/src/pages/components/EnvironmentError.tsx b/examples/basic/client/src/pages/components/EnvironmentError.tsx new file mode 100644 index 0000000000..72a2e44b85 --- /dev/null +++ b/examples/basic/client/src/pages/components/EnvironmentError.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import { Warning } from '@phosphor-icons/react' + +interface EnvironmentErrorProps { + missingVars: string[] +} + +const EnvironmentError: React.FC = ({ missingVars }) => { + return ( +
+
+
+
+ +
+ +

+ Environment Configuration Required +

+ +

+ The following environment variables need to be configured before you can use the encrypted computation features: +

+ +
+
    + {missingVars.map((varName) => ( +
  • + + {varName} + +
  • + ))} +
+
+ +
+

How to configure:

+
    +
  1. Create a .env file in the client directory
  2. +
  3. Add the missing environment variables with their appropriate values
  4. +
  5. Restart the development server
  6. +
+
+ +
+ +
+
+
+
+ ) +} + +export default EnvironmentError \ No newline at end of file diff --git a/examples/basic/client/src/pages/components/Spinner.tsx b/examples/basic/client/src/pages/components/Spinner.tsx new file mode 100644 index 0000000000..acc33d4823 --- /dev/null +++ b/examples/basic/client/src/pages/components/Spinner.tsx @@ -0,0 +1,14 @@ +// ============================================================================ +// SIMPLE SPINNER +// ============================================================================ + +const Spinner: React.FC<{ size?: number; className?: string }> = ({ size = 18, className = "" }) => ( +
+
+
+) + +export default Spinner \ No newline at end of file diff --git a/examples/basic/client/src/utils/bfv.ts b/examples/basic/client/src/utils/bfv.ts new file mode 100644 index 0000000000..e891e37f49 --- /dev/null +++ b/examples/basic/client/src/utils/bfv.ts @@ -0,0 +1,114 @@ +import { encodeAbiParameters } from 'viem' + +// BFV parameter set matching the Rust SET_2048_1032193_1 configuration +export const BFV_PARAMS_SET = { + degree: 2048, + plaintext_modulus: 1032193, + moduli: [0x3FFFFFFF000001n] // BigInt for the modulus +} as const + +// Compute provider parameters structure +export interface ComputeProviderParams { + name: string + parallel: boolean + batch_size: number +} + +// Default compute provider configuration +export const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = { + name: "risc0", + parallel: false, + batch_size: 2 +} + +// Default E3 configuration +export const DEFAULT_E3_CONFIG = { + threshold_min: 2, + threshold_max: 3, + window_size: 300, // 5 minutes in seconds + duration: 1800, // 30 minutes in seconds + payment_amount: "0" // 0 ETH in wei +} as const + +/** + * Encode BFV parameters for the smart contract + * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption + */ +export function encodeBfvParams( + degree: number = BFV_PARAMS_SET.degree, + plaintext_modulus: number = BFV_PARAMS_SET.plaintext_modulus, + moduli: readonly bigint[] = BFV_PARAMS_SET.moduli +): `0x${string}` { + return encodeAbiParameters( + [ + { + name: 'bfvParams', + type: 'tuple', + components: [ + { name: 'degree', type: 'uint256' }, + { name: 'plaintext_modulus', type: 'uint256' }, + { name: 'moduli', type: 'uint256[]' } + ] + } + ], + [{ + degree: BigInt(degree), + plaintext_modulus: BigInt(plaintext_modulus), + moduli: [...moduli] + }] + ) +} + +/** + * Encode compute provider parameters for the smart contract + */ +export function encodeComputeProviderParams(params: ComputeProviderParams): `0x${string}` { + const jsonString = JSON.stringify(params) + const encoder = new TextEncoder() + const bytes = encoder.encode(jsonString) + + return `0x${Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('')}` +} + +/** + * Get the current timestamp in seconds + */ +export function getCurrentTimestamp(): number { + return Math.floor(Date.now() / 1000) +} + +/** + * Calculate start window for E3 request + */ +export function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] { + const now = getCurrentTimestamp() + return [BigInt(now), BigInt(now + windowSize)] +} + + +/** + * Decode plaintextOutput bytes to get the actual result number + */ +export function decodePlaintextOutput(plaintextOutput: string): number | null { + try { + // Remove '0x' prefix if present + const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput + + // Convert hex to bytes + const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []) + + if (bytes.length < 8) { + console.warn('Plaintext output too short for u64 decoding') + return null + } + + // Decode first u64 (8 bytes) as little-endian + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) + const result = view.getBigUint64(0, true) // true for little-endian + + return Number(result) + } catch (error) { + console.error('Failed to decode plaintext output:', error) + return null + } +} \ No newline at end of file diff --git a/examples/basic/client/src/utils/enclave.config.ts b/examples/basic/client/src/utils/enclave.config.ts new file mode 100644 index 0000000000..c4d613bc24 --- /dev/null +++ b/examples/basic/client/src/utils/enclave.config.ts @@ -0,0 +1,42 @@ +import contractABI from '@/abis/enclave.abi.json' + +// Environment variables with validation +export const ENCLAVE_ADDRESS = import.meta.env.VITE_ENCLAVE_ADDRESS +export const E3_PROGRAM_ADDRESS = import.meta.env.VITE_E3_PROGRAM_ADDRESS +export const REGISTRY_ADDRESS = import.meta.env.VITE_REGISTRY_ADDRESS +export const FILTER_REGISTRY_ADDRESS = import.meta.env.VITE_FILTER_REGISTRY_ADDRESS + +// Validate required environment variables +const requiredEnvVars = { + VITE_ENCLAVE_ADDRESS: ENCLAVE_ADDRESS, + VITE_E3_PROGRAM_ADDRESS: E3_PROGRAM_ADDRESS, + VITE_REGISTRY_ADDRESS: REGISTRY_ADDRESS, + VITE_FILTER_REGISTRY_ADDRESS: FILTER_REGISTRY_ADDRESS, +} + +export const MISSING_ENV_VARS = Object.entries(requiredEnvVars) + .filter(([, value]) => !value) + .map(([key]) => key) + +export const HAS_MISSING_ENV_VARS = MISSING_ENV_VARS.length > 0 + +// Contract ABIs +export const ENCLAVE_ABI = contractABI.abi +export const REGISTRY_ABI = [ + { + type: 'event', + name: 'CommitteePublished', + inputs: [ + { + name: 'e3Id', + type: 'uint256', + indexed: true, + }, + { + name: 'publicKey', + type: 'bytes', + indexed: false, + }, + ], + }, +] as const \ No newline at end of file diff --git a/examples/basic/client/src/vite-env.d.ts b/examples/basic/client/src/vite-env.d.ts new file mode 100644 index 0000000000..8e23ca4f58 --- /dev/null +++ b/examples/basic/client/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// +declare module '*.svg' { + import React = require('react') + export const ReactComponent: React.FunctionComponent> + const src: string + export default src +} diff --git a/examples/basic/client/tailwind.config.js b/examples/basic/client/tailwind.config.js new file mode 100644 index 0000000000..57948ae0c7 --- /dev/null +++ b/examples/basic/client/tailwind.config.js @@ -0,0 +1,34 @@ +const config = { + content: ['./src/**/*.{js,jsx,ts,tsx,mdx}'], + variant: { + extend: { + borderColor: ['disabled'], + backgroundColor: ['disabled'], + textColor: ['disabled'], + boxShadow: ['disabled'], + cursor: ['disabled'], + }, + }, + theme: { + extend: { + fontFamily: { + jakarta: ['Plus Jakarta Sans', 'sans-serif'], + }, + colors: { + slate: { + 200: '#E3E9F5', + }, + }, + letterSpacing: { + custom: '0.03em', + }, + boxShadow: { + button: '0 2px 0 0 #5F9715, 0 8px 16px rgba(0,0,0,0.1)', + 'button-outlined': '0 2px 0 0 #A6E05A, 0 8px 16px rgba(0,0,0,0.1)', + danger: '0 2px 0 0 #EF4444, 0 8px 16px rgba(0,0,0,0.1)', + }, + }, + }, + plugins: [require('@tailwindcss/typography')], +} +export default config diff --git a/examples/basic/client/tsconfig.json b/examples/basic/client/tsconfig.json new file mode 100644 index 0000000000..6160d3f9d3 --- /dev/null +++ b/examples/basic/client/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "@/*": ["./src/*"], + "libs/*": ["./libs/*"] + } + }, + "include": ["src", "src/**/*.d.ts", "pkg", "libs/wasm/pkg"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/basic/client/tsconfig.node.json b/examples/basic/client/tsconfig.node.json new file mode 100644 index 0000000000..97ede7ee6f --- /dev/null +++ b/examples/basic/client/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/basic/client/vite.config.ts b/examples/basic/client/vite.config.ts new file mode 100644 index 0000000000..53a2e75be1 --- /dev/null +++ b/examples/basic/client/vite.config.ts @@ -0,0 +1,41 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import viteTsconfigPaths from 'vite-tsconfig-paths' +import wasm from 'vite-plugin-wasm' +import topLevelAwait from 'vite-plugin-top-level-await' +import path from 'path' + +// const development: boolean = !process.env.NODE_ENV || process.env.NODE_ENV === 'development' + +export default defineConfig({ + base: '/', + define: { + // here is the main update + global: 'globalThis', + }, + optimizeDeps: { + exclude: ['@rollup/browser'], + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + libs: path.resolve(__dirname, './libs'), + }, + }, + plugins: [ + // here is the main update + wasm(), + topLevelAwait(), + react(), + viteTsconfigPaths(), + ], + server: { + open: true, + // this sets a default port to 3000 + port: 3000, + }, + preview: { + port: 3000, + open: true, + }, +}) diff --git a/examples/basic/client/wasm/Cargo.lock b/examples/basic/client/wasm/Cargo.lock new file mode 100644 index 0000000000..5ef6361fe5 --- /dev/null +++ b/examples/basic/client/wasm/Cargo.lock @@ -0,0 +1,5777 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-provider", + "alloy-rpc-client", + "alloy-serde", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest 0.12.18", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest 0.12.18", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.18", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[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 = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror 1.0.69", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror 1.0.69", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.27", + "serde", + "serde_json", + "syn 2.0.101", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum 0.26.3", + "syn 2.0.101", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.26", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror 1.0.69", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "ethnum" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fhe" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "doc-comment", + "fhe-math", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "thiserror 1.0.69", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "fhe-math" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "ethnum", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-bigint-dig", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "sha2", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "fhe-traits" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "fhe-util" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "itertools 0.12.1", + "num-bigint-dig", + "num-traits", + "prime_factorization", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +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 = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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 = "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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +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 = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.6.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set 0.5.3", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.1", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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", + "serde", + "smallvec", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "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.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand 0.8.5", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set 0.8.0", + "bit-vec 0.8.0", + "bitflags 2.9.1", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.101", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[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 = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[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 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[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 = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ruint" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki", + "sct", +] + +[[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 = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[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 = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "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 = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "url", + "zip", +] + +[[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.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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 = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[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 = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[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 = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.16", + "serde", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +dependencies = [ + "js-sys", + "minicov", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "wasm-crypto" +version = "0.1.0" +dependencies = [ + "bincode", + "console", + "console_log", + "e3-bfv-helpers", + "ethers", + "fhe", + "fhe-math", + "fhe-traits", + "fhe-util", + "getrandom 0.2.16", + "itertools 0.13.0", + "log", + "ndarray", + "num-bigint", + "num-traits", + "rand 0.8.5", + "rayon", + "serde", + "serde_json", + "wasm-bindgen", + "wasm-bindgen-test", + "web-sys", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/basic/client/wasm/Cargo.toml b/examples/basic/client/wasm/Cargo.toml new file mode 100644 index 0000000000..d0c26e5e3e --- /dev/null +++ b/examples/basic/client/wasm/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "wasm-crypto" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/gnosisguild/enclave" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +web-sys = { version = "0.3", features = ["console"] } +console = "0.15.7" +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } +rand = "0.8.5" +ethers = "2.0.14" +getrandom = { version = "0.2.11", features = ["js"] } +bincode = "1.3.3" +e3-bfv-helpers = { path = "../../../../crates/bfv-helpers" } +rayon = "1.10.0" +ndarray = "0.15.6" +itertools = "0.13.0" +num-bigint = "0.4.6" +num-traits = "0.2" +serde = { version = "1.0.208", features = ["derive"] } +serde_json = "1.0.133" +wasm-bindgen = "0.2.93" +wasm-bindgen-test = "0.3.43" +console_log = "0.2" +log = "0.4" + +[lib] +crate-type = ["cdylib", "rlib"] diff --git a/examples/basic/client/wasm/README.md b/examples/basic/client/wasm/README.md new file mode 100644 index 0000000000..72699c2019 --- /dev/null +++ b/examples/basic/client/wasm/README.md @@ -0,0 +1,35 @@ +# CRISP-Web + +A Rust WebAssembly (WASM) implementation of Fully Homomorphic Encryption (FHE) for secure voting systems. + +## Features + +- BFV encryption scheme implementation +- WASM integration for browser-based encryption +- Greco protocol implementation for input validation + +## Prerequisites + +- Rust (latest stable version) +- wasm-pack +- Node.js (for running tests) + +## Installation + +1. Install wasm-pack +`cargo install wasm-pack` + +## Building + +Build the WebAssembly package: +``` +wasm-pack build --target web --release +``` + + +## Running Tests + +Run the tests: +``` +wasm-pack test --node --release +``` diff --git a/examples/basic/client/wasm/src/lib.rs b/examples/basic/client/wasm/src/lib.rs new file mode 100644 index 0000000000..6fc1fc2dc0 --- /dev/null +++ b/examples/basic/client/wasm/src/lib.rs @@ -0,0 +1,39 @@ +use e3_bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; +use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; +use rand::thread_rng; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub struct Encrypt { + encrypted_data: Vec, +} + +#[wasm_bindgen] +impl Encrypt { + #[wasm_bindgen(constructor)] + pub fn new() -> Encrypt { + Encrypt { + encrypted_data: Vec::new(), + } + } + + pub fn encrypt(&mut self, data: u64, public_key: Vec) -> Result, JsValue> { + let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + + let pk = PublicKey::from_bytes(&public_key, ¶ms) + .map_err(|e| JsValue::from_str(&format!("Error deserializing public key: {}", e)))?; + + let input = vec![data]; + let pt = Plaintext::try_encode(&input, Encoding::poly(), ¶ms) + .map_err(|e| JsValue::from_str(&format!("Error encoding plaintext: {}", e)))?; + + let ct = pk + .try_encrypt(&pt, &mut thread_rng()) + .map_err(|e| JsValue::from_str(&format!("Error encrypting data: {}", e)))?; + + self.encrypted_data = ct.to_bytes(); + Ok(self.encrypted_data.clone()) + } +} diff --git a/packages/evm/contracts/interfaces/IEnclave.sol b/packages/evm/contracts/interfaces/IEnclave.sol index 35f1a84392..afcb889109 100644 --- a/packages/evm/contracts/interfaces/IEnclave.sol +++ b/packages/evm/contracts/interfaces/IEnclave.sol @@ -173,6 +173,20 @@ interface IEnclave { uint256 _maxDuration ) external returns (bool success); + /// @notice This function should be called to enable an E3 Program. + /// @param e3Program The address of the E3 Program. + /// @return success True if the E3 Program was successfully enabled. + function enableE3Program( + IE3Program e3Program + ) external returns (bool success); + + /// @notice This function should be called to disable an E3 Program. + /// @param e3Program The address of the E3 Program. + /// @return success True if the E3 Program was successfully disabled. + function disableE3Program( + IE3Program e3Program + ) external returns (bool success); + //////////////////////////////////////////////////////////// // // // Get Functions // diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec5c45113f..c0c10cac9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: dependencies: next: specifier: ^14.2.1 - version: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^2.13.4 - version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: ^2.13.4 - version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -31,17 +31,17 @@ importers: version: 18.3.1(react@18.3.1) sharp: specifier: ^0.34.1 - version: 0.34.2 + version: 0.34.1 devDependencies: '@types/node': specifier: 20.10.4 version: 20.10.4 '@types/react': specifier: ^18.2.66 - version: 18.3.23 + version: 18.3.20 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.7(@types/react@18.3.23) + version: 18.3.6(@types/react@18.3.20) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -59,7 +59,7 @@ importers: version: link:../../packages/evm '@semaphore-protocol/contracts': specifier: ^4.9.2 - version: 4.11.1 + version: 4.9.2 '@zk-kit/lean-imt.sol': specifier: 2.0.0 version: 2.0.0 @@ -68,32 +68,32 @@ importers: version: 0.0.5 solady: specifier: ^0.1.13 - version: 0.1.19 + version: 0.1.13 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 - version: 1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.5 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(d1703b8c85cc657c19a30d0af9337a0a) + version: 5.0.0(a7f0110eca458f09074d1c2612ad945e) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.5 version: 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + version: 4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -120,28 +120,28 @@ importers: version: 9.1.2 hardhat: specifier: ^2.22.10 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.4 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) playwright: specifier: 1.52.0 version: 1.52.0 solidity-coverage: specifier: ^0.8.1 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) typechain: specifier: ^8.3.0 - version: 8.3.2(typescript@5.5.4) + version: 8.3.2(typescript@5.8.2) typescript: specifier: ^5.5.4 - version: 5.5.4 + version: 5.8.2 wait-on: specifier: ^8.0.3 version: 8.0.3 @@ -156,34 +156,34 @@ importers: version: 11.13.5 '@emotion/react': specifier: ^11.11.4 - version: 11.14.0(@types/react@18.3.23)(react@18.3.1) + version: 11.14.0(@types/react@18.3.20)(react@18.3.1) '@noir-lang/noir_js': specifier: 1.0.0-beta.3 version: 1.0.0-beta.3 '@phosphor-icons/react': specifier: ^2.1.4 - version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semaphore-protocol/core': specifier: ^4.9.2 - version: 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@semaphore-protocol/data': specifier: ^4.9.2 - version: 4.11.1(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@svgr/rollup': specifier: ^8.1.0 - version: 8.1.0(rollup@4.41.1)(typescript@5.5.4) + version: 8.1.0(rollup@4.40.0)(typescript@5.8.2) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.79.2(react@18.3.1) + version: 5.74.3(react@18.3.1) axios: specifier: ^1.6.8 - version: 1.9.0 + version: 1.8.4 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.79.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)) + version: 1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) ethers: specifier: ^6.12.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) react: specifier: ^18.2.0 version: 18.3.1 @@ -192,56 +192,56 @@ importers: version: 18.3.1(react@18.3.1) react-markdown: specifier: ^9.0.1 - version: 9.1.0(@types/react@18.3.23)(react@18.3.1) + version: 9.1.0(@types/react@18.3.20)(react@18.3.1) react-router-dom: specifier: ^6.22.3 - version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-syntax-highlighter: specifier: ^15.5.0 version: 15.6.1(react@18.3.1) viem: - specifier: ^2.27.0 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + version: 0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + version: 1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.4.19(@types/node@22.7.5)) + version: 4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) + version: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))) '@types/react': specifier: ^18.2.66 - version: 18.3.23 + version: 18.3.20 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.7(@types/react@18.3.23) + version: 18.3.6(@types/react@18.3.20) '@types/react-syntax-highlighter': specifier: ^15.5.11 version: 15.5.13 '@typescript-eslint/eslint-plugin': specifier: ^7.2.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) '@typescript-eslint/parser': specifier: ^7.2.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) + version: 7.18.0(eslint@8.57.1)(typescript@5.8.2) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.5.0(vite@5.4.19(@types/node@22.7.5)) + version: 4.3.4(vite@5.4.18(@types/node@22.7.5)) add: specifier: ^2.0.6 version: 2.0.6 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.4) + version: 10.4.21(postcss@8.5.3) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -250,7 +250,7 @@ importers: version: 4.6.2(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.6 - version: 0.4.20(eslint@8.57.1) + version: 0.4.19(eslint@8.57.1) gh-pages: specifier: ^6.1.1 version: 6.3.0 @@ -262,16 +262,16 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) typescript: specifier: ^5.2.2 - version: 5.5.4 + version: 5.8.2 vite: specifier: ^5.2.0 - version: 5.4.19(@types/node@22.7.5) + version: 5.4.18(@types/node@22.7.5) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) examples/basic: devDependencies: @@ -280,34 +280,34 @@ importers: version: link:../../packages/evm '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.15.11(3c85381c0b45919662d061966161e2b7) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(21ac015ac60478c81ef64632993d75d8) + version: 5.0.0(248454f03b5d7796fe0b22b5b4b634ab) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -322,22 +322,22 @@ importers: version: 4.5.0 ethers: specifier: ^6.4.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: ^2.14.0 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.5.4) @@ -345,6 +345,88 @@ importers: specifier: '>=4.5.0' version: 5.5.4 + examples/basic/client: + dependencies: + '@phosphor-icons/react': + specifier: ^2.1.4 + version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.74.3 + version: 5.74.3(react@18.3.1) + '@wagmi/core': + specifier: ^2.17.2 + version: 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) + connectkit: + specifier: ^1.9.0 + version: 1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + viem: + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + wagmi: + specifier: ^2.15.4 + version: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + devDependencies: + '@tailwindcss/typography': + specifier: ^0.5.12 + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4))) + '@types/react': + specifier: ^18.2.66 + version: 18.3.20 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.3.6(@types/react@18.3.20) + '@typescript-eslint/eslint-plugin': + specifier: ^7.2.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^7.2.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.3.4(vite@5.4.18(@types/node@22.7.5)) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.21(postcss@8.5.3) + eslint: + specifier: ^8.57.0 + version: 8.57.1 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.4.6 + version: 0.4.19(eslint@8.57.1) + prettier: + specifier: ^3.2.5 + version: 3.5.3 + prettier-plugin-tailwindcss: + specifier: ^0.5.13 + version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) + tailwindcss: + specifier: ^3.4.2 + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) + typescript: + specifier: ^5.2.2 + version: 5.5.4 + vite: + specifier: ^5.2.0 + version: 5.4.18(@types/node@22.7.5) + vite-plugin-top-level-await: + specifier: ^1.4.1 + version: 1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + vite-plugin-wasm: + specifier: ^3.3.0 + version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.5.4)(vite@5.4.18(@types/node@22.7.5)) + packages/evm: dependencies: '@excubiae/contracts': @@ -352,38 +434,38 @@ importers: version: 0.4.0 solady: specifier: ^0.1.13 - version: 0.1.19 + version: 0.1.13 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(c9628f5d47e1b74ed759ca13ebe35860) + version: 4.0.0(55894f249afdd64a69e3e7ac6a284d95) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 - version: 5.3.0 + version: 5.2.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.0.2 - version: 5.3.0(@openzeppelin/contracts@5.3.0) + version: 5.2.0(@openzeppelin/contracts@5.2.0) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.5.3) '@typechain/ethers-v6': specifier: ^0.5.1 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -395,7 +477,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.10.4 - version: 20.10.4 + version: 20.17.30 '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -416,7 +498,7 @@ importers: version: 7.0.3 dotenv: specifier: ^16.4.5 - version: 16.5.0 + version: 16.4.7 eslint: specifier: ^8.56.0 version: 8.57.1 @@ -425,19 +507,19 @@ importers: version: 9.1.0(eslint@8.57.1) ethers: specifier: ^6.9.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: specifier: ^11.2.0 version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -455,25 +537,25 @@ importers: version: 3.5.3 prettier-plugin-solidity: specifier: ^1.2.0 - version: 1.4.3(prettier@3.5.3) + version: 1.4.2(prettier@3.5.3) rimraf: specifier: ^5.0.5 version: 5.0.10 solhint: specifier: ^5.0.5 - version: 5.1.0(typescript@5.8.3) + version: 5.0.5(typescript@5.8.3) solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3) + version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3) solidity-coverage: specifier: ^0.8.5 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.3) @@ -489,9 +571,6 @@ packages: '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -504,42 +583,42 @@ packages: resolution: {integrity: sha512-jtnCqf+/QLw5yJGOmy818RMQqzHzHqcROtTdQZJybSxp0z3h76xpLSwoDQUBmZZVbP9e46FJjOLqB6gM9gY5cw==} hasBin: true - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.3': - resolution: {integrity: sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} '@babel/generator@7.17.7': resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.3': - resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.27.0': + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + '@babel/helper-create-regexp-features-plugin@7.27.0': + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -561,99 +640,99 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.4': - resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.4': - resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -664,26 +743,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -694,356 +773,356 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.27.1': - resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} + '@babel/plugin-transform-async-generator-functions@7.26.8': + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.26.5': + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.3': - resolution: {integrity: sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==} + '@babel/plugin-transform-block-scoping@7.27.0': + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.27.1': - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.27.3': - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-for-of@7.26.9': + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.27.3': - resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.1': - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-constant-elements@7.27.1': - resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} + '@babel/plugin-transform-react-constant-elements@7.25.9': + resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.4': - resolution: {integrity: sha512-Glp/0n8xuj+E1588otw5rjJkTXfzW7FjH3IIUrfqiZOPQCd2vbg8e+DQE8jK9g4V5/zrxFW+D9WM9gboRPELpQ==} + '@babel/plugin-transform-regenerator@7.27.0': + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.26.8': + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.27.0': + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.1': - resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} + '@babel/plugin-transform-typescript@7.27.0': + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.27.2': - resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} + '@babel/preset-env@7.26.9': + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1053,40 +1132,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + '@babel/preset-react@7.26.3': + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + '@babel/preset-typescript@7.27.0': + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.4': - resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.3': - resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -1106,11 +1185,11 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@depay/solana-web3.js@1.98.2': - resolution: {integrity: sha512-O7SvHsZ6HGXlzSmjhj7mj0B/VvQQn8mzm/xKQ0SUrEUJVxg9zKFBlwIvxCtgf+IOrWlBJi6VqXRu7UznWvfrCA==} + '@depay/solana-web3.js@1.98.1': + resolution: {integrity: sha512-3Qgf8cooFqaLCVCeA6KxNBU3aBWwS019a2IaPPIlpea/P4IOFAdZL1ZgnIFTsXAvugjqMAbegd2vfVJBd/ZJ6g==} - '@depay/web3-blockchains@9.8.6': - resolution: {integrity: sha512-Fp2sGHjvRuqsLivfbL2qdhB447Fk/A0eS/iZj5VlzVnrpfa1Jt+tAKPk1c5T5tOYagnWaGG5DTFMuFNKiqRPkQ==} + '@depay/web3-blockchains@9.8.2': + resolution: {integrity: sha512-glJ1aFNG2ZljdmYS8Ei4ok+2eoCHPqK9lseJ4kBqqKTGNTRxZ2nVZQ1GxyiO9stuixyBowVFif0bRy9E6mAYZQ==} engines: {node: '>=18'} '@depay/web3-client@10.18.6': @@ -1608,8 +1687,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1634,11 +1713,6 @@ packages: engines: {node: '>=14'} hasBin: true - '@ethereumjs/rlp@5.0.2': - resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} - engines: {node: '>=18'} - hasBin: true - '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -1647,10 +1721,6 @@ packages: resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} - '@ethereumjs/util@9.1.0': - resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} - engines: {node: '>=18'} - '@ethersproject/abi@5.8.0': resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} @@ -1783,14 +1853,14 @@ packages: '@iden3/binfileutils@0.0.12': resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} - '@img/sharp-darwin-arm64@0.34.2': - resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.2': - resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] @@ -1840,61 +1910,55 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.2': - resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.2': - resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.2': - resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.2': - resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.2': - resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.2': - resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.2': - resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.2': - resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.2': - resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.2': - resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1942,6 +2006,10 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + '@metamask/json-rpc-engine@7.3.3': resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -2113,59 +2181,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.29': - resolution: {integrity: sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg==} + '@next/env@14.2.28': + resolution: {integrity: sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==} - '@next/swc-darwin-arm64@14.2.29': - resolution: {integrity: sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==} + '@next/swc-darwin-arm64@14.2.28': + resolution: {integrity: sha512-kzGChl9setxYWpk3H6fTZXXPFFjg7urptLq5o5ZgYezCrqlemKttwMT5iFyx/p1e/JeglTwDFRtb923gTJ3R1w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.29': - resolution: {integrity: sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==} + '@next/swc-darwin-x64@14.2.28': + resolution: {integrity: sha512-z6FXYHDJlFOzVEOiiJ/4NG8aLCeayZdcRSMjPDysW297Up6r22xw6Ea9AOwQqbNsth8JNgIK8EkWz2IDwaLQcw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.29': - resolution: {integrity: sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==} + '@next/swc-linux-arm64-gnu@14.2.28': + resolution: {integrity: sha512-9ARHLEQXhAilNJ7rgQX8xs9aH3yJSj888ssSjJLeldiZKR4D7N08MfMqljk77fAwZsWwsrp8ohHsMvurvv9liQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.29': - resolution: {integrity: sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==} + '@next/swc-linux-arm64-musl@14.2.28': + resolution: {integrity: sha512-p6gvatI1nX41KCizEe6JkF0FS/cEEF0u23vKDpl+WhPe/fCTBeGkEBh7iW2cUM0rvquPVwPWdiUR6Ebr/kQWxQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.29': - resolution: {integrity: sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==} + '@next/swc-linux-x64-gnu@14.2.28': + resolution: {integrity: sha512-nsiSnz2wO6GwMAX2o0iucONlVL7dNgKUqt/mDTATGO2NY59EO/ZKnKEr80BJFhuA5UC1KZOMblJHWZoqIJddpA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.29': - resolution: {integrity: sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==} + '@next/swc-linux-x64-musl@14.2.28': + resolution: {integrity: sha512-+IuGQKoI3abrXFqx7GtlvNOpeExUH1mTIqCrh1LGFf8DnlUcTmOOCApEnPJUSLrSbzOdsF2ho2KhnQoO0I1RDw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.29': - resolution: {integrity: sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==} + '@next/swc-win32-arm64-msvc@14.2.28': + resolution: {integrity: sha512-l61WZ3nevt4BAnGksUVFKy2uJP5DPz2E0Ma/Oklvo3sGj9sw3q7vBWONFRgz+ICiHpW5mV+mBrkB3XEubMrKaA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.29': - resolution: {integrity: sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==} + '@next/swc-win32-ia32-msvc@14.2.28': + resolution: {integrity: sha512-+Kcp1T3jHZnJ9v9VTJ/yf1t/xmtFAc/Sge4v7mVc1z+NYfYzisi8kJ9AsY8itbgq+WgEwMtOpiLLJsUy2qnXZw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.29': - resolution: {integrity: sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw==} + '@next/swc-win32-x64-msvc@14.2.28': + resolution: {integrity: sha512-1gCmpvyhz7DkB1srRItJTnmR2UwQPAUXXIg9r0/56g3O8etGmwlX68skKXJOp9EejW3hhv7nSQUJ2raFiz4MoA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2192,10 +2260,6 @@ packages: resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.2': - resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} - engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.1': resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} @@ -2219,10 +2283,6 @@ packages: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.7.2': - resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} - engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -2254,38 +2314,64 @@ packages: '@noir-lang/types@1.0.0-beta.3': resolution: {integrity: sha512-BPOmf0qDiTn4wH1Lo7mHa67GTQFueIVaDUcUb+N9+ALiXC5nVU8HrzWmx1yvZB64ZiCEy7yPdNEaNrszSrE2fg==} - '@nomicfoundation/edr-darwin-arm64@0.11.0': - resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} + '@nomicfoundation/edr-darwin-arm64@0.8.0': + resolution: {integrity: sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.0': - resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} + '@nomicfoundation/edr-darwin-x64@0.8.0': + resolution: {integrity: sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': - resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': + resolution: {integrity: sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': - resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': + resolution: {integrity: sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': - resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': + resolution: {integrity: sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': - resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': + resolution: {integrity: sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': - resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': + resolution: {integrity: sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.0': - resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} + '@nomicfoundation/edr@0.8.0': + resolution: {integrity: sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==} engines: {node: '>= 18'} + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + '@nomicfoundation/hardhat-chai-matchers@2.0.8': resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} peerDependencies: @@ -2368,10 +2454,10 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' - '@nomicfoundation/hardhat-verify@2.0.14': - resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} + '@nomicfoundation/hardhat-verify@2.0.13': + resolution: {integrity: sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g==} peerDependencies: - hardhat: ^2.24.1 + hardhat: ^2.0.4 '@nomicfoundation/ignition-core@0.15.11': resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} @@ -2411,10 +2497,13 @@ packages: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} - '@openzeppelin/contracts-upgradeable@5.3.0': - resolution: {integrity: sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg==} + '@openzeppelin/contracts-upgradeable@5.2.0': + resolution: {integrity: sha512-mZIu9oa4tQTlGiOJHk6D3LdJlqFqF6oNOSn6S6UVJtzfs9UsY9/dhMEbAVTwElxUtJnjpf6yA062+oBp+eOyPg==} peerDependencies: - '@openzeppelin/contracts': 5.3.0 + '@openzeppelin/contracts': 5.2.0 + + '@openzeppelin/contracts@5.2.0': + resolution: {integrity: sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==} '@openzeppelin/contracts@5.3.0': resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} @@ -2423,8 +2512,8 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' - '@phosphor-icons/react@2.1.10': - resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} + '@phosphor-icons/react@2.1.7': + resolution: {integrity: sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==} engines: {node: '>=10'} peerDependencies: react: '>= 16.8' @@ -2489,9 +2578,6 @@ packages: '@reown/appkit@1.7.3': resolution: {integrity: sha512-aA/UIwi/dVzxEB62xlw3qxHa3RK1YcPMjNxoGj/fHNCqL2qWmbcOXT7coCUa9RG7/Bh26FZ3vdVT2v71j6hebQ==} - '@rolldown/pluginutils@1.0.0-beta.9': - resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} - '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} @@ -2519,103 +2605,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.41.1': - resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.41.1': - resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.41.1': - resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.41.1': - resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.41.1': - resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.41.1': - resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': - resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.41.1': - resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.41.1': - resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.41.1': - resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': - resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': - resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.41.1': - resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.41.1': - resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.41.1': - resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.41.1': - resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.41.1': - resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.41.1': - resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.41.1': - resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.41.1': - resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} cpu: [x64] os: [win32] @@ -2625,8 +2711,8 @@ packages: '@safe-global/safe-apps-sdk@9.1.0': resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - '@safe-global/safe-gateway-typescript-sdk@3.23.1': - resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + '@safe-global/safe-gateway-typescript-sdk@3.22.9': + resolution: {integrity: sha512-7ojVK/crhOaGowEO8uYWaopZzcr5rR76emgllGIfjCLR70aY4PbASpi9Pbs+7jIRzPDBBkM0RBo+zYx5UduX8Q==} engines: {node: '>=16'} '@scure/base@1.1.9': @@ -2665,29 +2751,29 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - '@semaphore-protocol/contracts@4.11.1': - resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} + '@semaphore-protocol/contracts@4.9.2': + resolution: {integrity: sha512-/DnZ9SOzBsfv06Vz74djVHEPgZwIkdNt7e5Ay2612Rw22EwToedQX5ahJxfG9vbgHleOZ1iAV4y+XKmDhPpDBg==} - '@semaphore-protocol/core@4.11.1': - resolution: {integrity: sha512-FYF9k5peTC1dvILBma9kxdBaxl6VHJ3Z87Y74rOryzgSrAZMnwLUg87T5BMf6rtmqd6IP507UbGuMB3G7eTk3g==} + '@semaphore-protocol/core@4.9.2': + resolution: {integrity: sha512-Dc0ZVCcWuCiCA2Y6GXmsRVjpA+sA06dUiGlx+e6CY/8B6xQtz8TQm10DNWayqe0YkL9Bld/JWyN3rdIoZf3uEA==} - '@semaphore-protocol/data@4.11.1': - resolution: {integrity: sha512-vOwZ3ywD6wofUSR1s0tpS8wg1pL0H3rs1S8zHOEJ9zLnnBMFPGgjy6eUI68uoRC9kKDB6/hypDj0ncHyFq6nBA==} + '@semaphore-protocol/data@4.9.2': + resolution: {integrity: sha512-wKkxRrKY6RrTMyaglRH/62cq+zP+6Xn15ViR6O4wrKVzzEv4X3zLbjBNKBW6XgU9Lnh5UbVQFOdAQplvrrwGFw==} - '@semaphore-protocol/group@4.11.1': - resolution: {integrity: sha512-YJwLpAc0sOzlgZwDw62QRj1BJ3PXPQdFYqt0lhNvbhPosFAmjfHW+gr7xYuBku/oQJ4clm+fLQniAd37a+ZXHg==} + '@semaphore-protocol/group@4.9.2': + resolution: {integrity: sha512-NkCYtl3BcaNaGy1Oc5LvDScimDPu47bebqYH9cm+21nLKOsCFNmFcG70if2TY2e1Q/eyvB8tnK01a39nHs4pLw==} - '@semaphore-protocol/identity@4.11.1': - resolution: {integrity: sha512-HVnm8TA7+tz1WiRpLhgiqZspsNfTrtUlArhiYg4GaZz4Xh3Xf8ryjcSVJLIiAmGu0eP46yg8GuRa6vW6I9Oi+g==} + '@semaphore-protocol/identity@4.9.2': + resolution: {integrity: sha512-kHxcAfOyJ5yfo5Y82JCsIc+UD1+nsYg0NA7tRLg/FqYYnkLd/YZ1BkvRGRccZOKUW7S9VQERN7CVqBzXprxjTg==} - '@semaphore-protocol/proof@4.11.1': - resolution: {integrity: sha512-wnSIAUFtcAu/QhBZcq20lJE/7X4fwG6qq/LsDFnLB9GKMYXR2fdBCUPhoER34ojjJqSwrwqW+vk/omb3icqplA==} + '@semaphore-protocol/proof@4.9.2': + resolution: {integrity: sha512-bf8xg12R3mWsywIarEFOFTP/atmrEGPJIwneRliC3dFKT7kzdrZvta2czJGejNURp3PIVIKNRONPkp+JyThNAw==} peerDependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/group': 4.9.2 + '@semaphore-protocol/identity': 4.9.2 - '@semaphore-protocol/utils@4.11.1': - resolution: {integrity: sha512-lTzZo9RV1wUyFXVnDcnSV3cDYfoMfmG17Sl9M1I7L82JX19LBPNJ1olBQbloC6UvyzE6DaqQ783MJnTkWEoDjg==} + '@semaphore-protocol/utils@4.9.2': + resolution: {integrity: sha512-cSDwsk5ADLUaQv++3dX+GhCPm3dJB4/gTUK+Rhv6mPc9JEPk2xrmmDDB7DM+/wOAIK7wfo1IksMLwEK+/Du95Q==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -2736,8 +2822,8 @@ packages: '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - '@solidity-parser/parser@0.20.1': - resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + '@solidity-parser/parser@0.19.0': + resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} @@ -2817,71 +2903,71 @@ packages: resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==} engines: {node: '>=14'} - '@swc/core-darwin-arm64@1.11.29': - resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} + '@swc/core-darwin-arm64@1.11.16': + resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.29': - resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} + '@swc/core-darwin-x64@1.11.16': + resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.29': - resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} + '@swc/core-linux-arm-gnueabihf@1.11.16': + resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.29': - resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} + '@swc/core-linux-arm64-gnu@1.11.16': + resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.29': - resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} + '@swc/core-linux-arm64-musl@1.11.16': + resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.29': - resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} + '@swc/core-linux-x64-gnu@1.11.16': + resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.29': - resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} + '@swc/core-linux-x64-musl@1.11.16': + resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.29': - resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} + '@swc/core-win32-arm64-msvc@1.11.16': + resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.29': - resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} + '@swc/core-win32-ia32-msvc@1.11.16': + resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.29': - resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} + '@swc/core-win32-x64-msvc@1.11.16': + resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.29': - resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} + '@swc/core@1.11.16': + resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': '>=0.5.17' + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true @@ -2889,6 +2975,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -2936,22 +3025,22 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.79.2': - resolution: {integrity: sha512-kr+KQrBuqd6495eP9S41BoftFI1H50XA9O+6FmbnTx/Te6bjiq1mj8rt9rJjW3YZSO2aaUNUres0TWesJW1j1g==} + '@tanstack/query-core@5.74.3': + resolution: {integrity: sha512-Mqk+5o3qTuAiZML248XpNH8r2cOzl15+LTbUsZQEwvSvn1GU4VQhvqzAbil36p+MBxpr/58oBSnRzhrBevDhfg==} - '@tanstack/react-query@5.79.2': - resolution: {integrity: sha512-kadeprsH6bWuhHCpqukXHRykJkxcLBxAaF0cQ05yawPmLZ/KiCpR1DyQenonF7A/70rnRUxhJD0RJejqk9wImQ==} + '@tanstack/react-query@5.74.3': + resolution: {integrity: sha512-QrycUn0wxjVPzITvQvOxFRdhlAwIoOQSuav7qWD4SWCoKCdLbyRZ2vji2GuBq/glaxbF4wBx3fqcYRDOt8KDTA==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.9': - resolution: {integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==} + '@tanstack/react-virtual@3.13.8': + resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.9': - resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} + '@tanstack/virtual-core@3.13.8': + resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} '@theguild/remark-mermaid@0.0.5': resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} @@ -3016,6 +3105,9 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} @@ -3103,6 +3195,9 @@ packages: '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + '@types/node@20.17.30': + resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} + '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -3121,19 +3216,19 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@18.3.6': + resolution: {integrity: sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==} peerDependencies: '@types/react': ^18.0.0 '@types/react-syntax-highlighter@15.5.13': resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + '@types/react@18.3.20': + resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} '@types/resolve@0.0.8': resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} @@ -3217,8 +3312,8 @@ packages: '@viem/anvil@0.0.7': resolution: {integrity: sha512-F+3ljCT1bEt8T4Fzm9gWpIgO3Dc7bzG1TtUtkStkJFMuummqZ8kvYc3UFMo5j3F51fSWZZvEkjs3+i7qf0AOqQ==} - '@vitejs/plugin-react@4.5.0': - resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 @@ -3576,8 +3671,8 @@ packages: axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -3660,11 +3755,11 @@ packages: bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3718,8 +3813,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3819,8 +3914,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001720: - resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} + caniuse-lite@1.0.30001713: + resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4080,8 +4175,8 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - core-js-compat@3.42.0: - resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + core-js-compat@3.41.0: + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4137,8 +4232,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.3.4: + resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} @@ -4351,8 +4446,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4499,8 +4594,8 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -4516,8 +4611,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.15: - resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} + eciesjs@0.4.14: + resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} ejs@3.1.10: @@ -4525,8 +4620,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.162: - resolution: {integrity: sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==} + electron-to-chromium@1.5.137: + resolution: {integrity: sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4625,11 +4720,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} @@ -4647,8 +4737,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + eslint-plugin-react-refresh@0.4.19: + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} peerDependencies: eslint: '>=8.40' @@ -4697,10 +4787,6 @@ packages: resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} engines: {node: '>=0.10.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4770,6 +4856,13 @@ packages: ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} @@ -4781,14 +4874,18 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} - ethers@6.14.3: - resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} @@ -4881,8 +4978,8 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5192,8 +5289,8 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - h3@1.15.3: - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + h3@1.15.1: + resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -5208,13 +5305,13 @@ packages: peerDependencies: hardhat: ^2.0.2 - hardhat-gas-reporter@2.3.0: - resolution: {integrity: sha512-ySdA+044xMQv1BlJu5CYXToHzMexKFfIWxlQTBNNoerx1x96+d15IMdN01iQZ/TJ7NH2V5sU73bz77LoS/PEVw==} + hardhat-gas-reporter@2.2.2: + resolution: {integrity: sha512-xlg3d00wrgUvP2S5tw3Zf6nO7OyS5crK3P6/ZP69i24pz4grM+6oFHGW/eJPSGqiDWBYX+gKp9XoqP4rwRXrdQ==} peerDependencies: hardhat: ^2.16.0 - hardhat@2.24.1: - resolution: {integrity: sha512-3iwrO2liEGCw1rz/l/mlB1rSNexCc4CFcMj0DlvjXGChzmD3sGUgLwWDOZPf+ya8MEm5ZhO1oprRVmb/wVi0YA==} + hardhat@2.22.19: + resolution: {integrity: sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==} hasBin: true peerDependencies: ts-node: '*' @@ -5355,8 +5452,8 @@ packages: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -5401,8 +5498,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - idb-keyval@6.2.2: - resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6025,15 +6122,9 @@ packages: mermaid@10.9.3: resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} - micro-eth-signer@0.14.0: - resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} - micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - micro-packed@0.7.3: - resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} - micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -6328,8 +6419,8 @@ packages: react: '>=16.x <=18.x' react-dom: '>=16.x <=18.x' - next-seo@6.8.0: - resolution: {integrity: sha512-zcxaV67PFXCSf8e6SXxbxPaOTgc8St/esxfsYXfQXMM24UESUVSXFm7f2A9HMkAwa0Gqn4s64HxYZAGfdF4Vhg==} + next-seo@6.6.0: + resolution: {integrity: sha512-0VSted/W6XNtgAtH3D+BZrMLLudqfm0D5DYNJRXHcDgan/1ZF1tDFIsWrmvQlYngALyphPfZ3ZdOqlKpKdvG6w==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' @@ -6342,8 +6433,8 @@ packages: react: '*' react-dom: '*' - next@14.2.29: - resolution: {integrity: sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA==} + next@14.2.28: + resolution: {integrity: sha512-QLEIP/kYXynIxtcKB6vNjtWLVs3Y4Sb+EClTC/CSVzdLD1gIuItccpu/n1lhmduffI32iPGEK2cLLxxt28qgYA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -6792,12 +6883,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.8: - resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} + preact@10.26.5: + resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -6811,8 +6902,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.4.3: - resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} + prettier-plugin-solidity@1.4.2: + resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' @@ -6914,8 +7005,8 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -7011,19 +7102,19 @@ packages: '@types/react': '>=18' react: '>=18' - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-router-dom@6.30.1: - resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} + react-router-dom@6.30.0: + resolution: {integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.30.1: - resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} + react-router@6.30.0: + resolution: {integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -7099,6 +7190,12 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -7244,8 +7341,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.41.1: - resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7308,8 +7405,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -7339,8 +7436,8 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - sharp@0.34.2: - resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: @@ -7359,8 +7456,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} shelljs@0.8.5: @@ -7423,8 +7520,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - solady@0.1.19: - resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} + solady@0.1.13: + resolution: {integrity: sha512-AA/VFTwxihDxk/LE2oN5xBiwE1vQtvmqOl55EDH2RwMuqLmUH1aOEMoGLCO0jyPMBZ3qnvXKfg2oRKy6s7V/zg==} solady@0.1.4: resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} @@ -7440,12 +7537,12 @@ packages: prettier: ^3.0.0 prettier-plugin-solidity: ^1.0.0 - solhint@5.1.0: - resolution: {integrity: sha512-KWg4gnOnznxHXzH0fUvnhnxnk+1R50GiPChcPeQgA7SKQTSF1LLIEh8R1qbkCEn/fFzz4CfJs+Gh7Rl9uhHy+g==} + solhint@5.0.5: + resolution: {integrity: sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==} hasBin: true - solidity-coverage@0.8.16: - resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} + solidity-coverage@0.8.14: + resolution: {integrity: sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==} hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -7636,9 +7733,6 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -7727,8 +7821,8 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} tinygradient@1.1.5: @@ -7827,8 +7921,8 @@ packages: '@swc/wasm': optional: true - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -7871,6 +7965,12 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -7913,6 +8013,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -8041,8 +8146,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unstorage@1.16.0: - resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + unstorage@1.15.0: + resolution: {integrity: sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -8050,7 +8155,7 @@ packages: '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@capacitor/preferences': ^6.0.3 '@deno/kv': '>=0.9.0' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 @@ -8200,16 +8305,16 @@ packages: typescript: optional: true - viem@2.23.7: - resolution: {integrity: sha512-Gbyz0uE3biWDPxECrEyzILWPsnIgDREgfRMuLSWHSSnM6ktefSC/lqQNImnxESdDEixa8/6EWXjmf2H6L9VV0A==} + viem@2.30.6: + resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - viem@2.30.6: - resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} + viem@2.7.14: + resolution: {integrity: sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -8247,8 +8352,8 @@ packages: vite: optional: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + vite@5.4.18: + resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8315,9 +8420,6 @@ packages: web-worker@1.2.0: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - web-worker@1.5.0: - resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} @@ -8474,9 +8576,9 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} hasBin: true yargs-parser@18.1.3: @@ -8524,8 +8626,8 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.25.48: - resolution: {integrity: sha512-0X1mz8FtgEIvaxGjdIImYpZEaZMrund9pGXm3M6vM7Reba0e2eI71KPjSCGXBfwKDPwPoywf6waUKc3/tFvX2Q==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} @@ -8554,8 +8656,6 @@ snapshots: '@adraffy/ens-normalize@1.10.1': {} - '@adraffy/ens-normalize@1.11.0': {} - '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -8567,35 +8667,35 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.3': {} + '@babel/compat-data@7.26.8': {} - '@babel/core@7.27.4': + '@babel/core@7.26.10': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.4 - '@babel/parser': 7.27.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8604,56 +8704,56 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.27.0 jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.27.3': + '@babel/generator@7.27.0': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.27.0': dependencies: - '@babel/compat-data': 7.27.3 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.27.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -8661,699 +8761,720 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': + '@babel/helper-module-imports@7.25.9(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.4': + '@babel/helpers@7.27.0': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 - '@babel/parser@7.27.4': + '@babel/parser@7.27.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoping@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/traverse': 7.27.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.27.0 - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.3 + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-regenerator@7.27.4(@babel/core@7.27.4)': + '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + regenerator-transform: 0.15.2 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.27.2(@babel/core@7.27.4)': - dependencies: - '@babel/compat-data': 7.27.3 - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-regenerator': 7.27.4(@babel/core@7.27.4) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/preset-env@7.26.9(@babel/core@7.26.10)': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) + core-js-compat: 3.41.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.3 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.27.0 esutils: 2.0.3 - '@babel/preset-react@7.27.1(@babel/core@7.27.4)': + '@babel/preset-react@7.26.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.4': {} + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 - '@babel/template@7.27.2': + '@babel/template@7.27.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@babel/traverse@7.23.2': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 - debug: 4.4.1(supports-color@5.5.0) + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.4(supports-color@5.5.0)': + '@babel/traverse@7.27.0(supports-color@5.5.0)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.3 - '@babel/parser': 7.27.4 - '@babel/template': 7.27.2 - '@babel/types': 7.27.3 - debug: 4.4.1(supports-color@5.5.0) + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.17.0': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.25.9 to-fast-properties: 2.0.0 - '@babel/types@7.27.3': + '@babel/types@7.27.0': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@braintree/sanitize-url@6.0.4': {} '@coinbase/wallet-sdk@3.9.3': dependencies: - bn.js: 5.2.2 + bn.js: 5.2.1 buffer: 6.0.3 clsx: 1.2.1 eth-block-tracker: 7.1.0 eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.26.8 + preact: 10.26.5 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -9363,7 +9484,7 @@ snapshots: '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.26.8 + preact: 10.26.5 '@colors/colors@1.5.0': optional: true @@ -9372,20 +9493,20 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@depay/solana-web3.js@1.98.2': + '@depay/solana-web3.js@1.98.1': dependencies: bs58: 5.0.0 - '@depay/web3-blockchains@9.8.6': {} + '@depay/web3-blockchains@9.8.2': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)': dependencies: - '@depay/solana-web3.js': 1.98.2 - '@depay/web3-blockchains': 9.8.6 + '@depay/solana-web3.js': 1.98.1 + '@depay/web3-blockchains': 9.8.2 '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/web3-blockchains': 9.8.6 + '@depay/web3-blockchains': 9.8.2 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -9393,8 +9514,8 @@ snapshots: '@depay/web3-mock@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/solana-web3.js': 1.98.2 - '@depay/web3-blockchains': 9.8.6 + '@depay/solana-web3.js': 1.98.1 + '@depay/web3-blockchains': 9.8.2 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -9411,8 +9532,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/runtime': 7.27.4 + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.27.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -9449,9 +9570,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -9461,7 +9582,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.23 + '@types/react': 18.3.20 transitivePeerDependencies: - supports-color @@ -9696,7 +9817,7 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.5.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -9706,7 +9827,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -9726,8 +9847,6 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} - '@ethereumjs/rlp@5.0.2': {} - '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 @@ -9741,11 +9860,6 @@ snapshots: ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 - '@ethereumjs/util@9.1.0': - dependencies: - '@ethereumjs/rlp': 5.0.2 - ethereum-cryptography: 2.2.1 - '@ethersproject/abi@5.8.0': dependencies: '@ethersproject/address': 5.8.0 @@ -9805,7 +9919,7 @@ snapshots: dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 - bn.js: 5.2.2 + bn.js: 5.2.1 '@ethersproject/bytes@5.8.0': dependencies: @@ -9938,7 +10052,7 @@ snapshots: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 '@ethersproject/properties': 5.8.0 - bn.js: 5.2.2 + bn.js: 5.2.1 elliptic: 6.6.1 hash.js: 1.1.7 @@ -10012,7 +10126,7 @@ snapshots: '@excubiae/contracts@0.4.0': dependencies: '@openzeppelin/contracts': 5.3.0 - '@semaphore-protocol/contracts': 4.11.1 + '@semaphore-protocol/contracts': 4.9.2 solady: 0.1.4 '@fastify/busboy@2.1.1': {} @@ -10025,7 +10139,7 @@ snapshots: '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10033,7 +10147,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10049,12 +10163,12 @@ snapshots: fastfile: 0.0.20 ffjavascript: 0.3.0 - '@img/sharp-darwin-arm64@0.34.2': + '@img/sharp-darwin-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.34.2': + '@img/sharp-darwin-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true @@ -10086,48 +10200,45 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.34.2': + '@img/sharp-linux-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.34.2': + '@img/sharp-linux-arm@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.34.2': + '@img/sharp-linux-s390x@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.34.2': + '@img/sharp-linux-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.2': + '@img/sharp-linuxmusl-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.2': + '@img/sharp-linuxmusl-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.34.2': + '@img/sharp-wasm32@0.34.1': dependencies: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-arm64@0.34.2': + '@img/sharp-win32-ia32@0.34.1': optional: true - '@img/sharp-win32-ia32@0.34.2': - optional: true - - '@img/sharp-win32-x64@0.34.2': + '@img/sharp-win32-x64@0.34.1': optional: true '@isaacs/cliui@8.0.2': @@ -10192,7 +10303,7 @@ snapshots: '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.23 + '@types/react': 18.3.20 react: 18.3.1 '@metamask/eth-json-rpc-provider@1.0.1': @@ -10203,6 +10314,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + '@metamask/json-rpc-engine@7.3.3': dependencies: '@metamask/rpc-errors': 6.4.0 @@ -10265,13 +10384,13 @@ snapshots: '@metamask/safe-event-emitter@3.1.2': {} - '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@5.5.0) - eciesjs: 0.4.15 + debug: 4.4.0(supports-color@8.1.1) + eciesjs: 0.4.14 eventemitter2: 6.4.9 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -10286,16 +10405,16 @@ snapshots: '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.32.0 '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@5.5.0) - eciesjs: 0.4.15 + debug: 4.4.0(supports-color@8.1.1) + eciesjs: 0.4.14 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 obj-multiplex: 1.0.0 @@ -10317,8 +10436,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) - semver: 7.7.2 + debug: 4.4.0(supports-color@8.1.1) + semver: 7.7.1 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -10330,9 +10449,9 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) pony-cause: 2.1.11 - semver: 7.7.2 + semver: 7.7.1 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10344,9 +10463,9 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) pony-cause: 2.1.11 - semver: 7.7.2 + semver: 7.7.1 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10365,7 +10484,7 @@ snapshots: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 hey-listen: 1.0.8 - tslib: 2.8.1 + tslib: 2.7.0 '@motionone/easing@10.18.0': dependencies: @@ -10445,33 +10564,33 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@14.2.29': {} + '@next/env@14.2.28': {} - '@next/swc-darwin-arm64@14.2.29': + '@next/swc-darwin-arm64@14.2.28': optional: true - '@next/swc-darwin-x64@14.2.29': + '@next/swc-darwin-x64@14.2.28': optional: true - '@next/swc-linux-arm64-gnu@14.2.29': + '@next/swc-linux-arm64-gnu@14.2.28': optional: true - '@next/swc-linux-arm64-musl@14.2.29': + '@next/swc-linux-arm64-musl@14.2.28': optional: true - '@next/swc-linux-x64-gnu@14.2.29': + '@next/swc-linux-x64-gnu@14.2.28': optional: true - '@next/swc-linux-x64-musl@14.2.29': + '@next/swc-linux-x64-musl@14.2.28': optional: true - '@next/swc-win32-arm64-msvc@14.2.29': + '@next/swc-win32-arm64-msvc@14.2.28': optional: true - '@next/swc-win32-ia32-msvc@14.2.29': + '@next/swc-win32-ia32-msvc@14.2.28': optional: true - '@next/swc-win32-x64-msvc@14.2.29': + '@next/swc-win32-x64-msvc@14.2.28': optional: true '@noble/ciphers@1.2.1': {} @@ -10494,10 +10613,6 @@ snapshots: dependencies: '@noble/hashes': 1.7.1 - '@noble/curves@1.8.2': - dependencies: - '@noble/hashes': 1.7.2 - '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 @@ -10512,8 +10627,6 @@ snapshots: '@noble/hashes@1.7.1': {} - '@noble/hashes@1.7.2': {} - '@noble/hashes@1.8.0': {} '@noble/secp256k1@1.7.1': {} @@ -10544,117 +10657,137 @@ snapshots: '@noir-lang/types@1.0.0-beta.3': {} - '@nomicfoundation/edr-darwin-arm64@0.11.0': {} + '@nomicfoundation/edr-darwin-arm64@0.8.0': {} + + '@nomicfoundation/edr-darwin-x64@0.8.0': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': {} - '@nomicfoundation/edr-darwin-x64@0.11.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} + '@nomicfoundation/edr@0.8.0': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.8.0 + '@nomicfoundation/edr-darwin-x64': 0.8.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.8.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-x64-musl': 0.8.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.8.0 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg - '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 - '@nomicfoundation/edr@0.11.0': + '@nomicfoundation/ethereumjs-util@9.0.4': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.0 - '@nomicfoundation/edr-darwin-x64': 0.11.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-x64-musl': 0.11.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(3c85381c0b45919662d061966161e2b7)': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10662,15 +10795,15 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10678,89 +10811,89 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(c9628f5d47e1b74ed759ca13ebe35860)': + '@nomicfoundation/hardhat-toolbox@4.0.0(55894f249afdd64a69e3e7ac6a284d95)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.10.4 + '@types/node': 20.17.30 chai: 4.5.0 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(21ac015ac60478c81ef64632993d75d8)': + '@nomicfoundation/hardhat-toolbox@5.0.0(248454f03b5d7796fe0b22b5b4b634ab)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(3c85381c0b45919662d061966161e2b7) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@nomicfoundation/hardhat-toolbox@5.0.0(d1703b8c85cc657c19a30d0af9337a0a)': + '@nomicfoundation/hardhat-toolbox@5.0.0(a7f0110eca458f09074d1c2612ad945e)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - typescript: 5.5.4 + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + typechain: 8.3.2(typescript@5.8.2) + typescript: 5.8.2 - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10769,13 +10902,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10784,13 +10917,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10804,8 +10937,8 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + debug: 4.4.0(supports-color@8.1.1) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 lodash: 4.17.21 @@ -10848,15 +10981,17 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@openzeppelin/contracts-upgradeable@5.3.0(@openzeppelin/contracts@5.3.0)': + '@openzeppelin/contracts-upgradeable@5.2.0(@openzeppelin/contracts@5.2.0)': dependencies: - '@openzeppelin/contracts': 5.3.0 + '@openzeppelin/contracts': 5.2.0 + + '@openzeppelin/contracts@5.2.0': {} '@openzeppelin/contracts@5.3.0': {} '@paulmillr/qr@0.2.1': {} - '@phosphor-icons/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@phosphor-icons/react@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10899,24 +11034,80 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@reown/appkit-controllers@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10948,12 +11139,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48)': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) lit: 3.1.0 transitivePeerDependencies: @@ -10984,13 +11175,14 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) lit: 3.1.0 - qrcode: 1.5.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11016,18 +11208,16 @@ snapshots: - typescript - uploadthing - utf-8-validate + - valtio - zod - '@reown/appkit-utils@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48)': + '@reown/appkit-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + lit: 3.1.0 + qrcode: 1.5.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11055,31 +11245,50 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@reown/appkit-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) - '@reown/appkit-polyfills': 1.7.3 - '@walletconnect/logger': 2.1.2 - zod: 3.22.4 + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) + lit: 3.1.0 + qrcode: 1.5.3 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch - bufferutil + - db0 + - encoding + - ioredis + - react - typescript + - uploadthing - utf-8-validate + - zod - '@reown/appkit@1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@reown/appkit-utils@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.48) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - bs58: 6.0.0 - valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11107,91 +11316,240 @@ snapshots: - utf-8-validate - zod - '@rolldown/pluginutils@1.0.0-beta.9': {} - - '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': + '@reown/appkit-utils@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.41.1) - estree-walker: 2.0.2 - magic-string: 0.30.17 + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.3 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.3 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-polyfills': 1.7.3 + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) + '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) + '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@rollup/plugin-inject@5.0.5(rollup@4.40.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + estree-walker: 2.0.2 + magic-string: 0.30.17 optionalDependencies: - rollup: 4.41.1 + rollup: 4.40.0 - '@rollup/plugin-virtual@3.0.2(rollup@4.41.1)': + '@rollup/plugin-virtual@3.0.2(rollup@4.40.0)': optionalDependencies: - rollup: 4.41.1 + rollup: 4.40.0 - '@rollup/pluginutils@5.1.4(rollup@4.41.1)': + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.41.1 + rollup: 4.40.0 - '@rollup/rollup-android-arm-eabi@4.41.1': + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true - '@rollup/rollup-android-arm64@4.41.1': + '@rollup/rollup-android-arm64@4.40.0': optional: true - '@rollup/rollup-darwin-arm64@4.41.1': + '@rollup/rollup-darwin-arm64@4.40.0': optional: true - '@rollup/rollup-darwin-x64@4.41.1': + '@rollup/rollup-darwin-x64@4.40.0': optional: true - '@rollup/rollup-freebsd-arm64@4.41.1': + '@rollup/rollup-freebsd-arm64@4.40.0': optional: true - '@rollup/rollup-freebsd-x64@4.41.1': + '@rollup/rollup-freebsd-x64@4.40.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.41.1': + '@rollup/rollup-linux-arm-musleabihf@4.40.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.41.1': + '@rollup/rollup-linux-arm64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.41.1': + '@rollup/rollup-linux-arm64-musl@4.40.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.41.1': + '@rollup/rollup-linux-riscv64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.41.1': + '@rollup/rollup-linux-riscv64-musl@4.40.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.41.1': + '@rollup/rollup-linux-s390x-gnu@4.40.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.41.1': + '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-x64-musl@4.41.1': + '@rollup/rollup-linux-x64-musl@4.40.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.41.1': + '@rollup/rollup-win32-arm64-msvc@4.40.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.41.1': + '@rollup/rollup-win32-ia32-msvc@4.40.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.41.1': + '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -11199,17 +11557,27 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.22.9 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@safe-global/safe-gateway-typescript-sdk': 3.22.9 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} + '@safe-global/safe-gateway-typescript-sdk@3.22.9': {} '@scure/base@1.1.9': {} @@ -11270,51 +11638,48 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@semaphore-protocol/contracts@4.11.1': + '@semaphore-protocol/contracts@4.9.2': dependencies: '@zk-kit/lean-imt.sol': 2.0.1 - '@semaphore-protocol/core@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/core@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/proof': 4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.9.2 + '@semaphore-protocol/identity': 4.9.2 + '@semaphore-protocol/proof': 4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@semaphore-protocol/data@4.11.1(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@semaphore-protocol/data@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/utils': 1.3.0 axios: 1.6.6 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - viem: 2.23.7(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) transitivePeerDependencies: - bufferutil - debug - - typescript - utf-8-validate - - zod - '@semaphore-protocol/group@4.11.1': + '@semaphore-protocol/group@4.9.2': dependencies: '@zk-kit/lean-imt': 2.2.3 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/identity@4.11.1': + '@semaphore-protocol/identity@4.9.2': dependencies: '@zk-kit/baby-jubjub': 1.0.3 '@zk-kit/eddsa-poseidon': 1.0.4 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/proof@4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/proof@4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.9.2 + '@semaphore-protocol/identity': 4.9.2 + '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/artifacts': 1.8.0 '@zk-kit/utils': 1.3.0 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11323,9 +11688,9 @@ snapshots: - bufferutil - utf-8-validate - '@semaphore-protocol/utils@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/utils@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11395,58 +11760,58 @@ snapshots: dependencies: antlr4ts: 0.5.0-alpha.4 - '@solidity-parser/parser@0.20.1': {} + '@solidity-parser/parser@0.19.0': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.26.10 - '@svgr/babel-preset@8.1.0(@babel/core@7.27.4)': + '@svgr/babel-preset@8.1.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.10) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.10) - '@svgr/core@8.1.0(typescript@5.5.4)': + '@svgr/core@8.1.0(typescript@5.8.2)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.5.4) + cosmiconfig: 8.3.6(typescript@5.8.2) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -11454,92 +11819,98 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.4))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) - '@svgr/core': 8.1.0(typescript@5.5.4) + '@babel/core': 7.26.10 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) + '@svgr/core': 8.1.0(typescript@5.8.2) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2)': dependencies: - '@svgr/core': 8.1.0(typescript@5.5.4) - cosmiconfig: 8.3.6(typescript@5.5.4) + '@svgr/core': 8.1.0(typescript@5.8.2) + cosmiconfig: 8.3.6(typescript@5.8.2) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/rollup@8.1.0(rollup@4.41.1)(typescript@5.5.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@rollup/pluginutils': 5.1.4(rollup@4.41.1) - '@svgr/core': 8.1.0(typescript@5.5.4) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4))(typescript@5.5.4) + '@svgr/rollup@8.1.0(rollup@4.40.0)(typescript@5.8.2)': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-react': 7.26.3(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@svgr/core': 8.1.0(typescript@5.8.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2) transitivePeerDependencies: - rollup - supports-color - typescript - '@swc/core-darwin-arm64@1.11.29': + '@swc/core-darwin-arm64@1.11.16': optional: true - '@swc/core-darwin-x64@1.11.29': + '@swc/core-darwin-x64@1.11.16': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.29': + '@swc/core-linux-arm-gnueabihf@1.11.16': optional: true - '@swc/core-linux-arm64-gnu@1.11.29': + '@swc/core-linux-arm64-gnu@1.11.16': optional: true - '@swc/core-linux-arm64-musl@1.11.29': + '@swc/core-linux-arm64-musl@1.11.16': optional: true - '@swc/core-linux-x64-gnu@1.11.29': + '@swc/core-linux-x64-gnu@1.11.16': optional: true - '@swc/core-linux-x64-musl@1.11.29': + '@swc/core-linux-x64-musl@1.11.16': optional: true - '@swc/core-win32-arm64-msvc@1.11.29': + '@swc/core-win32-arm64-msvc@1.11.16': optional: true - '@swc/core-win32-ia32-msvc@1.11.29': + '@swc/core-win32-ia32-msvc@1.11.16': optional: true - '@swc/core-win32-x64-msvc@1.11.29': + '@swc/core-win32-x64-msvc@1.11.16': optional: true - '@swc/core@1.11.29': + '@swc/core@1.11.16(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.29 - '@swc/core-darwin-x64': 1.11.29 - '@swc/core-linux-arm-gnueabihf': 1.11.29 - '@swc/core-linux-arm64-gnu': 1.11.29 - '@swc/core-linux-arm64-musl': 1.11.29 - '@swc/core-linux-x64-gnu': 1.11.29 - '@swc/core-linux-x64-musl': 1.11.29 - '@swc/core-win32-arm64-msvc': 1.11.29 - '@swc/core-win32-ia32-msvc': 1.11.29 - '@swc/core-win32-x64-msvc': 1.11.29 + '@swc/core-darwin-arm64': 1.11.16 + '@swc/core-darwin-x64': 1.11.16 + '@swc/core-linux-arm-gnueabihf': 1.11.16 + '@swc/core-linux-arm64-gnu': 1.11.16 + '@swc/core-linux-arm64-musl': 1.11.16 + '@swc/core-linux-x64-gnu': 1.11.16 + '@swc/core-linux-x64-musl': 1.11.16 + '@swc/core-win32-arm64-msvc': 1.11.16 + '@swc/core-win32-ia32-msvc': 1.11.16 + '@swc/core-win32-x64-msvc': 1.11.16 + '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + optional: true + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -11549,14 +11920,14 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.9.9(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11566,7 +11937,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)': + '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -11577,7 +11948,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) + tsup: 8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -11594,10 +11965,10 @@ snapshots: dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11614,10 +11985,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11634,14 +12005,14 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11662,28 +12033,36 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) - '@tanstack/query-core@5.79.2': {} + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)))': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + + '@tanstack/query-core@5.74.3': {} - '@tanstack/react-query@5.79.2(react@18.3.1)': + '@tanstack/react-query@5.74.3(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.79.2 + '@tanstack/query-core': 5.74.3 react: 18.3.1 - '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.13.9 + '@tanstack/virtual-core': 3.13.8 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.13.9': {} + '@tanstack/virtual-core@3.13.8': {} '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: @@ -11701,7 +12080,7 @@ snapshots: '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.27.4 + '@babel/parser': 7.27.0 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -11720,44 +12099,51 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': + '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': dependencies: - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': + dependencies: + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.2) + typechain: 8.3.2(typescript@5.8.2) + typescript: 5.8.2 + + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.5.4) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/ethers-v6': 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.5.4) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.8.2) '@types/acorn@4.0.6': dependencies: @@ -11765,24 +12151,28 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.4 - '@babel/types': 7.27.3 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.0 + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 20.10.4 '@types/bn.js@5.1.6': dependencies: @@ -11876,6 +12266,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.30': + dependencies: + undici-types: 6.19.8 + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -11892,17 +12286,17 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/qs@6.14.0': {} + '@types/qs@6.9.18': {} - '@types/react-dom@18.3.7(@types/react@18.3.23)': + '@types/react-dom@18.3.6(@types/react@18.3.20)': dependencies: - '@types/react': 18.3.23 + '@types/react': 18.3.20 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 18.3.23 + '@types/react': 18.3.20 - '@types/react@18.3.23': + '@types/react@18.3.20': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -11941,6 +12335,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -11965,20 +12377,33 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -11994,7 +12419,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: @@ -12002,11 +12427,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12020,26 +12457,41 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.1 ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -12048,7 +12500,7 @@ snapshots: '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) @@ -12057,9 +12509,20 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) @@ -12086,28 +12549,27 @@ snapshots: - debug - utf-8-validate - '@vitejs/plugin-react@4.5.0(vite@5.4.19(@types/node@22.7.5))': + '@vitejs/plugin-react@4.3.4(vite@5.4.18(@types/node@22.7.5))': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) - '@rolldown/pluginutils': 1.0.0-beta.9 + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 5.4.19(@types/node@22.7.5) + react-refresh: 0.14.2 + vite: 5.4.18(@types/node@22.7.5) transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.8.3(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)': + '@wagmi/connectors@5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)) - '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) + '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -12137,14 +12599,53 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))': + '@wagmi/connectors@5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': + dependencies: + '@coinbase/wallet-sdk': 4.3.0 + '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) + '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - supports-color + - uploadthing + - utf-8-validate + - zod + + '@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.5.4) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + zustand: 5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.79.2 + '@tanstack/query-core': 5.74.3 typescript: 5.5.4 transitivePeerDependencies: - '@types/react' @@ -12152,7 +12653,22 @@ snapshots: - react - use-sync-external-store - '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.2) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + zustand: 5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.74.3 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12166,7 +12682,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12195,7 +12711,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12208,8 +12724,8 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12238,23 +12754,25 @@ snapshots: - utf-8-validate - zod - '@walletconnect/environment@1.0.1': - dependencies: - tslib: 1.14.1 - - '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@reown/appkit': 1.7.3(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.20.2 - '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 events: 3.3.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12267,7 +12785,131 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@reown/appkit': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.20.2 + '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@reown/appkit': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.20.2 + '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -12332,8 +12974,8 @@ snapshots: '@walletconnect/keyvaluestorage@1.1.1': dependencies: '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.2 - unstorage: 1.16.0(idb-keyval@6.2.2) + idb-keyval: 6.2.1 + unstorage: 1.15.0(idb-keyval@6.2.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12374,16 +13016,86 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12409,16 +13121,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12504,7 +13216,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -12513,9 +13225,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -12543,7 +13255,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -12552,9 +13264,48 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -12575,14 +13326,139 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -12593,14 +13469,14 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 + '@walletconnect/types': 2.20.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12625,7 +13501,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)': + '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -12643,7 +13519,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12712,24 +13588,35 @@ snapshots: abbrev@1.0.9: {} - abitype@1.0.0(typescript@5.5.4)(zod@3.25.48): + abitype@1.0.0(typescript@5.8.2)(zod@3.24.4): optionalDependencies: - typescript: 5.5.4 - zod: 3.25.48 + typescript: 5.8.2 + zod: 3.24.4 + + abitype@1.0.0(typescript@5.8.3)(zod@3.24.4): + optionalDependencies: + typescript: 5.8.3 + zod: 3.24.4 abitype@1.0.8(typescript@5.5.4)(zod@3.22.4): optionalDependencies: typescript: 5.5.4 zod: 3.22.4 - abitype@1.0.8(typescript@5.5.4)(zod@3.25.48): + abitype@1.0.8(typescript@5.5.4)(zod@3.24.4): optionalDependencies: typescript: 5.5.4 - zod: 3.25.48 + zod: 3.24.4 - abitype@1.0.8(typescript@5.8.3): + abitype@1.0.8(typescript@5.8.2)(zod@3.22.4): optionalDependencies: - typescript: 5.8.3 + typescript: 5.8.2 + zod: 3.22.4 + + abitype@1.0.8(typescript@5.8.2)(zod@3.24.4): + optionalDependencies: + typescript: 5.8.2 + zod: 3.24.4 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -12751,7 +13638,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12842,7 +13729,7 @@ snapshots: asn1.js@4.10.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 inherits: 2.0.4 minimalistic-assert: 1.0.1 @@ -12876,29 +13763,29 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.4): + autoprefixer@10.4.21(postcss@8.5.3): dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001720 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001713 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@0.21.4(debug@4.4.1): + axios@0.21.4(debug@4.4.0): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) transitivePeerDependencies: - debug axios@1.6.6: dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12906,15 +13793,15 @@ snapshots: axios@1.6.7: dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0: + axios@1.8.4: dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12924,42 +13811,42 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): dependencies: - '@babel/compat-data': 7.27.3 - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + core-js-compat: 3.41.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -13012,9 +13899,9 @@ snapshots: bn.js@4.11.6: {} - bn.js@4.12.2: {} + bn.js@4.12.1: {} - bn.js@5.2.2: {} + bn.js@5.2.1: {} boolbase@1.0.0: {} @@ -13078,13 +13965,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.1 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.1 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -13099,12 +13986,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.25.0: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001720 - electron-to-chromium: 1.5.162 + caniuse-lite: 1.0.30001713 + electron-to-chromium: 1.5.137 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + update-browserslist-db: 1.1.3(browserslist@4.24.4) bs58@4.0.1: dependencies: @@ -13167,7 +14054,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.2.0 + http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.1 @@ -13200,7 +14087,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001720: {} + caniuse-lite@1.0.30001713: {} caseless@0.12.0: {} @@ -13429,7 +14316,7 @@ snapshots: chalk: 4.1.2 lodash: 4.17.21 rxjs: 7.8.2 - shell-quote: 1.8.3 + shell-quote: 1.8.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -13439,12 +14326,32 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.79.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)): + connectkit@1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + dependencies: + '@tanstack/react-query': 5.74.3(react@18.3.1) + buffer: 6.0.3 + detect-browser: 5.3.0 + family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + qrcode: 1.5.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + transitivePeerDependencies: + - '@babel/core' + - react-is + + connectkit@1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): dependencies: - '@tanstack/react-query': 5.79.2(react@18.3.1) + '@tanstack/react-query': 5.74.3(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)) + family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -13452,9 +14359,9 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - wagmi: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) + styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) transitivePeerDependencies: - '@babel/core' - react-is @@ -13471,9 +14378,9 @@ snapshots: cookie@0.4.2: {} - core-js-compat@3.42.0: + core-js-compat@3.41.0: dependencies: - browserslist: 4.25.0 + browserslist: 4.24.4 core-util-is@1.0.3: {} @@ -13489,14 +14396,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.5.4): + cosmiconfig@8.3.6(typescript@5.8.2): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.2 cosmiconfig@8.3.6(typescript@5.8.3): dependencies: @@ -13511,7 +14418,7 @@ snapshots: create-ecdh@4.0.4: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 elliptic: 6.6.1 create-hash@1.2.0: @@ -13561,7 +14468,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.5: + crossws@0.3.4: dependencies: uncrypto: 0.1.3 @@ -13799,7 +14706,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 dayjs@1.11.13: {} @@ -13809,13 +14716,13 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@5.5.0): + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -13871,9 +14778,9 @@ snapshots: dequal@2.0.3: {} - derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)): + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1)): dependencies: - valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) des.js@1.1.0: dependencies: @@ -13898,7 +14805,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -13945,7 +14852,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - dotenv@16.5.0: {} + dotenv@16.4.7: {} dunder-proto@1.0.1: dependencies: @@ -13966,7 +14873,7 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.15: + eciesjs@0.4.14: dependencies: '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 @@ -13977,13 +14884,13 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.162: {} + electron-to-chromium@1.5.137: {} elkjs@0.9.3: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -14135,15 +15042,6 @@ snapshots: escape-string-regexp@5.0.0: {} - escodegen@1.14.3: - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - escodegen@1.8.1: dependencies: esprima: 2.7.3 @@ -14161,7 +15059,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.19(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -14174,7 +15072,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -14185,7 +15083,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14237,8 +15135,6 @@ snapshots: estraverse@1.9.3: {} - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: @@ -14291,7 +15187,7 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.9.0 + axios: 1.8.4 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -14361,10 +15257,25 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.1 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.1 + create-hash: 1.2.0 + elliptic: 6.6.1 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.6 - bn.js: 5.2.2 + bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -14418,7 +15329,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -14436,6 +15347,11 @@ snapshots: bn.js: 4.11.6 number-to-bn: 1.7.0 + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + eventemitter2@6.4.9: {} eventemitter3@4.0.7: {} @@ -14494,12 +15410,19 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48)): + family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) - wagmi: 2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + + family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) fast-deep-equal@3.1.3: {} @@ -14533,7 +15456,7 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -14607,9 +15530,9 @@ snapshots: focus-visible@5.2.1: {} - follow-redirects@1.15.9(debug@4.4.1): + follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -14652,13 +15575,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) style-value-types: 5.0.0 - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 framesync@6.0.1: dependencies: - tslib: 2.8.1 + tslib: 2.7.0 fs-extra@10.1.0: dependencies: @@ -14905,10 +15828,10 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - h3@1.15.3: + h3@1.15.1: dependencies: cookie-es: 1.2.2 - crossws: 0.3.5 + crossws: 0.3.4 defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 @@ -14939,11 +15862,11 @@ snapshots: '@ethersproject/solidity': 5.8.0 '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 - '@types/qs': 6.14.0 - axios: 0.21.4(debug@4.4.1) + '@types/qs': 6.9.18 + axios: 0.21.4(debug@4.4.0) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -14957,11 +15880,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14969,11 +15892,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14981,24 +15904,24 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat-gas-reporter@2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 '@ethersproject/units': 5.8.0 - '@solidity-parser/parser': 0.20.1 - axios: 1.9.0 + '@solidity-parser/parser': 0.19.0 + axios: 1.8.4 brotli-wasm: 2.0.1 chalk: 4.1.2 cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.4.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + viem: 2.7.14(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - bufferutil - debug @@ -15006,11 +15929,14 @@ snapshots: - utf-8-validate - zod - hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: - '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.8.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -15021,10 +15947,11 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -15033,7 +15960,6 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 - micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -15041,27 +15967,31 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.0) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.12 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - bufferutil + - c-kzg - supports-color - utf-8-validate - hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: - '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.8.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -15072,10 +16002,11 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -15084,7 +16015,6 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 - micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -15092,27 +16022,31 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.0) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.12 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil + - c-kzg - supports-color - utf-8-validate - hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10): dependencies: - '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.8.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -15123,10 +16057,11 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -15135,7 +16070,6 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 - micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -15143,19 +16077,20 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.0) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.12 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) - typescript: 5.5.4 + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - bufferutil + - c-kzg - supports-color - utf-8-validate @@ -15231,7 +16166,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.1.0 + property-information: 7.0.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -15294,7 +16229,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.16 unist-util-position: 5.0.0 @@ -15338,7 +16273,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 he@1.2.0: {} @@ -15374,7 +16309,7 @@ snapshots: http-response-object: 3.0.2 parse-cache-control: 1.0.1 - http-cache-semantics@4.2.0: {} + http-cache-semantics@4.1.1: {} http-errors@2.0.0: dependencies: @@ -15387,7 +16322,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15406,7 +16341,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15424,7 +16359,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb-keyval@6.2.2: {} + idb-keyval@6.2.1: {} ieee754@1.2.1: {} @@ -15865,7 +16800,7 @@ snapshots: match-sorter@6.3.4: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 remove-accents: 0.5.0 math-intrinsics@1.1.0: {} @@ -16151,25 +17086,15 @@ snapshots: lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.6 + stylis: 4.2.0 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.5.0 + web-worker: 1.2.0 transitivePeerDependencies: - supports-color - micro-eth-signer@0.14.0: - dependencies: - '@noble/curves': 1.8.2 - '@noble/hashes': 1.7.2 - micro-packed: 0.7.3 - micro-ftch@0.3.1: {} - micro-packed@0.7.3: - dependencies: - '@scure/base': 1.2.6 - micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.1.0 @@ -16536,7 +17461,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -16558,7 +17483,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16584,7 +17509,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 brorand: 1.1.0 mime-db@1.52.0: {} @@ -16625,6 +17550,10 @@ snapshots: optionalDependencies: typescript: 5.5.4 + mipd@0.0.7(typescript@5.8.2): + optionalDependencies: + typescript: 5.8.2 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -16640,7 +17569,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -16703,45 +17632,45 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-seo@6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.29 + '@next/env': 14.2.28 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001720 + caniuse-lite: 1.0.30001713 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.29 - '@next/swc-darwin-x64': 14.2.29 - '@next/swc-linux-arm64-gnu': 14.2.29 - '@next/swc-linux-arm64-musl': 14.2.29 - '@next/swc-linux-x64-gnu': 14.2.29 - '@next/swc-linux-x64-musl': 14.2.29 - '@next/swc-win32-arm64-msvc': 14.2.29 - '@next/swc-win32-ia32-msvc': 14.2.29 - '@next/swc-win32-x64-msvc': 14.2.29 + '@next/swc-darwin-arm64': 14.2.28 + '@next/swc-darwin-x64': 14.2.28 + '@next/swc-linux-arm64-gnu': 14.2.28 + '@next/swc-linux-arm64-musl': 14.2.28 + '@next/swc-linux-x64-gnu': 14.2.28 + '@next/swc-linux-x64-musl': 14.2.28 + '@next/swc-win32-arm64-msvc': 14.2.28 + '@next/swc-win32-ia32-msvc': 14.2.28 + '@next/swc-win32-x64-msvc': 14.2.28 '@playwright/test': 1.52.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -16752,16 +17681,16 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 - zod: 3.25.48 + zod: 3.24.4 - nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 @@ -16775,7 +17704,7 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.22 lodash.get: 4.4.2 - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 @@ -16791,7 +17720,7 @@ snapshots: title: 3.5.3 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 - zod: 3.25.48 + zod: 3.24.4 transitivePeerDependencies: - supports-color @@ -16961,23 +17890,37 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.6.7(typescript@5.5.4)(zod@3.25.48): + ox@0.6.7(typescript@5.5.4)(zod@3.24.4): dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - zod + ox@0.6.7(typescript@5.8.2)(zod@3.24.4): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - zod + ox@0.7.1(typescript@5.5.4)(zod@3.22.4): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.10.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -16990,33 +17933,48 @@ snapshots: transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.5.4)(zod@3.25.48): + ox@0.7.1(typescript@5.5.4)(zod@3.24.4): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.10.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.3): + ox@0.7.1(typescript@5.8.2)(zod@3.22.4): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.10.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.0.8(typescript@5.8.2)(zod@3.22.4) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.8.2 + transitivePeerDependencies: + - zod + + ox@0.7.1(typescript@5.8.2)(zod@3.24.4): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.2 transitivePeerDependencies: - zod @@ -17053,7 +18011,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.2 + semver: 7.7.1 pako@1.0.11: {} @@ -17095,7 +18053,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -17215,7 +18173,7 @@ snapshots: framesync: 6.0.1 hey-listen: 1.0.8 style-value-types: 5.0.0 - tslib: 2.8.1 + tslib: 2.7.0 poseidon-lite@0.3.0: {} @@ -17223,29 +18181,37 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.4): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.4 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.4): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.4 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)): dependencies: lilconfig: 3.1.3 - yaml: 2.8.0 + yaml: 2.7.1 optionalDependencies: - postcss: 8.5.4 - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4) + postcss: 8.5.3 + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4) - postcss-nested@6.2.0(postcss@8.5.4): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): dependencies: - postcss: 8.5.4 + lilconfig: 3.1.3 + yaml: 2.7.1 + optionalDependencies: + postcss: 8.5.3 + ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -17266,13 +18232,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.4: + postcss@8.5.3: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.8: {} + preact@10.26.5: {} prelude-ls@1.1.2: {} @@ -17282,11 +18248,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.4.3(prettier@3.5.3): + prettier-plugin-solidity@1.4.2(prettier@3.5.3): dependencies: - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.19.0 prettier: 3.5.3 - semver: 7.7.2 + semver: 7.7.1 prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3): dependencies: @@ -17325,7 +18291,7 @@ snapshots: property-information@6.5.0: {} - property-information@7.1.0: {} + property-information@7.0.0: {} proto-list@1.2.4: {} @@ -17339,7 +18305,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 4.12.1 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 @@ -17427,11 +18393,11 @@ snapshots: react-is@16.13.1: {} - react-markdown@9.1.0(@types/react@18.3.23)(react@18.3.1): + react-markdown@9.1.0(@types/react@18.3.20)(react@18.3.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 18.3.23 + '@types/react': 18.3.20 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -17445,23 +18411,23 @@ snapshots: transitivePeerDependencies: - supports-color - react-refresh@0.17.0: {} + react-refresh@0.14.2: {} - react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.1(react@18.3.1) + react-router: 6.30.0(react@18.3.1) - react-router@6.30.1(react@18.3.1): + react-router@6.30.0(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.0 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -17536,6 +18502,12 @@ snapshots: regenerate@1.4.2: {} + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.27.0 + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -17711,34 +18683,34 @@ snapshots: rlp@2.2.7: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.1 robust-predicates@3.0.2: {} - rollup@4.41.1: + rollup@4.40.0: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.41.1 - '@rollup/rollup-android-arm64': 4.41.1 - '@rollup/rollup-darwin-arm64': 4.41.1 - '@rollup/rollup-darwin-x64': 4.41.1 - '@rollup/rollup-freebsd-arm64': 4.41.1 - '@rollup/rollup-freebsd-x64': 4.41.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 - '@rollup/rollup-linux-arm-musleabihf': 4.41.1 - '@rollup/rollup-linux-arm64-gnu': 4.41.1 - '@rollup/rollup-linux-arm64-musl': 4.41.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 - '@rollup/rollup-linux-riscv64-gnu': 4.41.1 - '@rollup/rollup-linux-riscv64-musl': 4.41.1 - '@rollup/rollup-linux-s390x-gnu': 4.41.1 - '@rollup/rollup-linux-x64-gnu': 4.41.1 - '@rollup/rollup-linux-x64-musl': 4.41.1 - '@rollup/rollup-win32-arm64-msvc': 4.41.1 - '@rollup/rollup-win32-ia32-msvc': 4.41.1 - '@rollup/rollup-win32-x64-msvc': 4.41.1 + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -17811,7 +18783,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.1: {} serialize-javascript@6.0.2: dependencies: @@ -17844,14 +18816,14 @@ snapshots: shallowequal@1.1.0: {} - sharp@0.34.2: + sharp@0.34.1: dependencies: color: 4.2.3 detect-libc: 2.0.4 - semver: 7.7.2 + semver: 7.7.1 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.2 - '@img/sharp-darwin-x64': 0.34.2 + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 '@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0 @@ -17861,16 +18833,15 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.2 - '@img/sharp-linux-arm64': 0.34.2 - '@img/sharp-linux-s390x': 0.34.2 - '@img/sharp-linux-x64': 0.34.2 - '@img/sharp-linuxmusl-arm64': 0.34.2 - '@img/sharp-linuxmusl-x64': 0.34.2 - '@img/sharp-wasm32': 0.34.2 - '@img/sharp-win32-arm64': 0.34.2 - '@img/sharp-win32-ia32': 0.34.2 - '@img/sharp-win32-x64': 0.34.2 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 shebang-command@1.2.0: dependencies: @@ -17884,7 +18855,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + shell-quote@1.8.2: {} shelljs@0.8.5: dependencies: @@ -17948,7 +18919,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.7.0 snarkjs@0.7.4: dependencies: @@ -17981,15 +18952,15 @@ snapshots: transitivePeerDependencies: - supports-color - solady@0.1.19: {} + solady@0.1.13: {} solady@0.1.4: {} - solc@0.8.26(debug@4.4.1): + solc@0.8.26(debug@4.4.0): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.0) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -17997,16 +18968,16 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3): dependencies: '@prettier/sync': 0.3.0(prettier@3.5.3) prettier: 3.5.3 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.3(prettier@3.5.3) + prettier-plugin-solidity: 1.4.2(prettier@3.5.3) - solhint@5.1.0(typescript@5.8.3): + solhint@5.0.5(typescript@5.8.3): dependencies: - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.19.0 ajv: 6.12.6 antlr4: 4.13.2 ast-parents: 0.0.1 @@ -18020,7 +18991,7 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.7.2 + semver: 7.7.1 strip-ansi: 6.0.1 table: 6.9.0 text-table: 0.2.0 @@ -18029,10 +19000,10 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.19.0 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -18040,7 +19011,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18048,14 +19019,14 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.2 + semver: 7.7.1 shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.19.0 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -18063,7 +19034,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18071,14 +19042,14 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.2 + semver: 7.7.1 shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.19.0 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -18086,7 +19057,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18094,7 +19065,7 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.2 + semver: 7.7.1 shelljs: 0.8.5 web3-utils: 1.10.4 @@ -18148,7 +19119,7 @@ snapshots: static-eval@2.0.2: dependencies: - escodegen: 1.14.3 + escodegen: 1.8.1 statuses@2.0.1: {} @@ -18249,16 +19220,16 @@ snapshots: style-value-types@5.0.0: dependencies: hey-listen: 1.0.8 - tslib: 2.8.1 + tslib: 2.7.0 - styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.27.0(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -18276,8 +19247,6 @@ snapshots: stylis@4.2.0: {} - stylis@4.3.6: {} - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -18349,7 +19318,34 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -18365,11 +19361,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.4 - postcss-import: 15.1.0(postcss@8.5.4) - postcss-js: 4.0.1(postcss@8.5.4) - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) - postcss-nested: 6.2.0(postcss@8.5.4) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -18383,7 +19379,7 @@ snapshots: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 '@types/node': 8.10.66 - '@types/qs': 6.14.0 + '@types/qs': 6.9.18 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.3 @@ -18414,9 +19410,9 @@ snapshots: tinycolor2@1.6.0: {} - tinyglobby@0.2.14: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 tinygradient@1.1.5: @@ -18469,6 +19465,10 @@ snapshots: dependencies: typescript: 5.5.4 + ts-api-utils@1.4.3(typescript@5.8.2): + dependencies: + typescript: 5.8.2 + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -18488,6 +19488,10 @@ snapshots: dependencies: typescript: 5.5.4 + ts-essentials@7.0.3(typescript@5.8.2): + dependencies: + typescript: 5.8.2 + ts-essentials@7.0.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -18506,7 +19510,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -18524,16 +19528,16 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.16(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.10.4 + '@types/node': 20.17.30 acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -18544,9 +19548,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.16(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -18564,12 +19568,37 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.16(@swc/helpers@0.5.17) + optional: true + + ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.7.5 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.16(@swc/helpers@0.5.17) - tsconfck@3.1.6(typescript@5.5.4): + tsconfck@3.1.5(typescript@5.5.4): optionalDependencies: typescript: 5.5.4 + tsconfck@3.1.5(typescript@5.8.2): + optionalDependencies: + typescript: 5.8.2 + tslib@1.14.1: {} tslib@2.7.0: {} @@ -18578,32 +19607,36 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4))(typescript@5.5.4): + tsup@8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2): dependencies: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) resolve-from: 5.0.0 - rollup: 4.41.1 + rollup: 4.40.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.29 - postcss: 8.5.4 - typescript: 5.5.4 + '@swc/core': 1.11.16(@swc/helpers@0.5.17) + postcss: 8.5.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - ts-node tty-browserify@0.0.1: {} + tweetnacl-util@0.15.1: {} + + tweetnacl@1.0.3: {} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -18625,7 +19658,7 @@ snapshots: typechain@8.3.2(typescript@5.5.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18638,10 +19671,26 @@ snapshots: transitivePeerDependencies: - supports-color + typechain@8.3.2(typescript@5.8.2): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.4.0(supports-color@8.1.1) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18658,6 +19707,8 @@ snapshots: typescript@5.5.4: {} + typescript@5.8.2: {} + typescript@5.8.3: {} typical@4.0.0: {} @@ -18806,18 +19857,18 @@ snapshots: unpipe@1.0.0: {} - unstorage@1.16.0(idb-keyval@6.2.2): + unstorage@1.15.0(idb-keyval@6.2.1): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 destr: 2.0.5 - h3: 1.15.3 + h3: 1.15.1 lru-cache: 10.4.3 node-fetch-native: 1.6.6 ofetch: 1.4.1 ufo: 1.6.1 optionalDependencies: - idb-keyval: 6.2.2 + idb-keyval: 6.2.1 unzip-crx-3@0.2.0: dependencies: @@ -18838,9 +19889,9 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: - browserslist: 4.25.0 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -18892,13 +19943,13 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valtio@1.13.2(@types/react@18.3.23)(react@18.3.1): + valtio@1.13.2(@types/react@18.3.20)(react@18.3.1): dependencies: - derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)) + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1)) proxy-compare: 2.6.0 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.23 + '@types/react': 18.3.20 react: 18.3.1 vfile-location@5.0.3: @@ -18934,15 +19985,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.5.4)(zod@3.25.48) + ox: 0.6.7(typescript@5.5.4)(zod@3.24.4) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.5.4 @@ -18951,18 +20002,18 @@ snapshots: - utf-8-validate - zod - viem@2.23.7(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.5.4)(zod@3.25.48) + ox: 0.6.7(typescript@5.8.2)(zod@3.24.4) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -18985,15 +20036,15 @@ snapshots: - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.25.48) + abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.5.4)(zod@3.25.48) + ox: 0.7.1(typescript@5.5.4)(zod@3.24.4) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.5.4 @@ -19002,16 +20053,50 @@ snapshots: - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.22.4) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.7.1(typescript@5.8.2)(zod@3.22.4) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.3) + ox: 0.7.1(typescript@5.8.2)(zod@3.24.4) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.7.14(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.8.3)(zod@3.24.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -19019,61 +20104,72 @@ snapshots: - utf-8-validate - zod - viem@2.9.9(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48): + viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.5.4)(zod@3.25.48) + abitype: 1.0.0(typescript@5.8.2)(zod@3.24.4) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.2 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-node-polyfills@0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.41.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.40.0) node-stdlib-browser: 1.3.1 - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.18(@types/node@22.7.5) transitivePeerDependencies: - rollup - vite-plugin-top-level-await@1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-top-level-await@1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.41.1) - '@swc/core': 1.11.29 + '@rollup/plugin-virtual': 3.0.2(rollup@4.40.0) + '@swc/core': 1.11.16(@swc/helpers@0.5.17) uuid: 10.0.0 - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.18(@types/node@22.7.5) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-wasm@3.4.1(vite@5.4.18(@types/node@22.7.5)): dependencies: - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.18(@types/node@22.7.5) - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.19(@types/node@22.7.5)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.18(@types/node@22.7.5)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.0(supports-color@8.1.1) globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.5.4) + tsconfck: 3.1.5(typescript@5.5.4) optionalDependencies: - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.18(@types/node@22.7.5) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@22.7.5): + vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)): + dependencies: + debug: 4.4.0(supports-color@8.1.1) + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.8.2) + optionalDependencies: + vite: 5.4.18(@types/node@22.7.5) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.18(@types/node@22.7.5): dependencies: esbuild: 0.21.5 - postcss: 8.5.4 - rollup: 4.41.1 + postcss: 8.5.3 + rollup: 4.40.0 optionalDependencies: '@types/node': 22.7.5 fsevents: 2.3.3 @@ -19084,14 +20180,14 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.15.4(@tanstack/query-core@5.79.2)(@tanstack/react-query@5.79.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48): + wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4): dependencies: - '@tanstack/react-query': 5.79.2(react@18.3.1) - '@wagmi/connectors': 5.8.3(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48))(zod@3.25.48) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.79.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48)) + '@tanstack/react-query': 5.74.3(react@18.3.1) + '@wagmi/connectors': 5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.48) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -19122,9 +20218,47 @@ snapshots: - utf-8-validate - zod + wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4): + dependencies: + '@tanstack/react-query': 5.74.3(react@18.3.1) + '@wagmi/connectors': 5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - supports-color + - uploadthing + - utf-8-validate + - zod + wait-on@8.0.3: dependencies: - axios: 1.9.0 + axios: 1.8.4 joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -19142,12 +20276,10 @@ snapshots: web-worker@1.2.0: {} - web-worker@1.5.0: {} - web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 - bn.js: 5.2.2 + bn.js: 5.2.1 ethereum-bloom-filters: 1.2.0 ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 @@ -19268,7 +20400,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.8.0: {} + yaml@2.7.1: {} yargs-parser@18.1.3: dependencies: @@ -19330,11 +20462,11 @@ snapshots: zod@3.22.4: {} - zod@3.25.48: {} + zod@3.24.4: {} - zustand@5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): + zustand@5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): optionalDependencies: - '@types/react': 18.3.23 + '@types/react': 18.3.20 immer: 10.0.2 react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 53e3d635ab..c4e7f70bd9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,5 +2,6 @@ packages: - packages/evm - examples/CRISP - examples/basic + - examples/basic/client - examples/CRISP/apps/client - docs From a62b3256eb3fa65cf20d2f40e15596cc17380626 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:25:20 +0500 Subject: [PATCH 042/106] Fix Viem & Wagmi Versions (#472) --- examples/basic/client/package.json | 4 +- examples/basic/package.json | 2 +- pnpm-lock.yaml | 5400 +++++++++++----------------- 3 files changed, 2120 insertions(+), 3286 deletions(-) diff --git a/examples/basic/client/package.json b/examples/basic/client/package.json index c7e455c732..8a10f5dd67 100644 --- a/examples/basic/client/package.json +++ b/examples/basic/client/package.json @@ -18,12 +18,12 @@ "dependencies": { "@phosphor-icons/react": "^2.1.4", "@tanstack/react-query": "^5.74.3", - "@wagmi/core": "^2.17.2", + "@wagmi/core": "^2.14.16", "connectkit": "^1.9.0", "react": "^18.2.0", "react-dom": "^18.2.0", "viem": "^2.30.6", - "wagmi": "^2.15.4" + "wagmi": "^2.14.16" }, "devDependencies": { "@tailwindcss/typography": "^0.5.12", diff --git a/examples/basic/package.json b/examples/basic/package.json index 9aa8e8a3ae..9adef68742 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -34,4 +34,4 @@ "typechain": "^8.3.0", "typescript": ">=4.5.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0c10cac9c..4566fcd3a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: dependencies: next: specifier: ^14.2.1 - version: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^2.13.4 - version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: ^2.13.4 - version: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -31,17 +31,17 @@ importers: version: 18.3.1(react@18.3.1) sharp: specifier: ^0.34.1 - version: 0.34.1 + version: 0.34.2 devDependencies: '@types/node': specifier: 20.10.4 version: 20.10.4 '@types/react': specifier: ^18.2.66 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.6(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -59,7 +59,7 @@ importers: version: link:../../packages/evm '@semaphore-protocol/contracts': specifier: ^4.9.2 - version: 4.9.2 + version: 4.11.1 '@zk-kit/lean-imt.sol': specifier: 2.0.0 version: 2.0.0 @@ -68,32 +68,32 @@ importers: version: 0.0.5 solady: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.19 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 - version: 1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.5 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(a7f0110eca458f09074d1c2612ad945e) + version: 5.0.0(b303323ac6c5d8ae0490d4ec7875b5eb) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.5 version: 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -120,28 +120,28 @@ importers: version: 9.1.2 hardhat: specifier: ^2.22.10 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.4 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) playwright: specifier: 1.52.0 version: 1.52.0 solidity-coverage: specifier: ^0.8.1 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + version: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) typechain: specifier: ^8.3.0 - version: 8.3.2(typescript@5.8.2) + version: 8.3.2(typescript@5.8.3) typescript: specifier: ^5.5.4 - version: 5.8.2 + version: 5.8.3 wait-on: specifier: ^8.0.3 version: 8.0.3 @@ -156,34 +156,34 @@ importers: version: 11.13.5 '@emotion/react': specifier: ^11.11.4 - version: 11.14.0(@types/react@18.3.20)(react@18.3.1) + version: 11.14.0(@types/react@18.3.23)(react@18.3.1) '@noir-lang/noir_js': specifier: 1.0.0-beta.3 version: 1.0.0-beta.3 '@phosphor-icons/react': specifier: ^2.1.4 - version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semaphore-protocol/core': specifier: ^4.9.2 - version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@semaphore-protocol/data': specifier: ^4.9.2 - version: 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@svgr/rollup': specifier: ^8.1.0 - version: 8.1.0(rollup@4.40.0)(typescript@5.8.2) + version: 8.1.0(rollup@4.41.1)(typescript@5.8.3) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.74.3(react@18.3.1) + version: 5.80.3(react@18.3.1) axios: specifier: ^1.6.8 - version: 1.8.4 + version: 1.9.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) ethers: specifier: ^6.12.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) react: specifier: ^18.2.0 version: 18.3.1 @@ -192,56 +192,56 @@ importers: version: 18.3.1(react@18.3.1) react-markdown: specifier: ^9.0.1 - version: 9.1.0(@types/react@18.3.20)(react@18.3.1) + version: 9.1.0(@types/react@18.3.23)(react@18.3.1) react-router-dom: specifier: ^6.22.3 - version: 6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-syntax-highlighter: specifier: ^15.5.0 version: 15.6.1(react@18.3.1) viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + version: 0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + version: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.6(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) '@types/react-syntax-highlighter': specifier: ^15.5.11 version: 15.5.13 '@typescript-eslint/eslint-plugin': specifier: ^7.2.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^7.2.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.2) + version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.4(vite@5.4.18(@types/node@22.7.5)) + version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) add: specifier: ^2.0.6 version: 2.0.6 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.3) + version: 10.4.21(postcss@8.5.4) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -250,7 +250,7 @@ importers: version: 4.6.2(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.6 - version: 0.4.19(eslint@8.57.1) + version: 0.4.20(eslint@8.57.1) gh-pages: specifier: ^6.1.1 version: 6.3.0 @@ -262,16 +262,16 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) typescript: specifier: ^5.2.2 - version: 5.8.2 + version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.18(@types/node@22.7.5) + version: 5.4.19(@types/node@22.7.5) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) examples/basic: devDependencies: @@ -280,34 +280,34 @@ importers: version: link:../../packages/evm '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(3c85381c0b45919662d061966161e2b7) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(248454f03b5d7796fe0b22b5b4b634ab) + version: 5.0.0(4447ac0103a459a797e604510b0e5af8) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -322,43 +322,43 @@ importers: version: 4.5.0 ethers: specifier: ^6.4.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: ^2.14.0 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: specifier: ^0.8.0 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.0 - version: 8.3.2(typescript@5.5.4) + version: 8.3.2(typescript@5.8.3) typescript: specifier: '>=4.5.0' - version: 5.5.4 + version: 5.8.3 examples/basic/client: dependencies: '@phosphor-icons/react': specifier: ^2.1.4 - version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.74.3(react@18.3.1) + version: 5.80.3(react@18.3.1) '@wagmi/core': - specifier: ^2.17.2 - version: 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) + specifier: ^2.14.16 + version: 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) react: specifier: ^18.2.0 version: 18.3.1 @@ -367,32 +367,32 @@ importers: version: 18.3.1(react@18.3.1) viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: - specifier: ^2.15.4 - version: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + specifier: ^2.14.16 + version: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.2.22 - version: 18.3.6(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) '@typescript-eslint/eslint-plugin': specifier: ^7.2.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^7.2.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) + version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.4(vite@5.4.18(@types/node@22.7.5)) + version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.3) + version: 10.4.21(postcss@8.5.4) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -401,7 +401,7 @@ importers: version: 4.6.2(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.6 - version: 0.4.19(eslint@8.57.1) + version: 0.4.20(eslint@8.57.1) prettier: specifier: ^3.2.5 version: 3.5.3 @@ -410,22 +410,22 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) typescript: specifier: ^5.2.2 - version: 5.5.4 + version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.18(@types/node@22.7.5) + version: 5.4.19(@types/node@22.7.5) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)) + version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.18(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.4.18(@types/node@22.7.5)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) packages/evm: dependencies: @@ -434,38 +434,38 @@ importers: version: 0.4.0 solady: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.19 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(55894f249afdd64a69e3e7ac6a284d95) + version: 4.0.0(c9628f5d47e1b74ed759ca13ebe35860) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 - version: 5.2.0 + version: 5.3.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.0.2 - version: 5.2.0(@openzeppelin/contracts@5.2.0) + version: 5.3.0(@openzeppelin/contracts@5.3.0) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.5.3) '@typechain/ethers-v6': specifier: ^0.5.1 - version: 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -477,7 +477,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.10.4 - version: 20.17.30 + version: 20.10.4 '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -498,7 +498,7 @@ importers: version: 7.0.3 dotenv: specifier: ^16.4.5 - version: 16.4.7 + version: 16.5.0 eslint: specifier: ^8.56.0 version: 8.57.1 @@ -507,19 +507,19 @@ importers: version: 9.1.0(eslint@8.57.1) ethers: specifier: ^6.9.0 - version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: specifier: ^11.2.0 version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) + version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -537,25 +537,25 @@ importers: version: 3.5.3 prettier-plugin-solidity: specifier: ^1.2.0 - version: 1.4.2(prettier@3.5.3) + version: 1.4.3(prettier@3.5.3) rimraf: specifier: ^5.0.5 version: 5.0.10 solhint: specifier: ^5.0.5 - version: 5.0.5(typescript@5.8.3) + version: 5.1.0(typescript@5.8.3) solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3) + version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3) solidity-coverage: specifier: ^0.8.5 - version: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.3) @@ -571,6 +571,9 @@ packages: '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -583,42 +586,42 @@ packages: resolution: {integrity: sha512-jtnCqf+/QLw5yJGOmy818RMQqzHzHqcROtTdQZJybSxp0z3h76xpLSwoDQUBmZZVbP9e46FJjOLqB6gM9gY5cw==} hasBin: true - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} '@babel/generator@7.17.7': resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -640,99 +643,99 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.27.4': + resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -743,26 +746,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -773,356 +776,356 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/plugin-transform-block-scoping@7.27.5': + resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.3': + resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.3': + resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-constant-elements@7.25.9': - resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + '@babel/plugin-transform-react-display-name@7.27.1': + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + '@babel/plugin-transform-regenerator@7.27.5': + resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + '@babel/plugin-transform-typescript@7.27.1': + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1132,40 +1135,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.26.3': - resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.27.4': + resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -1185,11 +1188,11 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@depay/solana-web3.js@1.98.1': - resolution: {integrity: sha512-3Qgf8cooFqaLCVCeA6KxNBU3aBWwS019a2IaPPIlpea/P4IOFAdZL1ZgnIFTsXAvugjqMAbegd2vfVJBd/ZJ6g==} + '@depay/solana-web3.js@1.98.2': + resolution: {integrity: sha512-O7SvHsZ6HGXlzSmjhj7mj0B/VvQQn8mzm/xKQ0SUrEUJVxg9zKFBlwIvxCtgf+IOrWlBJi6VqXRu7UznWvfrCA==} - '@depay/web3-blockchains@9.8.2': - resolution: {integrity: sha512-glJ1aFNG2ZljdmYS8Ei4ok+2eoCHPqK9lseJ4kBqqKTGNTRxZ2nVZQ1GxyiO9stuixyBowVFif0bRy9E6mAYZQ==} + '@depay/web3-blockchains@9.8.6': + resolution: {integrity: sha512-Fp2sGHjvRuqsLivfbL2qdhB447Fk/A0eS/iZj5VlzVnrpfa1Jt+tAKPk1c5T5tOYagnWaGG5DTFMuFNKiqRPkQ==} engines: {node: '>=18'} '@depay/web3-client@10.18.6': @@ -1687,8 +1690,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1713,6 +1716,11 @@ packages: engines: {node: '>=14'} hasBin: true + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -1721,6 +1729,10 @@ packages: resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + '@ethersproject/abi@5.8.0': resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} @@ -1853,14 +1865,14 @@ packages: '@iden3/binfileutils@0.0.12': resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] @@ -1910,55 +1922,61 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -2006,10 +2024,6 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} - '@metamask/eth-sig-util@4.0.1': - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - '@metamask/json-rpc-engine@7.3.3': resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -2181,59 +2195,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.28': - resolution: {integrity: sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==} + '@next/env@14.2.29': + resolution: {integrity: sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg==} - '@next/swc-darwin-arm64@14.2.28': - resolution: {integrity: sha512-kzGChl9setxYWpk3H6fTZXXPFFjg7urptLq5o5ZgYezCrqlemKttwMT5iFyx/p1e/JeglTwDFRtb923gTJ3R1w==} + '@next/swc-darwin-arm64@14.2.29': + resolution: {integrity: sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.28': - resolution: {integrity: sha512-z6FXYHDJlFOzVEOiiJ/4NG8aLCeayZdcRSMjPDysW297Up6r22xw6Ea9AOwQqbNsth8JNgIK8EkWz2IDwaLQcw==} + '@next/swc-darwin-x64@14.2.29': + resolution: {integrity: sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.28': - resolution: {integrity: sha512-9ARHLEQXhAilNJ7rgQX8xs9aH3yJSj888ssSjJLeldiZKR4D7N08MfMqljk77fAwZsWwsrp8ohHsMvurvv9liQ==} + '@next/swc-linux-arm64-gnu@14.2.29': + resolution: {integrity: sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.28': - resolution: {integrity: sha512-p6gvatI1nX41KCizEe6JkF0FS/cEEF0u23vKDpl+WhPe/fCTBeGkEBh7iW2cUM0rvquPVwPWdiUR6Ebr/kQWxQ==} + '@next/swc-linux-arm64-musl@14.2.29': + resolution: {integrity: sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.28': - resolution: {integrity: sha512-nsiSnz2wO6GwMAX2o0iucONlVL7dNgKUqt/mDTATGO2NY59EO/ZKnKEr80BJFhuA5UC1KZOMblJHWZoqIJddpA==} + '@next/swc-linux-x64-gnu@14.2.29': + resolution: {integrity: sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.28': - resolution: {integrity: sha512-+IuGQKoI3abrXFqx7GtlvNOpeExUH1mTIqCrh1LGFf8DnlUcTmOOCApEnPJUSLrSbzOdsF2ho2KhnQoO0I1RDw==} + '@next/swc-linux-x64-musl@14.2.29': + resolution: {integrity: sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.28': - resolution: {integrity: sha512-l61WZ3nevt4BAnGksUVFKy2uJP5DPz2E0Ma/Oklvo3sGj9sw3q7vBWONFRgz+ICiHpW5mV+mBrkB3XEubMrKaA==} + '@next/swc-win32-arm64-msvc@14.2.29': + resolution: {integrity: sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.28': - resolution: {integrity: sha512-+Kcp1T3jHZnJ9v9VTJ/yf1t/xmtFAc/Sge4v7mVc1z+NYfYzisi8kJ9AsY8itbgq+WgEwMtOpiLLJsUy2qnXZw==} + '@next/swc-win32-ia32-msvc@14.2.29': + resolution: {integrity: sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.28': - resolution: {integrity: sha512-1gCmpvyhz7DkB1srRItJTnmR2UwQPAUXXIg9r0/56g3O8etGmwlX68skKXJOp9EejW3hhv7nSQUJ2raFiz4MoA==} + '@next/swc-win32-x64-msvc@14.2.29': + resolution: {integrity: sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2260,6 +2274,10 @@ packages: resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.1': resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} @@ -2283,6 +2301,10 @@ packages: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -2314,64 +2336,38 @@ packages: '@noir-lang/types@1.0.0-beta.3': resolution: {integrity: sha512-BPOmf0qDiTn4wH1Lo7mHa67GTQFueIVaDUcUb+N9+ALiXC5nVU8HrzWmx1yvZB64ZiCEy7yPdNEaNrszSrE2fg==} - '@nomicfoundation/edr-darwin-arm64@0.8.0': - resolution: {integrity: sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==} + '@nomicfoundation/edr-darwin-arm64@0.11.0': + resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.8.0': - resolution: {integrity: sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==} + '@nomicfoundation/edr-darwin-x64@0.11.0': + resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': - resolution: {integrity: sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': + resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.8.0': - resolution: {integrity: sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==} + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': + resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.8.0': - resolution: {integrity: sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==} + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': + resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.8.0': - resolution: {integrity: sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==} + '@nomicfoundation/edr-linux-x64-musl@0.11.0': + resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.8.0': - resolution: {integrity: sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==} + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': + resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.8.0': - resolution: {integrity: sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==} + '@nomicfoundation/edr@0.11.0': + resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-common@4.0.4': - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - - '@nomicfoundation/ethereumjs-rlp@5.0.4': - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} - hasBin: true - - '@nomicfoundation/ethereumjs-tx@5.0.4': - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - - '@nomicfoundation/ethereumjs-util@9.0.4': - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - '@nomicfoundation/hardhat-chai-matchers@2.0.8': resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} peerDependencies: @@ -2454,10 +2450,10 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' - '@nomicfoundation/hardhat-verify@2.0.13': - resolution: {integrity: sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g==} + '@nomicfoundation/hardhat-verify@2.0.14': + resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} peerDependencies: - hardhat: ^2.0.4 + hardhat: ^2.24.1 '@nomicfoundation/ignition-core@0.15.11': resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} @@ -2497,13 +2493,10 @@ packages: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} - '@openzeppelin/contracts-upgradeable@5.2.0': - resolution: {integrity: sha512-mZIu9oa4tQTlGiOJHk6D3LdJlqFqF6oNOSn6S6UVJtzfs9UsY9/dhMEbAVTwElxUtJnjpf6yA062+oBp+eOyPg==} + '@openzeppelin/contracts-upgradeable@5.3.0': + resolution: {integrity: sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg==} peerDependencies: - '@openzeppelin/contracts': 5.2.0 - - '@openzeppelin/contracts@5.2.0': - resolution: {integrity: sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==} + '@openzeppelin/contracts': 5.3.0 '@openzeppelin/contracts@5.3.0': resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} @@ -2512,8 +2505,8 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' - '@phosphor-icons/react@2.1.7': - resolution: {integrity: sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==} + '@phosphor-icons/react@2.1.10': + resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} engines: {node: '>=10'} peerDependencies: react: '>= 16.8' @@ -2552,31 +2545,37 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@reown/appkit-common@1.7.3': - resolution: {integrity: sha512-wKTr6N3z8ly17cc51xBEVkZK4zAd8J1m7RubgsdQ1olFY9YJGe61RYoNv9yFjt6tUVeYT+z7iMUwPhX2PziefQ==} + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} - '@reown/appkit-controllers@1.7.3': - resolution: {integrity: sha512-aqAcX/nZe0gwqjncyCkVrAk3lEw0qZ9xGrdLOmA207RreO4J0Vxu8OJXCBn4C2AUI2OpBxCPah+vyuKTUJTeHQ==} + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} - '@reown/appkit-polyfills@1.7.3': - resolution: {integrity: sha512-vQUiAyI7WiNTUV4iNwv27iigdeg8JJTEo6ftUowIrKZ2/gtE2YdMtGpavuztT/qrXhrIlTjDGp5CIyv9WOTu4g==} + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} - '@reown/appkit-scaffold-ui@1.7.3': - resolution: {integrity: sha512-ssB15fcjmoKQ+VfoCo7JIIK66a4SXFpCH8uK1CsMmXmKIKqPN54ohLo291fniV6mKtnJxh5Xm68slGtGrO3bmA==} + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} - '@reown/appkit-ui@1.7.3': - resolution: {integrity: sha512-zKmFIjLp0X24pF9KtPtSHmdsh/RjEWIvz+faIbPGm4tQbwcxdg9A35HeoP0rMgKYx49SX51LgPwVXne2gYacqQ==} + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} - '@reown/appkit-utils@1.7.3': - resolution: {integrity: sha512-8/MNhmfri+2uu8WzBhZ5jm5llofOIa1dyXDXRC/hfrmGmCFJdrQKPpuqOFYoimo2s2g70pK4PYefvOKgZOWzgg==} + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} peerDependencies: valtio: 1.13.2 - '@reown/appkit-wallet@1.7.3': - resolution: {integrity: sha512-D0pExd0QUE71ursQPp3pq/0iFrz2oz87tOyFifrPANvH5X0RQCYn/34/kXr+BFVQzNFfCBDlYP+CniNA/S0KiQ==} + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} - '@reown/appkit@1.7.3': - resolution: {integrity: sha512-aA/UIwi/dVzxEB62xlw3qxHa3RK1YcPMjNxoGj/fHNCqL2qWmbcOXT7coCUa9RG7/Bh26FZ3vdVT2v71j6hebQ==} + '@rolldown/pluginutils@1.0.0-beta.9': + resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -2605,103 +2604,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.41.1': + resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.41.1': + resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.41.1': + resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.41.1': + resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.41.1': + resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.41.1': + resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.41.1': + resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.41.1': + resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.41.1': + resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.41.1': + resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.41.1': + resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.41.1': + resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.41.1': + resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.41.1': + resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.41.1': + resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} cpu: [x64] os: [win32] @@ -2711,8 +2710,8 @@ packages: '@safe-global/safe-apps-sdk@9.1.0': resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - '@safe-global/safe-gateway-typescript-sdk@3.22.9': - resolution: {integrity: sha512-7ojVK/crhOaGowEO8uYWaopZzcr5rR76emgllGIfjCLR70aY4PbASpi9Pbs+7jIRzPDBBkM0RBo+zYx5UduX8Q==} + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} engines: {node: '>=16'} '@scure/base@1.1.9': @@ -2751,29 +2750,29 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - '@semaphore-protocol/contracts@4.9.2': - resolution: {integrity: sha512-/DnZ9SOzBsfv06Vz74djVHEPgZwIkdNt7e5Ay2612Rw22EwToedQX5ahJxfG9vbgHleOZ1iAV4y+XKmDhPpDBg==} + '@semaphore-protocol/contracts@4.11.1': + resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} - '@semaphore-protocol/core@4.9.2': - resolution: {integrity: sha512-Dc0ZVCcWuCiCA2Y6GXmsRVjpA+sA06dUiGlx+e6CY/8B6xQtz8TQm10DNWayqe0YkL9Bld/JWyN3rdIoZf3uEA==} + '@semaphore-protocol/core@4.11.1': + resolution: {integrity: sha512-FYF9k5peTC1dvILBma9kxdBaxl6VHJ3Z87Y74rOryzgSrAZMnwLUg87T5BMf6rtmqd6IP507UbGuMB3G7eTk3g==} - '@semaphore-protocol/data@4.9.2': - resolution: {integrity: sha512-wKkxRrKY6RrTMyaglRH/62cq+zP+6Xn15ViR6O4wrKVzzEv4X3zLbjBNKBW6XgU9Lnh5UbVQFOdAQplvrrwGFw==} + '@semaphore-protocol/data@4.11.1': + resolution: {integrity: sha512-vOwZ3ywD6wofUSR1s0tpS8wg1pL0H3rs1S8zHOEJ9zLnnBMFPGgjy6eUI68uoRC9kKDB6/hypDj0ncHyFq6nBA==} - '@semaphore-protocol/group@4.9.2': - resolution: {integrity: sha512-NkCYtl3BcaNaGy1Oc5LvDScimDPu47bebqYH9cm+21nLKOsCFNmFcG70if2TY2e1Q/eyvB8tnK01a39nHs4pLw==} + '@semaphore-protocol/group@4.11.1': + resolution: {integrity: sha512-YJwLpAc0sOzlgZwDw62QRj1BJ3PXPQdFYqt0lhNvbhPosFAmjfHW+gr7xYuBku/oQJ4clm+fLQniAd37a+ZXHg==} - '@semaphore-protocol/identity@4.9.2': - resolution: {integrity: sha512-kHxcAfOyJ5yfo5Y82JCsIc+UD1+nsYg0NA7tRLg/FqYYnkLd/YZ1BkvRGRccZOKUW7S9VQERN7CVqBzXprxjTg==} + '@semaphore-protocol/identity@4.11.1': + resolution: {integrity: sha512-HVnm8TA7+tz1WiRpLhgiqZspsNfTrtUlArhiYg4GaZz4Xh3Xf8ryjcSVJLIiAmGu0eP46yg8GuRa6vW6I9Oi+g==} - '@semaphore-protocol/proof@4.9.2': - resolution: {integrity: sha512-bf8xg12R3mWsywIarEFOFTP/atmrEGPJIwneRliC3dFKT7kzdrZvta2czJGejNURp3PIVIKNRONPkp+JyThNAw==} + '@semaphore-protocol/proof@4.11.1': + resolution: {integrity: sha512-wnSIAUFtcAu/QhBZcq20lJE/7X4fwG6qq/LsDFnLB9GKMYXR2fdBCUPhoER34ojjJqSwrwqW+vk/omb3icqplA==} peerDependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/utils@4.9.2': - resolution: {integrity: sha512-cSDwsk5ADLUaQv++3dX+GhCPm3dJB4/gTUK+Rhv6mPc9JEPk2xrmmDDB7DM+/wOAIK7wfo1IksMLwEK+/Du95Q==} + '@semaphore-protocol/utils@4.11.1': + resolution: {integrity: sha512-lTzZo9RV1wUyFXVnDcnSV3cDYfoMfmG17Sl9M1I7L82JX19LBPNJ1olBQbloC6UvyzE6DaqQ783MJnTkWEoDjg==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -2822,8 +2821,8 @@ packages: '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - '@solidity-parser/parser@0.19.0': - resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} + '@solidity-parser/parser@0.20.1': + resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} @@ -2903,71 +2902,71 @@ packages: resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==} engines: {node: '>=14'} - '@swc/core-darwin-arm64@1.11.16': - resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} + '@swc/core-darwin-arm64@1.11.29': + resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.16': - resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} + '@swc/core-darwin-x64@1.11.29': + resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.16': - resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} + '@swc/core-linux-arm-gnueabihf@1.11.29': + resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.16': - resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} + '@swc/core-linux-arm64-gnu@1.11.29': + resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.16': - resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} + '@swc/core-linux-arm64-musl@1.11.29': + resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.16': - resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} + '@swc/core-linux-x64-gnu@1.11.29': + resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.16': - resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} + '@swc/core-linux-x64-musl@1.11.29': + resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.16': - resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} + '@swc/core-win32-arm64-msvc@1.11.29': + resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.16': - resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} + '@swc/core-win32-ia32-msvc@1.11.29': + resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.16': - resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} + '@swc/core-win32-x64-msvc@1.11.29': + resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.16': - resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} + '@swc/core@1.11.29': + resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': '*' + '@swc/helpers': '>=0.5.17' peerDependenciesMeta: '@swc/helpers': optional: true @@ -2975,9 +2974,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -3025,22 +3021,22 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.74.3': - resolution: {integrity: sha512-Mqk+5o3qTuAiZML248XpNH8r2cOzl15+LTbUsZQEwvSvn1GU4VQhvqzAbil36p+MBxpr/58oBSnRzhrBevDhfg==} + '@tanstack/query-core@5.80.2': + resolution: {integrity: sha512-g2Es97uwFk7omkWiH9JmtLWSA8lTUFVseIyzqbjqJEEx7qN+Hg6jbBdDvelqtakamppaJtGORQ64hEJ5S6ojSg==} - '@tanstack/react-query@5.74.3': - resolution: {integrity: sha512-QrycUn0wxjVPzITvQvOxFRdhlAwIoOQSuav7qWD4SWCoKCdLbyRZ2vji2GuBq/glaxbF4wBx3fqcYRDOt8KDTA==} + '@tanstack/react-query@5.80.3': + resolution: {integrity: sha512-psqr/QRzYfqJvgD8F2teMO6mL4hN4gzkOra9BlPplNhwByviZIhHUrWTXQEMmUdPWHNkGjA1SP6xG2+brhmIoQ==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.8': - resolution: {integrity: sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==} + '@tanstack/react-virtual@3.13.9': + resolution: {integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.8': - resolution: {integrity: sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==} + '@tanstack/virtual-core@3.13.9': + resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} '@theguild/remark-mermaid@0.0.5': resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} @@ -3105,9 +3101,6 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} @@ -3195,9 +3188,6 @@ packages: '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - '@types/node@20.17.30': - resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} - '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -3216,19 +3206,19 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - '@types/react-dom@18.3.6': - resolution: {integrity: sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 '@types/react-syntax-highlighter@15.5.13': resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@18.3.23': + resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} '@types/resolve@0.0.8': resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} @@ -3312,14 +3302,14 @@ packages: '@viem/anvil@0.0.7': resolution: {integrity: sha512-F+3ljCT1bEt8T4Fzm9gWpIgO3Dc7bzG1TtUtkStkJFMuummqZ8kvYc3UFMo5j3F51fSWZZvEkjs3+i7qf0AOqQ==} - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + '@vitejs/plugin-react@4.5.1': + resolution: {integrity: sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@wagmi/connectors@5.8.3': - resolution: {integrity: sha512-U4SJgi91+ny/XDGQWAMmawMafDx1BofcbYkPT/WSU6XrGL+apa7VltscqY7PVmwVGi/CYTqe8nlQiK/wmQ8D3A==} + '@wagmi/connectors@5.8.4': + resolution: {integrity: sha512-WuDH6GMDc/wbWhCcpLvUFglN/ANXht9wXD8M3rvYPGBYcuvDOOh7eXGHaDqVUpgJLcvvy0WWkTuesNbK8FCayQ==} peerDependencies: '@wagmi/core': 2.17.2 typescript: '>=5.0.4' @@ -3340,19 +3330,19 @@ packages: typescript: optional: true - '@walletconnect/core@2.19.2': - resolution: {integrity: sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==} + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} engines: {node: '>=18'} - '@walletconnect/core@2.20.2': - resolution: {integrity: sha512-48XnarxQQrpJ0KZJOjit56DxuzfVRYUdL8XVMvUh/ZNUiX2FB5w6YuljUUeTLfYOf04Et6qhVGEUkmX3W+9/8w==} + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} engines: {node: '>=18'} '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - '@walletconnect/ethereum-provider@2.20.2': - resolution: {integrity: sha512-fGNJtytHuBWZcmMXRIG1djlfEiPMvPJ0R3JlfJjAx2VfVN+O+1xdF6QSWcZxFizviIUFJV+f1zWt0V2VVD61Rg==} + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -3395,32 +3385,32 @@ packages: '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - '@walletconnect/sign-client@2.19.2': - resolution: {integrity: sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==} + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} - '@walletconnect/sign-client@2.20.2': - resolution: {integrity: sha512-KyeDToypZ1OjCbij4Jx0cAg46bMwZ6zCKt0HzCkqENcex3Zchs7xBp9r8GtfEMGw+PUnXwqrhzmLBH0x/43oIQ==} + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - '@walletconnect/types@2.19.2': - resolution: {integrity: sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==} + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} - '@walletconnect/types@2.20.2': - resolution: {integrity: sha512-XPPbJM/mGU05i6jUxhC3yI/YvhSF6TYJQ5SXTWM53lVe6hs6ukvlEhPctu9ZBTGwGFhwPXIjtK/eWx+v4WY5iw==} + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} - '@walletconnect/universal-provider@2.19.2': - resolution: {integrity: sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==} + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} - '@walletconnect/universal-provider@2.20.2': - resolution: {integrity: sha512-6uVu1E88tioaXEEJCbJKwCIQlOHif1nmfY092BznZEnBn2lli5ICzQh2bxtUDNmNNLKsMDI3FV1fODFeWMVJTQ==} + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} - '@walletconnect/utils@2.19.2': - resolution: {integrity: sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==} + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} - '@walletconnect/utils@2.20.2': - resolution: {integrity: sha512-2uRUDvpYSIJFYcr1WIuiFy6CEszLF030o6W8aDMkGk9/MfAZYEJQHMJcjWyaNMPHLJT0POR5lPaqkYOpuyPIQQ==} + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -3671,8 +3661,8 @@ packages: axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -3755,11 +3745,11 @@ packages: bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3813,8 +3803,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3914,8 +3904,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001713: - resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} + caniuse-lite@1.0.30001721: + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4175,8 +4165,8 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4232,8 +4222,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.4: - resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} @@ -4446,8 +4436,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4594,8 +4584,8 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -4611,8 +4601,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.14: - resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} ejs@3.1.10: @@ -4620,8 +4610,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.137: - resolution: {integrity: sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==} + electron-to-chromium@1.5.164: + resolution: {integrity: sha512-TXBrF2aZenRjY3wbj5Yc0mZn43lMiSHNkzwPkIxx+vWUB35Kf8Gm/uOYmOJFNQ7SUwWAinbfxX73ANIud65wSA==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4720,6 +4710,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} @@ -4737,8 +4732,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.19: - resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: eslint: '>=8.40' @@ -4787,6 +4782,10 @@ packages: resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} engines: {node: '>=0.10.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4856,13 +4855,6 @@ packages: ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - deprecated: This library has been deprecated and usage is discouraged. - - ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} @@ -4874,18 +4866,14 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} - ethers@6.13.5: - resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + ethers@6.14.3: + resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} - ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} @@ -4978,8 +4966,8 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5289,8 +5277,8 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - h3@1.15.1: - resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} + h3@1.15.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -5305,13 +5293,13 @@ packages: peerDependencies: hardhat: ^2.0.2 - hardhat-gas-reporter@2.2.2: - resolution: {integrity: sha512-xlg3d00wrgUvP2S5tw3Zf6nO7OyS5crK3P6/ZP69i24pz4grM+6oFHGW/eJPSGqiDWBYX+gKp9XoqP4rwRXrdQ==} + hardhat-gas-reporter@2.3.0: + resolution: {integrity: sha512-ySdA+044xMQv1BlJu5CYXToHzMexKFfIWxlQTBNNoerx1x96+d15IMdN01iQZ/TJ7NH2V5sU73bz77LoS/PEVw==} peerDependencies: hardhat: ^2.16.0 - hardhat@2.22.19: - resolution: {integrity: sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==} + hardhat@2.24.1: + resolution: {integrity: sha512-3iwrO2liEGCw1rz/l/mlB1rSNexCc4CFcMj0DlvjXGChzmD3sGUgLwWDOZPf+ya8MEm5ZhO1oprRVmb/wVi0YA==} hasBin: true peerDependencies: ts-node: '*' @@ -5452,8 +5440,8 @@ packages: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -5498,8 +5486,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - idb-keyval@6.2.1: - resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5896,8 +5884,8 @@ packages: lit-html@3.3.0: resolution: {integrity: sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==} - lit@3.1.0: - resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} @@ -6122,9 +6110,15 @@ packages: mermaid@10.9.3: resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -6419,8 +6413,8 @@ packages: react: '>=16.x <=18.x' react-dom: '>=16.x <=18.x' - next-seo@6.6.0: - resolution: {integrity: sha512-0VSted/W6XNtgAtH3D+BZrMLLudqfm0D5DYNJRXHcDgan/1ZF1tDFIsWrmvQlYngALyphPfZ3ZdOqlKpKdvG6w==} + next-seo@6.8.0: + resolution: {integrity: sha512-zcxaV67PFXCSf8e6SXxbxPaOTgc8St/esxfsYXfQXMM24UESUVSXFm7f2A9HMkAwa0Gqn4s64HxYZAGfdF4Vhg==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' @@ -6433,8 +6427,8 @@ packages: react: '*' react-dom: '*' - next@14.2.28: - resolution: {integrity: sha512-QLEIP/kYXynIxtcKB6vNjtWLVs3Y4Sb+EClTC/CSVzdLD1gIuItccpu/n1lhmduffI32iPGEK2cLLxxt28qgYA==} + next@14.2.29: + resolution: {integrity: sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -6883,12 +6877,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.8: + resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -6902,8 +6896,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.4.2: - resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} + prettier-plugin-solidity@1.4.3: + resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' @@ -7005,8 +6999,8 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -7102,19 +7096,19 @@ packages: '@types/react': '>=18' react: '>=18' - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@6.30.0: - resolution: {integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==} + react-router-dom@6.30.1: + resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.30.0: - resolution: {integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==} + react-router@6.30.1: + resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -7190,12 +7184,6 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -7341,8 +7329,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.41.1: + resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7405,8 +7393,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -7436,8 +7424,8 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - sharp@0.34.1: - resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: @@ -7456,8 +7444,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} shelljs@0.8.5: @@ -7520,8 +7508,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - solady@0.1.13: - resolution: {integrity: sha512-AA/VFTwxihDxk/LE2oN5xBiwE1vQtvmqOl55EDH2RwMuqLmUH1aOEMoGLCO0jyPMBZ3qnvXKfg2oRKy6s7V/zg==} + solady@0.1.19: + resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} solady@0.1.4: resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} @@ -7537,12 +7525,12 @@ packages: prettier: ^3.0.0 prettier-plugin-solidity: ^1.0.0 - solhint@5.0.5: - resolution: {integrity: sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==} + solhint@5.1.0: + resolution: {integrity: sha512-KWg4gnOnznxHXzH0fUvnhnxnk+1R50GiPChcPeQgA7SKQTSF1LLIEh8R1qbkCEn/fFzz4CfJs+Gh7Rl9uhHy+g==} hasBin: true - solidity-coverage@0.8.14: - resolution: {integrity: sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==} + solidity-coverage@0.8.16: + resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -7733,6 +7721,9 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -7821,8 +7812,8 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} tinygradient@1.1.5: @@ -7921,8 +7912,8 @@ packages: '@swc/wasm': optional: true - tsconfck@3.1.5: - resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -7965,12 +7956,6 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -8013,11 +7998,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -8146,8 +8126,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unstorage@1.15.0: - resolution: {integrity: sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==} + unstorage@1.16.0: + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -8155,7 +8135,7 @@ packages: '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 '@deno/kv': '>=0.9.0' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 @@ -8305,16 +8285,16 @@ packages: typescript: optional: true - viem@2.30.6: - resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} + viem@2.23.7: + resolution: {integrity: sha512-Gbyz0uE3biWDPxECrEyzILWPsnIgDREgfRMuLSWHSSnM6ktefSC/lqQNImnxESdDEixa8/6EWXjmf2H6L9VV0A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - viem@2.7.14: - resolution: {integrity: sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==} + viem@2.30.6: + resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -8352,8 +8332,8 @@ packages: vite: optional: true - vite@5.4.18: - resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8392,8 +8372,8 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - wagmi@2.15.4: - resolution: {integrity: sha512-0m7uo6t/oSFS+4UCUTBnmIhDSP7PGJz1qx4VtALcsBnw81UPPIXMSM8oGVrUNV9CptryiDgBlh4iYmRldg9iaA==} + wagmi@2.15.5: + resolution: {integrity: sha512-1l4DvaXXh2bBbKJbeoLsHkWyWA7hYuts2SDSGQU8gT37Sqzh3u8vBAwc0pN4570oGQxYVw2+YiwpR2yGPFyQTg==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -8420,6 +8400,9 @@ packages: web-worker@1.2.0: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} @@ -8576,9 +8559,9 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@18.1.3: @@ -8626,8 +8609,8 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.51: + resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} @@ -8656,6 +8639,8 @@ snapshots: '@adraffy/ens-normalize@1.10.1': {} + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -8667,35 +8652,35 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.5': {} - '@babel/core@7.26.10': + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.4 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8704,56 +8689,56 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.27.0': + '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.3 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0(supports-color@8.1.1) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -8761,720 +8746,699 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9(supports-color@5.5.0)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/traverse': 7.27.0(supports-color@5.5.0) - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.0': + '@babel/helpers@7.27.4': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 - '@babel/parser@7.27.0': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.3 esutils: 2.0.3 - '@babel/preset-react@7.26.3(@babel/core@7.26.10)': + '@babel/preset-react@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.4': {} - '@babel/template@7.27.0': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.3 '@babel/traverse@7.23.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) + '@babel/parser': 7.27.5 + '@babel/types': 7.27.3 + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.0(supports-color@5.5.0)': + '@babel/traverse@7.27.4(supports-color@5.5.0)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@5.5.0) + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.17.0': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 to-fast-properties: 2.0.0 - '@babel/types@7.27.0': + '@babel/types@7.27.3': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@braintree/sanitize-url@6.0.4': {} '@coinbase/wallet-sdk@3.9.3': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 buffer: 6.0.3 clsx: 1.2.1 eth-block-tracker: 7.1.0 eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.26.5 + preact: 10.26.8 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -9484,7 +9448,7 @@ snapshots: '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.26.5 + preact: 10.26.8 '@colors/colors@1.5.0': optional: true @@ -9493,20 +9457,21 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@depay/solana-web3.js@1.98.1': + '@depay/solana-web3.js@1.98.2': dependencies: bs58: 5.0.0 - '@depay/web3-blockchains@9.8.2': {} + '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@depay/solana-web3.js': 1.98.1 - '@depay/web3-blockchains': 9.8.2 + '@depay/solana-web3.js': 1.98.2 + '@depay/web3-blockchains': 9.8.6 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/web3-blockchains': 9.8.2 + '@depay/web3-blockchains': 9.8.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -9514,8 +9479,8 @@ snapshots: '@depay/web3-mock@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@depay/solana-web3.js': 1.98.1 - '@depay/web3-blockchains': 9.8.2 + '@depay/solana-web3.js': 1.98.2 + '@depay/web3-blockchains': 9.8.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -9532,8 +9497,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.27.0 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/runtime': 7.27.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -9570,9 +9535,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -9582,7 +9547,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 transitivePeerDependencies: - supports-color @@ -9817,7 +9782,7 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -9827,7 +9792,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -9847,6 +9812,8 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} + '@ethereumjs/rlp@5.0.2': {} + '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 @@ -9860,6 +9827,11 @@ snapshots: ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + '@ethersproject/abi@5.8.0': dependencies: '@ethersproject/address': 5.8.0 @@ -9919,7 +9891,7 @@ snapshots: dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 '@ethersproject/bytes@5.8.0': dependencies: @@ -10052,7 +10024,7 @@ snapshots: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 '@ethersproject/properties': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 elliptic: 6.6.1 hash.js: 1.1.7 @@ -10126,7 +10098,7 @@ snapshots: '@excubiae/contracts@0.4.0': dependencies: '@openzeppelin/contracts': 5.3.0 - '@semaphore-protocol/contracts': 4.9.2 + '@semaphore-protocol/contracts': 4.11.1 solady: 0.1.4 '@fastify/busboy@2.1.1': {} @@ -10139,7 +10111,7 @@ snapshots: '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10147,7 +10119,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10163,12 +10135,12 @@ snapshots: fastfile: 0.0.20 ffjavascript: 0.3.0 - '@img/sharp-darwin-arm64@0.34.1': + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.34.1': + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true @@ -10200,45 +10172,48 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.34.1': + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.34.1': + '@img/sharp-linux-arm@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.34.1': + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.34.1': + '@img/sharp-linux-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.34.1': + '@img/sharp-wasm32@0.34.2': dependencies: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.34.1': + '@img/sharp-win32-arm64@0.34.2': + optional: true + + '@img/sharp-win32-ia32@0.34.2': optional: true - '@img/sharp-win32-x64@0.34.1': + '@img/sharp-win32-x64@0.34.2': optional: true '@isaacs/cliui@8.0.2': @@ -10303,7 +10278,7 @@ snapshots: '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.20 + '@types/react': 18.3.23 react: 18.3.1 '@metamask/eth-json-rpc-provider@1.0.1': @@ -10314,14 +10289,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@metamask/eth-sig-util@4.0.1': - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - '@metamask/json-rpc-engine@7.3.3': dependencies: '@metamask/rpc-errors': 6.4.0 @@ -10384,13 +10351,13 @@ snapshots: '@metamask/safe-event-emitter@3.1.2': {} - '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.0(supports-color@8.1.1) - eciesjs: 0.4.14 + debug: 4.4.1(supports-color@5.5.0) + eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -10405,16 +10372,16 @@ snapshots: '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.32.0 '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.0(supports-color@8.1.1) - eciesjs: 0.4.14 + debug: 4.4.1(supports-color@5.5.0) + eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 obj-multiplex: 1.0.0 @@ -10436,8 +10403,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) - semver: 7.7.1 + debug: 4.4.1(supports-color@5.5.0) + semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -10449,9 +10416,9 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 - semver: 7.7.1 + semver: 7.7.2 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10463,9 +10430,9 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 - semver: 7.7.1 + semver: 7.7.2 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -10484,7 +10451,7 @@ snapshots: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 hey-listen: 1.0.8 - tslib: 2.7.0 + tslib: 2.8.1 '@motionone/easing@10.18.0': dependencies: @@ -10564,33 +10531,33 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@14.2.28': {} + '@next/env@14.2.29': {} - '@next/swc-darwin-arm64@14.2.28': + '@next/swc-darwin-arm64@14.2.29': optional: true - '@next/swc-darwin-x64@14.2.28': + '@next/swc-darwin-x64@14.2.29': optional: true - '@next/swc-linux-arm64-gnu@14.2.28': + '@next/swc-linux-arm64-gnu@14.2.29': optional: true - '@next/swc-linux-arm64-musl@14.2.28': + '@next/swc-linux-arm64-musl@14.2.29': optional: true - '@next/swc-linux-x64-gnu@14.2.28': + '@next/swc-linux-x64-gnu@14.2.29': optional: true - '@next/swc-linux-x64-musl@14.2.28': + '@next/swc-linux-x64-musl@14.2.29': optional: true - '@next/swc-win32-arm64-msvc@14.2.28': + '@next/swc-win32-arm64-msvc@14.2.29': optional: true - '@next/swc-win32-ia32-msvc@14.2.28': + '@next/swc-win32-ia32-msvc@14.2.29': optional: true - '@next/swc-win32-x64-msvc@14.2.28': + '@next/swc-win32-x64-msvc@14.2.29': optional: true '@noble/ciphers@1.2.1': {} @@ -10613,6 +10580,10 @@ snapshots: dependencies: '@noble/hashes': 1.7.1 + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + '@noble/curves@1.9.1': dependencies: '@noble/hashes': 1.8.0 @@ -10627,6 +10598,8 @@ snapshots: '@noble/hashes@1.7.1': {} + '@noble/hashes@1.7.2': {} + '@noble/hashes@1.8.0': {} '@noble/secp256k1@1.7.1': {} @@ -10657,137 +10630,100 @@ snapshots: '@noir-lang/types@1.0.0-beta.3': {} - '@nomicfoundation/edr-darwin-arm64@0.8.0': {} + '@nomicfoundation/edr-darwin-arm64@0.11.0': {} - '@nomicfoundation/edr-darwin-x64@0.8.0': {} + '@nomicfoundation/edr-darwin-x64@0.11.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.8.0': {} - - '@nomicfoundation/edr-linux-x64-gnu@0.8.0': {} - - '@nomicfoundation/edr-linux-x64-musl@0.8.0': {} - - '@nomicfoundation/edr-win32-x64-msvc@0.8.0': {} - - '@nomicfoundation/edr@0.8.0': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.8.0 - '@nomicfoundation/edr-darwin-x64': 0.8.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.8.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.8.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.8.0 - '@nomicfoundation/edr-linux-x64-musl': 0.8.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.8.0 - - '@nomicfoundation/ethereumjs-common@4.0.4': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} - '@nomicfoundation/ethereumjs-tx@5.0.4': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 + '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} - '@nomicfoundation/ethereumjs-util@9.0.4': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/edr@0.11.0': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@types/chai-as-promised': 7.1.8 - chai: 4.5.0 - chai-as-promised: 7.1.2(chai@4.5.0) - deep-eql: 4.1.4 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - ordinal: 1.0.3 + '@nomicfoundation/edr-darwin-arm64': 0.11.0 + '@nomicfoundation/edr-darwin-x64': 0.11.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-x64-musl': 0.11.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': - dependencies: - debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.0(supports-color@8.1.1) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(3c85381c0b45919662d061966161e2b7)': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10795,15 +10731,15 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10811,104 +10747,85 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(55894f249afdd64a69e3e7ac6a284d95)': + '@nomicfoundation/hardhat-toolbox@4.0.0(c9628f5d47e1b74ed759ca13ebe35860)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.17.30 + '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(248454f03b5d7796fe0b22b5b4b634ab)': + '@nomicfoundation/hardhat-toolbox@5.0.0(4447ac0103a459a797e604510b0e5af8)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(3c85381c0b45919662d061966161e2b7) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - typescript: 5.5.4 - - '@nomicfoundation/hardhat-toolbox@5.0.0(a7f0110eca458f09074d1c2612ad945e)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2)) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-toolbox@5.0.0(b303323ac6c5d8ae0490d4ec7875b5eb)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 - - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/address': 5.8.0 - cbor: 8.1.0 - debug: 4.4.0(supports-color@8.1.1) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - lodash.clonedeep: 4.5.0 - picocolors: 1.1.1 - semver: 6.3.1 - table: 6.9.0 - undici: 5.29.0 - transitivePeerDependencies: - - supports-color + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@8.1.1) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10917,13 +10834,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.13(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.0(supports-color@8.1.1) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -10937,8 +10854,8 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 lodash: 4.17.21 @@ -10981,17 +10898,15 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@openzeppelin/contracts-upgradeable@5.2.0(@openzeppelin/contracts@5.2.0)': + '@openzeppelin/contracts-upgradeable@5.3.0(@openzeppelin/contracts@5.3.0)': dependencies: - '@openzeppelin/contracts': 5.2.0 - - '@openzeppelin/contracts@5.2.0': {} + '@openzeppelin/contracts': 5.3.0 '@openzeppelin/contracts@5.3.0': {} '@paulmillr/qr@0.2.1': {} - '@phosphor-icons/react@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@phosphor-icons/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11023,57 +10938,35 @@ snapshots: '@remix-run/router@1.23.0': {} - '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4)': - dependencies: - big.js: 6.2.2 - dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - big.js: 6.2.2 - dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4)': + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-controllers@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11101,13 +10994,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-pay@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + lit: 3.3.0 + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11135,54 +11029,18 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-polyfills@1.7.3': + '@reown/appkit-polyfills@1.7.8': dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': - dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - lit: 3.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - valtio - - zod - - '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) - lit: 3.1.0 + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11211,12 +11069,12 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - lit: 3.1.0 + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 qrcode: 1.5.3 transitivePeerDependencies: - '@azure/app-configuration' @@ -11245,13 +11103,16 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@reown/appkit-utils@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) - lit: 3.1.0 - qrcode: 1.5.3 + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11279,53 +11140,32 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': + '@reown/appkit-wallet@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + zod: 3.22.4 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - bufferutil - - db0 - - encoding - - ioredis - - react - typescript - - uploadthing - utf-8-validate - - zod - '@reown/appkit-utils@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4)': - dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) - '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11353,193 +11193,91 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@rolldown/pluginutils@1.0.0-beta.9': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4) - '@reown/appkit-polyfills': 1.7.3 - '@walletconnect/logger': 2.1.2 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.41.1 + + '@rollup/plugin-virtual@3.0.2(rollup@4.41.1)': + optionalDependencies: + rollup: 4.41.1 - '@reown/appkit-wallet@1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@rollup/pluginutils@5.1.4(rollup@4.41.1)': dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4) - '@reown/appkit-polyfills': 1.7.3 - '@walletconnect/logger': 2.1.2 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.1 - '@reown/appkit@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - bs58: 6.0.0 - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - - '@reown/appkit@1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@reown/appkit-common': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-controllers': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-ui': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@reown/appkit-utils': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1))(zod@3.24.4) - '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.2 - '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - bs58: 6.0.0 - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - - '@rollup/plugin-inject@5.0.5(rollup@4.40.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - estree-walker: 2.0.2 - magic-string: 0.30.17 - optionalDependencies: - rollup: 4.40.0 - - '@rollup/plugin-virtual@3.0.2(rollup@4.40.0)': - optionalDependencies: - rollup: 4.40.0 - - '@rollup/pluginutils@5.1.4(rollup@4.40.0)': - dependencies: - '@types/estree': 1.0.7 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.40.0 - - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.41.1': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.41.1': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.41.1': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.41.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.41.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.41.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.41.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.41.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.41.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.41.1': optional: true - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -11547,37 +11285,17 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.22.9 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.22.9 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@safe-global/safe-gateway-typescript-sdk@3.22.9': {} + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} '@scure/base@1.1.9': {} @@ -11638,48 +11356,51 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@semaphore-protocol/contracts@4.9.2': + '@semaphore-protocol/contracts@4.11.1': dependencies: '@zk-kit/lean-imt.sol': 2.0.1 - '@semaphore-protocol/core@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/core@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 - '@semaphore-protocol/proof': 4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/proof': 4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@semaphore-protocol/data@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/data@4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/utils': 1.3.0 axios: 1.6.6 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + viem: 2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - bufferutil - debug + - typescript - utf-8-validate + - zod - '@semaphore-protocol/group@4.9.2': + '@semaphore-protocol/group@4.11.1': dependencies: '@zk-kit/lean-imt': 2.2.3 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/identity@4.9.2': + '@semaphore-protocol/identity@4.11.1': dependencies: '@zk-kit/baby-jubjub': 1.0.3 '@zk-kit/eddsa-poseidon': 1.0.4 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/proof@4.9.2(@semaphore-protocol/group@4.9.2)(@semaphore-protocol/identity@4.9.2)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/proof@4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.9.2 - '@semaphore-protocol/identity': 4.9.2 - '@semaphore-protocol/utils': 4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': 4.11.1 + '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/artifacts': 1.8.0 '@zk-kit/utils': 1.3.0 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11688,9 +11409,9 @@ snapshots: - bufferutil - utf-8-validate - '@semaphore-protocol/utils@4.9.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/utils@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11760,58 +11481,58 @@ snapshots: dependencies: antlr4ts: 0.5.0-alpha.4 - '@solidity-parser/parser@0.19.0': {} + '@solidity-parser/parser@0.20.1': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.10)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@svgr/babel-preset@8.1.0(@babel/core@7.26.10)': + '@svgr/babel-preset@8.1.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.10) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.10) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.27.4) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.4) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.4) - '@svgr/core@8.1.0(typescript@5.8.2)': + '@svgr/core@8.1.0(typescript@5.8.3)': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.8.2) + cosmiconfig: 8.3.6(typescript@5.8.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -11819,98 +11540,92 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': dependencies: - '@babel/core': 7.26.10 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.10) - '@svgr/core': 8.1.0(typescript@5.8.2) + '@babel/core': 7.27.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) + '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.8.2) - cosmiconfig: 8.3.6(typescript@5.8.2) + '@svgr/core': 8.1.0(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.8.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/rollup@8.1.0(rollup@4.40.0)(typescript@5.8.2)': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - '@svgr/core': 8.1.0(typescript@5.8.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2))(typescript@5.8.2) + '@svgr/rollup@8.1.0(rollup@4.41.1)(typescript@5.8.3)': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/preset-react': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - rollup - supports-color - typescript - '@swc/core-darwin-arm64@1.11.16': + '@swc/core-darwin-arm64@1.11.29': optional: true - '@swc/core-darwin-x64@1.11.16': + '@swc/core-darwin-x64@1.11.29': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.16': + '@swc/core-linux-arm-gnueabihf@1.11.29': optional: true - '@swc/core-linux-arm64-gnu@1.11.16': + '@swc/core-linux-arm64-gnu@1.11.29': optional: true - '@swc/core-linux-arm64-musl@1.11.16': + '@swc/core-linux-arm64-musl@1.11.29': optional: true - '@swc/core-linux-x64-gnu@1.11.16': + '@swc/core-linux-x64-gnu@1.11.29': optional: true - '@swc/core-linux-x64-musl@1.11.16': + '@swc/core-linux-x64-musl@1.11.29': optional: true - '@swc/core-win32-arm64-msvc@1.11.16': + '@swc/core-win32-arm64-msvc@1.11.29': optional: true - '@swc/core-win32-ia32-msvc@1.11.16': + '@swc/core-win32-ia32-msvc@1.11.29': optional: true - '@swc/core-win32-x64-msvc@1.11.16': + '@swc/core-win32-x64-msvc@1.11.29': optional: true - '@swc/core@1.11.16(@swc/helpers@0.5.17)': + '@swc/core@1.11.29': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.16 - '@swc/core-darwin-x64': 1.11.16 - '@swc/core-linux-arm-gnueabihf': 1.11.16 - '@swc/core-linux-arm64-gnu': 1.11.16 - '@swc/core-linux-arm64-musl': 1.11.16 - '@swc/core-linux-x64-gnu': 1.11.16 - '@swc/core-linux-x64-musl': 1.11.16 - '@swc/core-win32-arm64-msvc': 1.11.16 - '@swc/core-win32-ia32-msvc': 1.11.16 - '@swc/core-win32-x64-msvc': 1.11.16 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.11.29 + '@swc/core-darwin-x64': 1.11.29 + '@swc/core-linux-arm-gnueabihf': 1.11.29 + '@swc/core-linux-arm64-gnu': 1.11.29 + '@swc/core-linux-arm64-musl': 1.11.29 + '@swc/core-linux-x64-gnu': 1.11.29 + '@swc/core-linux-x64-musl': 1.11.29 + '@swc/core-win32-arm64-msvc': 1.11.29 + '@swc/core-win32-ia32-msvc': 1.11.29 + '@swc/core-win32-x64-msvc': 1.11.29 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - optional: true - '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -11920,14 +11635,14 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11937,7 +11652,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)': + '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -11948,7 +11663,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + tsup: 8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -11965,10 +11680,10 @@ snapshots: dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11985,10 +11700,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -12005,14 +11720,14 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.1)(@depay/web3-blockchains@9.8.2)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.16(@swc/helpers@0.5.17))(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.16(@swc/helpers@0.5.17))(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12033,36 +11748,28 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)))': - dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) - - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) - '@tanstack/query-core@5.74.3': {} + '@tanstack/query-core@5.80.2': {} - '@tanstack/react-query@5.74.3(react@18.3.1)': + '@tanstack/react-query@5.80.3(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.74.3 + '@tanstack/query-core': 5.80.2 react: 18.3.1 - '@tanstack/react-virtual@3.13.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.13.8 + '@tanstack/virtual-core': 3.13.9 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.13.8': {} + '@tanstack/virtual-core@3.13.9': {} '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: @@ -12080,7 +11787,7 @@ snapshots: '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.5 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -12099,51 +11806,37 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': - dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - typescript: 5.5.4 - - '@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': + '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 - - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.5.4) + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2))(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.8.2) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': dependencies: @@ -12151,28 +11844,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.3 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.3 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.0 - - '@types/bn.js@4.11.6': - dependencies: - '@types/node': 20.10.4 + '@babel/types': 7.27.3 '@types/bn.js@5.1.6': dependencies: @@ -12266,10 +11955,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.17.30': - dependencies: - undici-types: 6.19.8 - '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -12286,17 +11971,17 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} - '@types/react-dom@18.3.6(@types/react@18.3.20)': + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 - '@types/react@18.3.20': + '@types/react@18.3.23': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -12317,42 +12002,6 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -12371,39 +12020,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12415,35 +12038,11 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12453,76 +12052,24 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': - dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) @@ -12549,29 +12096,30 @@ snapshots: - debug - utf-8-validate - '@vitejs/plugin-react@4.3.4(vite@5.4.18(@types/node@22.7.5))': + '@vitejs/plugin-react@4.5.1(vite@5.4.19(@types/node@22.7.5))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.9 '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.4.18(@types/node@22.7.5) + react-refresh: 0.17.0 + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': + '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) - '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12599,18 +12147,18 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)': + '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) - '@walletconnect/ethereum-provider': 2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12638,37 +12186,37 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))': + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.5.4) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - zustand: 5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + mipd: 0.0.7(typescript@5.8.3) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.74.3 - typescript: 5.5.4 + '@tanstack/query-core': 5.80.2 + typescript: 5.8.3 transitivePeerDependencies: - '@types/react' - immer - react - use-sync-external-store - '@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))': + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.8.2) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - zustand: 5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + mipd: 0.0.7(typescript@5.8.3) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.74.3 - typescript: 5.8.2 + '@tanstack/query-core': 5.80.2 + typescript: 5.8.3 transitivePeerDependencies: - '@types/react' - immer - react - use-sync-external-store - '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12681,8 +12229,8 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12711,7 +12259,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12724,8 +12272,8 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12754,419 +12302,22 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/environment@1.0.1': dependencies: - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.1.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.33.0 - events: 3.3.0 - uint8arrays: 3.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod + tslib: 1.14.1 - '@walletconnect/core@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.1.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.33.0 - events: 3.3.0 - uint8arrays: 3.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/environment@1.0.1': - dependencies: - tslib: 1.14.1 - - '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@reown/appkit': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.20.2 - '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/ethereum-provider@2.20.2(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@reown/appkit': 1.7.3(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@reown/appkit': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.20.2 - '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/events@1.0.1': - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.2': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-http-connection@1.0.8': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.2.0 - events: 3.3.0 - transitivePeerDependencies: - - encoding - - '@walletconnect/jsonrpc-provider@1.0.14': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-types@1.0.4': - dependencies: - events: 3.3.0 - keyvaluestorage-interface: 1.0.0 - - '@walletconnect/jsonrpc-utils@1.0.8': - dependencies: - '@walletconnect/environment': 1.0.1 - '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 - - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@walletconnect/keyvaluestorage@1.1.1': - dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.15.0(idb-keyval@6.2.1) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - db0 - - ioredis - - uploadthing - - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/relay-api@1.0.11': - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.1.0': - dependencies: - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - uint8arrays: 3.1.0 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/sign-client@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@walletconnect/core': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.19.2': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13180,22 +12331,73 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - react + - typescript - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 - '@walletconnect/types@2.20.2': + '@walletconnect/heartbeat@1.2.2': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.16.0(idb-keyval@6.2.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13207,7 +12409,6 @@ snapshots: - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -13216,19 +12417,37 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - es-toolkit: 1.33.0 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13248,26 +12467,22 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.19.2 - '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - es-toolkit: 1.33.0 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13287,26 +12502,23 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.21.0': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13324,28 +12536,17 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - - encoding - ioredis - - typescript - uploadthing - - utf-8-validate - - zod - '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/types@2.21.1': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/types': 2.20.2 - '@walletconnect/utils': 2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13363,34 +12564,24 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - - encoding - ioredis - - typescript - uploadthing - - utf-8-validate - - zod - '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@noble/ciphers': 1.2.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.1.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - bs58: 6.0.0 - detect-browser: 5.3.0 - query-string: 7.1.3 - uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + es-toolkit: 1.33.0 + events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13409,31 +12600,27 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@noble/ciphers': 1.2.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.1.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - bs58: 6.0.0 - detect-browser: 5.3.0 - query-string: 7.1.3 - uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + es-toolkit: 1.33.0 + events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13452,13 +12639,14 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -13469,14 +12657,14 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 + '@walletconnect/types': 2.21.0 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13501,7 +12689,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.20.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -13512,14 +12700,14 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2 + '@walletconnect/types': 2.21.1 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13588,35 +12776,20 @@ snapshots: abbrev@1.0.9: {} - abitype@1.0.0(typescript@5.8.2)(zod@3.24.4): - optionalDependencies: - typescript: 5.8.2 - zod: 3.24.4 - - abitype@1.0.0(typescript@5.8.3)(zod@3.24.4): + abitype@1.0.0(typescript@5.8.3)(zod@3.25.51): optionalDependencies: typescript: 5.8.3 - zod: 3.24.4 - - abitype@1.0.8(typescript@5.5.4)(zod@3.22.4): - optionalDependencies: - typescript: 5.5.4 - zod: 3.22.4 + zod: 3.25.51 - abitype@1.0.8(typescript@5.5.4)(zod@3.24.4): + abitype@1.0.8(typescript@5.8.3)(zod@3.22.4): optionalDependencies: - typescript: 5.5.4 - zod: 3.24.4 - - abitype@1.0.8(typescript@5.8.2)(zod@3.22.4): - optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 zod: 3.22.4 - abitype@1.0.8(typescript@5.8.2)(zod@3.24.4): + abitype@1.0.8(typescript@5.8.3)(zod@3.25.51): optionalDependencies: - typescript: 5.8.2 - zod: 3.24.4 + typescript: 5.8.3 + zod: 3.25.51 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -13638,7 +12811,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -13729,7 +12902,7 @@ snapshots: asn1.js@4.10.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 @@ -13763,29 +12936,29 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.3): + autoprefixer@10.4.21(postcss@8.5.4): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001713 + browserslist: 4.25.0 + caniuse-lite: 1.0.30001721 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.4 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@0.21.4(debug@4.4.0): + axios@0.21.4(debug@4.4.1): dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) transitivePeerDependencies: - debug axios@1.6.6: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -13793,15 +12966,15 @@ snapshots: axios@1.6.7: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.8.4: + axios@1.9.0: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -13811,42 +12984,42 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): dependencies: - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -13899,9 +13072,9 @@ snapshots: bn.js@4.11.6: {} - bn.js@4.12.1: {} + bn.js@4.12.2: {} - bn.js@5.2.1: {} + bn.js@5.2.2: {} boolbase@1.0.0: {} @@ -13965,13 +13138,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -13986,12 +13159,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.4: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001713 - electron-to-chromium: 1.5.137 + caniuse-lite: 1.0.30001721 + electron-to-chromium: 1.5.164 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs58@4.0.1: dependencies: @@ -14054,7 +13227,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.1 @@ -14087,7 +13260,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001713: {} + caniuse-lite@1.0.30001721: {} caseless@0.12.0: {} @@ -14316,7 +13489,7 @@ snapshots: chalk: 4.1.2 lodash: 4.17.21 rxjs: 7.8.2 - shell-quote: 1.8.2 + shell-quote: 1.8.3 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -14326,12 +13499,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) + '@tanstack/react-query': 5.80.3(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14339,19 +13512,19 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) transitivePeerDependencies: - '@babel/core' - react-is - connectkit@1.9.0(@babel/core@7.26.10)(@tanstack/react-query@5.74.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) + '@tanstack/react-query': 5.80.3(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)) + family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14359,9 +13532,9 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) transitivePeerDependencies: - '@babel/core' - react-is @@ -14378,9 +13551,9 @@ snapshots: cookie@0.4.2: {} - core-js-compat@3.41.0: + core-js-compat@3.42.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 core-util-is@1.0.3: {} @@ -14396,15 +13569,6 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.8.2): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.8.2 - cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 @@ -14418,7 +13582,7 @@ snapshots: create-ecdh@4.0.4: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 elliptic: 6.6.1 create-hash@1.2.0: @@ -14468,7 +13632,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.4: + crossws@0.3.5: dependencies: uncrypto: 0.1.3 @@ -14706,7 +13870,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 dayjs@1.11.13: {} @@ -14716,13 +13880,13 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0(supports-color@5.5.0): + debug@4.4.1(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.4.0(supports-color@8.1.1): + debug@4.4.1(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -14778,9 +13942,9 @@ snapshots: dequal@2.0.3: {} - derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1)): + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)): dependencies: - valtio: 1.13.2(@types/react@18.3.20)(react@18.3.1) + valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) des.js@1.1.0: dependencies: @@ -14805,7 +13969,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -14852,7 +14016,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - dotenv@16.4.7: {} + dotenv@16.5.0: {} dunder-proto@1.0.1: dependencies: @@ -14873,7 +14037,7 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.14: + eciesjs@0.4.15: dependencies: '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 @@ -14884,13 +14048,13 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.137: {} + electron-to-chromium@1.5.164: {} elkjs@0.9.3: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -15042,6 +14206,15 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + escodegen@1.8.1: dependencies: esprima: 2.7.3 @@ -15059,7 +14232,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.19(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -15072,7 +14245,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -15083,7 +14256,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15135,6 +14308,8 @@ snapshots: estraverse@1.9.3: {} + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: @@ -15187,7 +14362,7 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.8.4 + axios: 1.9.0 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -15257,25 +14432,10 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - ethereumjs-abi@0.6.8: - dependencies: - bn.js: 4.12.1 - ethereumjs-util: 6.2.1 - - ethereumjs-util@6.2.1: - dependencies: - '@types/bn.js': 4.11.6 - bn.js: 4.12.1 - create-hash: 1.2.0 - elliptic: 6.6.1 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.6 - bn.js: 5.2.1 + bn.js: 5.2.2 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -15329,7 +14489,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -15347,11 +14507,6 @@ snapshots: bn.js: 4.11.6 number-to-bn: 1.7.0 - ethjs-util@0.1.6: - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - eventemitter2@6.4.9: {} eventemitter3@4.0.7: {} @@ -15410,19 +14565,19 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4)): + family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) - wagmi: 2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) fast-deep-equal@3.1.3: {} @@ -15456,7 +14611,7 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -15530,9 +14685,9 @@ snapshots: focus-visible@5.2.1: {} - follow-redirects@1.15.9(debug@4.4.0): + follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -15575,13 +14730,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) style-value-types: 5.0.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 framesync@6.0.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 fs-extra@10.1.0: dependencies: @@ -15828,10 +14983,10 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - h3@1.15.1: + h3@1.15.3: dependencies: cookie-es: 1.2.2 - crossws: 0.3.4 + crossws: 0.3.5 defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 @@ -15862,11 +15017,11 @@ snapshots: '@ethersproject/solidity': 5.8.0 '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 - '@types/qs': 6.9.18 - axios: 0.21.4(debug@4.4.0) + '@types/qs': 6.14.0 + axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -15880,11 +15035,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15892,11 +15047,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15904,94 +15059,36 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.2.2(bufferutil@4.0.9)(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): + hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 '@ethersproject/units': 5.8.0 - '@solidity-parser/parser': 0.19.0 - axios: 1.8.4 - brotli-wasm: 2.0.1 - chalk: 4.1.2 - cli-table3: 0.6.5 - ethereum-cryptography: 2.2.1 - glob: 10.4.5 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - jsonschema: 1.5.0 - lodash: 4.17.21 - markdown-table: 2.0.0 - sha1: 1.1.1 - viem: 2.7.14(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4) - transitivePeerDependencies: - - bufferutil - - debug - - typescript - - utf-8-validate - - zod - - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): - dependencies: - '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chokidar: 4.0.3 - ci-info: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 5.0.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - immutable: 4.3.7 - io-ts: 1.10.4 - json-stream-stringify: 3.1.6 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.8.2 - p-map: 4.0.0 - picocolors: 1.1.1 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 - tsort: 0.0.1 - undici: 5.29.0 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4) - typescript: 5.5.4 + '@solidity-parser/parser': 0.20.1 + axios: 1.9.0 + brotli-wasm: 2.0.1 + chalk: 4.1.2 + cli-table3: 0.6.5 + ethereum-cryptography: 2.2.1 + glob: 10.4.5 + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + jsonschema: 1.5.0 + lodash: 4.17.21 + markdown-table: 2.0.0 + sha1: 1.1.1 + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - - c-kzg - - supports-color + - debug + - typescript - utf-8-validate + - zod - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: + '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -16002,11 +15099,10 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -16015,6 +15111,7 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 + micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -16022,31 +15119,27 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) + solc: 0.8.26(debug@4.4.1) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil - - c-kzg - supports-color - utf-8-validate - hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10): + hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: + '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.8.0 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.6 @@ -16057,11 +15150,10 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 @@ -16070,6 +15162,7 @@ snapshots: json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 + micro-eth-signer: 0.14.0 mnemonist: 0.38.5 mocha: 10.8.2 p-map: 4.0.0 @@ -16077,20 +15170,19 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.0) + solc: 0.8.26(debug@4.4.1) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tsort: 0.0.1 undici: 5.29.0 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) - typescript: 5.8.2 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - - c-kzg - supports-color - utf-8-validate @@ -16166,7 +15258,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.0.0 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -16229,7 +15321,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.16 unist-util-position: 5.0.0 @@ -16273,7 +15365,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 he@1.2.0: {} @@ -16309,7 +15401,7 @@ snapshots: http-response-object: 3.0.2 parse-cache-control: 1.0.1 - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.0: dependencies: @@ -16322,7 +15414,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -16341,7 +15433,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16359,7 +15451,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb-keyval@6.2.1: {} + idb-keyval@6.2.2: {} ieee754@1.2.1: {} @@ -16695,7 +15787,7 @@ snapshots: dependencies: '@types/trusted-types': 2.0.7 - lit@3.1.0: + lit@3.3.0: dependencies: '@lit/reactive-element': 2.1.0 lit-element: 4.2.0 @@ -16800,7 +15892,7 @@ snapshots: match-sorter@6.3.4: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 remove-accents: 0.5.0 math-intrinsics@1.1.0: {} @@ -17086,15 +16178,25 @@ snapshots: lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.2.0 + stylis: 4.3.6 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.2.0 + web-worker: 1.5.0 transitivePeerDependencies: - supports-color + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + micro-ftch@0.3.1: {} + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.1.0 @@ -17461,7 +16563,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -17483,7 +16585,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -17509,7 +16611,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 mime-db@1.52.0: {} @@ -17546,13 +16648,9 @@ snapshots: minipass@7.1.2: {} - mipd@0.0.7(typescript@5.5.4): - optionalDependencies: - typescript: 5.5.4 - - mipd@0.0.7(typescript@5.8.2): + mipd@0.0.7(typescript@5.8.3): optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 mkdirp@0.5.6: dependencies: @@ -17569,7 +16667,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -17632,45 +16730,45 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-seo@6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.28 + '@next/env': 14.2.29 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001713 + caniuse-lite: 1.0.30001721 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.28 - '@next/swc-darwin-x64': 14.2.28 - '@next/swc-linux-arm64-gnu': 14.2.28 - '@next/swc-linux-arm64-musl': 14.2.28 - '@next/swc-linux-x64-gnu': 14.2.28 - '@next/swc-linux-x64-musl': 14.2.28 - '@next/swc-win32-arm64-msvc': 14.2.28 - '@next/swc-win32-ia32-msvc': 14.2.28 - '@next/swc-win32-x64-msvc': 14.2.28 + '@next/swc-darwin-arm64': 14.2.29 + '@next/swc-darwin-x64': 14.2.29 + '@next/swc-linux-arm64-gnu': 14.2.29 + '@next/swc-linux-arm64-musl': 14.2.29 + '@next/swc-linux-x64-gnu': 14.2.29 + '@next/swc-linux-x64-musl': 14.2.29 + '@next/swc-win32-arm64-msvc': 14.2.29 + '@next/swc-win32-ia32-msvc': 14.2.29 + '@next/swc-win32-x64-msvc': 14.2.29 '@playwright/test': 1.52.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -17681,16 +16779,16 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.6.0(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 - zod: 3.24.4 + zod: 3.25.51 - nextra@2.13.4(next@14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 @@ -17704,7 +16802,7 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.22 lodash.get: 4.4.2 - next: 14.2.28(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 @@ -17720,7 +16818,7 @@ snapshots: title: 3.5.3 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 - zod: 3.24.4 + zod: 3.25.51 transitivePeerDependencies: - supports-color @@ -17890,91 +16988,47 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.6.7(typescript@5.5.4)(zod@3.24.4): - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - zod - - ox@0.6.7(typescript@5.8.2)(zod@3.24.4): - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - zod - - ox@0.7.1(typescript@5.5.4)(zod@3.22.4): - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.22.4) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - zod - - ox@0.7.1(typescript@5.5.4)(zod@3.24.4): + ox@0.6.7(typescript@5.8.3)(zod@3.25.51): dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.2)(zod@3.22.4): + ox@0.7.1(typescript@5.8.3)(zod@3.22.4): dependencies: - '@adraffy/ens-normalize': 1.10.1 + '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.22.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.2)(zod@3.24.4): + ox@0.7.1(typescript@5.8.3)(zod@3.25.51): dependencies: - '@adraffy/ens-normalize': 1.10.1 + '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - zod @@ -18011,7 +17065,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.1 + semver: 7.7.2 pako@1.0.11: {} @@ -18053,7 +17107,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -18173,7 +17227,7 @@ snapshots: framesync: 6.0.1 hey-listen: 1.0.8 style-value-types: 5.0.0 - tslib: 2.7.0 + tslib: 2.8.1 poseidon-lite@0.3.0: {} @@ -18181,37 +17235,29 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.4): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 - - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)): - dependencies: - lilconfig: 3.1.3 - yaml: 2.7.1 - optionalDependencies: - postcss: 8.5.3 - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4) + postcss: 8.5.4 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): + postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 - yaml: 2.7.1 + yaml: 2.8.0 optionalDependencies: - postcss: 8.5.3 - ts-node: 10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2) + postcss: 8.5.4 + ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -18232,13 +17278,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.8: {} prelude-ls@1.1.2: {} @@ -18248,11 +17294,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.4.2(prettier@3.5.3): + prettier-plugin-solidity@1.4.3(prettier@3.5.3): dependencies: - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 prettier: 3.5.3 - semver: 7.7.1 + semver: 7.7.2 prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3): dependencies: @@ -18291,7 +17337,7 @@ snapshots: property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} proto-list@1.2.4: {} @@ -18305,7 +17351,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 @@ -18393,11 +17439,11 @@ snapshots: react-is@16.13.1: {} - react-markdown@9.1.0(@types/react@18.3.20)(react@18.3.1): + react-markdown@9.1.0(@types/react@18.3.23)(react@18.3.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 18.3.20 + '@types/react': 18.3.23 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -18411,23 +17457,23 @@ snapshots: transitivePeerDependencies: - supports-color - react-refresh@0.14.2: {} + react-refresh@0.17.0: {} - react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.0(react@18.3.1) + react-router: 6.30.1(react@18.3.1) - react-router@6.30.0(react@18.3.1): + react-router@6.30.1(react@18.3.1): dependencies: '@remix-run/router': 1.23.0 react: 18.3.1 react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.4 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -18502,12 +17548,6 @@ snapshots: regenerate@1.4.2: {} - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.0 - regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -18683,34 +17723,34 @@ snapshots: rlp@2.2.7: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 robust-predicates@3.0.2: {} - rollup@4.40.0: + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.41.1 + '@rollup/rollup-android-arm64': 4.41.1 + '@rollup/rollup-darwin-arm64': 4.41.1 + '@rollup/rollup-darwin-x64': 4.41.1 + '@rollup/rollup-freebsd-arm64': 4.41.1 + '@rollup/rollup-freebsd-x64': 4.41.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 + '@rollup/rollup-linux-arm-musleabihf': 4.41.1 + '@rollup/rollup-linux-arm64-gnu': 4.41.1 + '@rollup/rollup-linux-arm64-musl': 4.41.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-musl': 4.41.1 + '@rollup/rollup-linux-s390x-gnu': 4.41.1 + '@rollup/rollup-linux-x64-gnu': 4.41.1 + '@rollup/rollup-linux-x64-musl': 4.41.1 + '@rollup/rollup-win32-arm64-msvc': 4.41.1 + '@rollup/rollup-win32-ia32-msvc': 4.41.1 + '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -18783,7 +17823,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} serialize-javascript@6.0.2: dependencies: @@ -18816,14 +17856,14 @@ snapshots: shallowequal@1.1.0: {} - sharp@0.34.1: + sharp@0.34.2: dependencies: color: 4.2.3 detect-libc: 2.0.4 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.1 - '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 '@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0 @@ -18833,15 +17873,16 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.1 - '@img/sharp-linux-arm64': 0.34.1 - '@img/sharp-linux-s390x': 0.34.1 - '@img/sharp-linux-x64': 0.34.1 - '@img/sharp-linuxmusl-arm64': 0.34.1 - '@img/sharp-linuxmusl-x64': 0.34.1 - '@img/sharp-wasm32': 0.34.1 - '@img/sharp-win32-ia32': 0.34.1 - '@img/sharp-win32-x64': 0.34.1 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 shebang-command@1.2.0: dependencies: @@ -18855,7 +17896,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} + shell-quote@1.8.3: {} shelljs@0.8.5: dependencies: @@ -18919,7 +17960,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 snarkjs@0.7.4: dependencies: @@ -18952,15 +17993,15 @@ snapshots: transitivePeerDependencies: - supports-color - solady@0.1.13: {} + solady@0.1.19: {} solady@0.1.4: {} - solc@0.8.26(debug@4.4.0): + solc@0.8.26(debug@4.4.1): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.1) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -18968,16 +18009,16 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.3))(prettier@3.5.3): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3): dependencies: '@prettier/sync': 0.3.0(prettier@3.5.3) prettier: 3.5.3 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.2(prettier@3.5.3) + prettier-plugin-solidity: 1.4.3(prettier@3.5.3) - solhint@5.0.5(typescript@5.8.3): + solhint@5.1.0(typescript@5.8.3): dependencies: - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 ajv: 6.12.6 antlr4: 4.13.2 ast-parents: 0.0.1 @@ -18991,7 +18032,7 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.7.1 + semver: 7.7.2 strip-ansi: 6.0.1 table: 6.9.0 text-table: 0.2.0 @@ -19000,33 +18041,10 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): - dependencies: - '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - ghost-testrpc: 0.0.2 - global-modules: 2.0.0 - globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - jsonschema: 1.5.0 - lodash: 4.17.21 - mocha: 10.8.2 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.7.1 - shelljs: 0.8.5 - web3-utils: 1.10.4 - - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -19034,7 +18052,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -19042,14 +18060,14 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.1 + semver: 7.7.2 shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.14(hardhat@2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.19.0 + '@solidity-parser/parser': 0.20.1 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -19057,7 +18075,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.19(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -19065,7 +18083,7 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.7.1 + semver: 7.7.2 shelljs: 0.8.5 web3-utils: 1.10.4 @@ -19119,7 +18137,7 @@ snapshots: static-eval@2.0.2: dependencies: - escodegen: 1.8.1 + escodegen: 1.14.3 statuses@2.0.1: {} @@ -19220,16 +18238,16 @@ snapshots: style-value-types@5.0.0: dependencies: hey-listen: 1.0.8 - tslib: 2.7.0 + tslib: 2.8.1 - styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) - '@babel/traverse': 7.27.0(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.26.10)(styled-components@5.3.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -19247,6 +18265,8 @@ snapshots: stylis@4.2.0: {} + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -19318,34 +18338,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)): - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4)) - postcss-nested: 6.2.0(postcss@8.5.3) - postcss-selector-parser: 6.1.2 - resolve: 1.22.10 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19361,11 +18354,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.4 + postcss-import: 15.1.0(postcss@8.5.4) + postcss-js: 4.0.1(postcss@8.5.4) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + postcss-nested: 6.2.0(postcss@8.5.4) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -19379,7 +18372,7 @@ snapshots: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 '@types/node': 8.10.66 - '@types/qs': 6.9.18 + '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.3 @@ -19410,9 +18403,9 @@ snapshots: tinycolor2@1.6.0: {} - tinyglobby@0.2.12: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 tinygradient@1.1.5: @@ -19461,14 +18454,6 @@ snapshots: tryer@1.0.1: {} - ts-api-utils@1.4.3(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - ts-api-utils@1.4.3(typescript@5.8.2): - dependencies: - typescript: 5.8.2 - ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -19484,14 +18469,6 @@ snapshots: ts-essentials@1.0.4: {} - ts-essentials@7.0.3(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - ts-essentials@7.0.3(typescript@5.8.2): - dependencies: - typescript: 5.8.2 - ts-essentials@7.0.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -19510,7 +18487,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.10.4)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -19524,54 +18501,13 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@20.17.30)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.30 - acorn: 8.14.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.5.4): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 - acorn: 8.14.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - optional: true + '@swc/core': 1.11.29 - ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2): + ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -19585,19 +18521,15 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.2 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - - tsconfck@3.1.5(typescript@5.5.4): - optionalDependencies: - typescript: 5.5.4 + '@swc/core': 1.11.29 - tsconfck@3.1.5(typescript@5.8.2): + tsconfck@3.1.6(typescript@5.8.3): optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 tslib@1.14.1: {} @@ -19607,36 +18539,32 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2))(typescript@5.8.2): + tsup@8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3): dependencies: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.16(@swc/helpers@0.5.17))(@types/node@22.7.5)(typescript@5.8.2)) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) resolve-from: 5.0.0 - rollup: 4.40.0 + rollup: 4.41.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.16(@swc/helpers@0.5.17) - postcss: 8.5.3 - typescript: 5.8.2 + '@swc/core': 1.11.29 + postcss: 8.5.4 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - ts-node tty-browserify@0.0.1: {} - tweetnacl-util@0.15.1: {} - - tweetnacl@1.0.3: {} - type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -19655,42 +18583,10 @@ snapshots: type-fest@1.4.0: {} - typechain@8.3.2(typescript@5.5.4): - dependencies: - '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - typechain@8.3.2(typescript@5.8.2): - dependencies: - '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.8.2) - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19707,8 +18603,6 @@ snapshots: typescript@5.5.4: {} - typescript@5.8.2: {} - typescript@5.8.3: {} typical@4.0.0: {} @@ -19857,18 +18751,18 @@ snapshots: unpipe@1.0.0: {} - unstorage@1.15.0(idb-keyval@6.2.1): + unstorage@1.16.0(idb-keyval@6.2.2): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 destr: 2.0.5 - h3: 1.15.1 + h3: 1.15.3 lru-cache: 10.4.3 node-fetch-native: 1.6.6 ofetch: 1.4.1 ufo: 1.6.1 optionalDependencies: - idb-keyval: 6.2.1 + idb-keyval: 6.2.2 unzip-crx-3@0.2.0: dependencies: @@ -19889,9 +18783,9 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -19943,13 +18837,13 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valtio@1.13.2(@types/react@18.3.20)(react@18.3.1): + valtio@1.13.2(@types/react@18.3.23)(react@18.3.1): dependencies: - derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.20)(react@18.3.1)) + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)) proxy-compare: 2.6.0 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 react: 18.3.1 vfile-location@5.0.3: @@ -19985,118 +18879,67 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.5.4)(zod@3.24.4) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.51) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.2)(zod@3.24.4) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.51) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4): - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.22.4) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.5.4)(zod@3.22.4) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4): - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.5.4)(zod@3.24.4) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.5.4)(zod@3.24.4) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.22.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.2)(zod@3.22.4) + ox: 0.7.1(typescript@5.8.3)(zod@3.22.4) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.2)(zod@3.24.4) + ox: 0.7.1(typescript@5.8.3)(zod@3.25.51) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.7.14(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.4): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.3)(zod@3.24.4) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -20104,72 +18947,61 @@ snapshots: - utf-8-validate - zod - viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4): + viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.2)(zod@3.24.4) + abitype: 1.0.0(typescript@5.8.3)(zod@3.25.51) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-node-polyfills@0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.40.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.41.1) node-stdlib-browser: 1.3.1 - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - rollup - vite-plugin-top-level-await@1.5.0(@swc/helpers@0.5.17)(rollup@4.40.0)(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-top-level-await@1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.40.0) - '@swc/core': 1.11.16(@swc/helpers@0.5.17) + '@rollup/plugin-virtual': 3.0.2(rollup@4.41.1) + '@swc/core': 1.11.29 uuid: 10.0.0 - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.4.1(vite@5.4.18(@types/node@22.7.5)): - dependencies: - vite: 5.4.18(@types/node@22.7.5) - - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.18(@types/node@22.7.5)): + vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.0(supports-color@8.1.1) - globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.5.4) - optionalDependencies: - vite: 5.4.18(@types/node@22.7.5) - transitivePeerDependencies: - - supports-color - - typescript + vite: 5.4.19(@types/node@22.7.5) - vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.18(@types/node@22.7.5)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.8.2) + tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 5.4.18(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color - typescript - vite@5.4.18(@types/node@22.7.5): + vite@5.4.19(@types/node@22.7.5): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.0 + postcss: 8.5.4 + rollup: 4.41.1 optionalDependencies: '@types/node': 22.7.5 fsevents: 2.3.3 @@ -20180,16 +19012,16 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4): + wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) - '@wagmi/connectors': 5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(typescript@5.5.4)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4)) + '@tanstack/react-query': 5.80.3(react@18.3.1) + '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) optionalDependencies: - typescript: 5.5.4 + typescript: 5.8.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -20218,16 +19050,16 @@ snapshots: - utf-8-validate - zod - wagmi@2.15.4(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@18.3.1))(@types/react@18.3.20)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4): + wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): dependencies: - '@tanstack/react-query': 5.74.3(react@18.3.1) - '@wagmi/connectors': 5.8.3(@types/react@18.3.20)(@wagmi/core@2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4))(zod@3.24.4) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.74.3)(@types/react@18.3.20)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4)) + '@tanstack/react-query': 5.80.3(react@18.3.1) + '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -20258,7 +19090,7 @@ snapshots: wait-on@8.0.3: dependencies: - axios: 1.8.4 + axios: 1.9.0 joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -20276,10 +19108,12 @@ snapshots: web-worker@1.2.0: {} + web-worker@1.5.0: {} + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 + bn.js: 5.2.2 ethereum-bloom-filters: 1.2.0 ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 @@ -20400,7 +19234,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.7.1: {} + yaml@2.8.0: {} yargs-parser@18.1.3: dependencies: @@ -20462,11 +19296,11 @@ snapshots: zod@3.22.4: {} - zod@3.24.4: {} + zod@3.25.51: {} - zustand@5.0.0(@types/react@18.3.20)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): + zustand@5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 immer: 10.0.2 react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) From 56f1a094251266f312d3b5eb4721eead61c12b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 4 Jun 2025 16:23:23 +0000 Subject: [PATCH 043/106] Add support scripts (contract watcher/risc0) (#467) * Add cupport scripts * Add enclave config * Update docker packages * Update incorrect path * Tighten up scripts and add scaffold for program-listener * --wip-- [skip ci] * --wip-- [skip ci] * Dont commit enclave folder * Update Dockerfile * Update bad merge * Update program listener * Pass e3_id to rpc * Tidy up docs * Update lockfile * lint --- Cargo.lock | 317 ++++++++- Cargo.toml | 8 +- crates/Dockerfile | 6 +- crates/cli/Cargo.toml | 6 +- crates/cli/src/cli.rs | 12 + crates/cli/src/main.rs | 1 + crates/cli/src/program.rs | 30 + crates/indexer/src/indexer.rs | 26 +- crates/indexer/tests/indexer.rs | 2 +- crates/init/src/lib.rs | 5 +- crates/program-listener/Cargo.toml | 20 + crates/program-listener/src/lib.rs | 147 ++++ crates/support-scripts/Cargo.toml | 11 + crates/support-scripts/README.md | 1 + .../ctl/compile} | 0 .../ctl/container} | 0 .../ctl/run.sh => support-scripts/ctl/run} | 0 .../shell.sh => support-scripts/ctl/shell} | 0 crates/support-scripts/src/lib.rs | 48 ++ crates/support/scripts/container/run.sh | 4 +- examples/CRISP/apps/server/Dockerfile | 5 +- examples/basic/.gitignore | 2 + examples/basic/README.md | 45 +- examples/basic/enclave.config.yaml | 31 + examples/basic/package.json | 12 +- examples/basic/server/index.ts | 42 ++ examples/basic/tsconfig.json | 7 +- pnpm-lock.yaml | 630 +++++++++++++++--- 28 files changed, 1288 insertions(+), 130 deletions(-) create mode 100644 crates/cli/src/program.rs create mode 100644 crates/program-listener/Cargo.toml create mode 100644 crates/program-listener/src/lib.rs create mode 100644 crates/support-scripts/Cargo.toml create mode 100644 crates/support-scripts/README.md rename crates/{support/ctl/compile.sh => support-scripts/ctl/compile} (100%) rename crates/{support/ctl/container.sh => support-scripts/ctl/container} (100%) rename crates/{support/ctl/run.sh => support-scripts/ctl/run} (100%) rename crates/{support/ctl/shell.sh => support-scripts/ctl/shell} (100%) create mode 100644 crates/support-scripts/src/lib.rs create mode 100644 examples/basic/enclave.config.yaml create mode 100644 examples/basic/server/index.ts diff --git a/Cargo.lock b/Cargo.lock index cca7c66e1c..391e7f276a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1766,6 +1766,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.0" @@ -1843,6 +1849,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "compile-time" version = "0.2.0" @@ -1939,6 +1955,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2349,6 +2375,8 @@ dependencies = [ "e3-entrypoint", "e3-events", "e3-init", + "e3-program-listener", + "e3-support-scripts", "hex", "opentelemetry", "opentelemetry-otlp", @@ -2627,6 +2655,23 @@ dependencies = [ "serde", ] +[[package]] +name = "e3-program-listener" +version = "0.1.0" +dependencies = [ + "anyhow", + "e3-compute-provider", + "e3-config", + "e3-evm-helpers", + "e3-indexer", + "e3-program-client", + "e3-support-scripts", + "eyre", + "hex", + "jsonrpsee", + "tokio", +] + [[package]] name = "e3-request" version = "0.1.0" @@ -2668,6 +2713,14 @@ dependencies = [ "tracing", ] +[[package]] +name = "e3-support-scripts" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", +] + [[package]] name = "e3-test-helpers" version = "0.1.0" @@ -3617,6 +3670,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", + "log", "rustls", "rustls-pki-types", "tokio", @@ -3829,7 +3883,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ "async-io", - "core-foundation", + "core-foundation 0.9.4", "fnv", "futures", "if-addrs", @@ -4016,6 +4070,28 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.33" @@ -4036,6 +4112,74 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonrpsee" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "jsonrpsee-types", + "pin-project", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +dependencies = [ + "base64", + "http-body 1.0.1", + "hyper 1.6.0", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +dependencies = [ + "http 1.3.1", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "k256" version = "0.13.4" @@ -4765,7 +4909,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -6229,6 +6373,7 @@ version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ + "log", "once_cell", "ring 0.17.14", "rustls-pki-types", @@ -6237,6 +6382,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -6255,6 +6412,33 @@ dependencies = [ "web-time", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.2", + "security-framework 3.2.0", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -6311,6 +6495,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[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.27" @@ -6358,7 +6551,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -6753,7 +6959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.0", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7368,6 +7574,16 @@ dependencies = [ "libc", ] +[[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" @@ -7497,6 +7713,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.0", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a83f7e1a9f8712695c03eabe9ed3fbca0feff0152f33f12593e5a6303cb1a4" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -7537,6 +7771,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -7607,6 +7850,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -7634,6 +7886,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -7681,6 +7948,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7699,6 +7972,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -7717,6 +7996,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -7747,6 +8032,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -7765,6 +8056,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -7783,6 +8080,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -7801,6 +8104,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index 70242ed321..4791b357d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,10 +17,12 @@ members = [ "crates/keyshare", "crates/logger", "crates/net", - "crates/program-client", + "crates/program-client", + "crates/program-listener", "crates/request", "crates/sdk", "crates/sortition", + "crates/support-scripts", "crates/test-helpers", "crates/tests", ] @@ -70,7 +72,10 @@ e3-keyshare = { version = "0.1.0", path = "./crates/keyshare" } e3-logger = { version = "0.1.0", path = "./crates/logger" } e3-net = { version = "0.1.0", path = "./crates/net" } e3-program-client = { version = "0.1.0", path = "./crates/program-client" } +e3-compute-provider = { version = "0.1.0", path = "./crates/compute-provider" } +e3-program-listener = { version = "0.1.0", path = "./crates/program-listener" } e3-sortition = { version = "0.1.0", path = "./crates/sortition" } +e3-support-scripts = { version = "0.1.0", path = "./crates/support-scripts" } e3-test-helpers = { version = "0.1.0", path = "./crates/test-helpers" } e3-tests = { version = "0.1.0", path = "./crates/tests" } @@ -108,6 +113,7 @@ futures = "0.3.30" futures-util = "0.3" git2 = "0.20.2" hex = "0.4.3" +jsonrpsee = { version = "0.25.1", features = ["http-client"] } lazy_static = "1.5.0" num = "0.4.3" num-bigint = "0.4.6" diff --git a/crates/Dockerfile b/crates/Dockerfile index 63f5071f05..a518907b95 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -27,7 +27,8 @@ WORKDIR /build/crates COPY --from=evm-builder /build/packages/evm/artifacts ../packages/evm/artifacts COPY --from=evm-builder /build/packages/evm/deployments ../packages/evm/deployments -# find crates/* -name "Cargo.*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) crates/|COPY \1 ./|' + +# find crates/* -name "Cargo.toml" -not -path "*/support/*" -printf "COPY %p %p\n" | sed 's|COPY \(.*\) crates/|COPY \1 ./|' COPY crates/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY crates/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml COPY crates/cli/Cargo.toml ./cli/Cargo.toml @@ -46,12 +47,15 @@ COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml COPY crates/logger/Cargo.toml ./logger/Cargo.toml COPY crates/net/Cargo.toml ./net/Cargo.toml COPY crates/program-client/Cargo.toml ./program-client/Cargo.toml +COPY crates/program-listener/Cargo.toml ./program-listener/Cargo.toml COPY crates/request/Cargo.toml ./request/Cargo.toml COPY crates/sdk/Cargo.toml ./sdk/Cargo.toml COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml +COPY crates/support-scripts/Cargo.toml ./support-scripts/Cargo.toml COPY crates/test-helpers/Cargo.toml ./test-helpers/Cargo.toml COPY crates/tests/Cargo.toml ./tests/Cargo.toml + # COPY ./crates/entrypoint/build.rs ./entrypoint/build.rs RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./entrypoint/build.rs RUN for d in ./*/ ; do \ diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 1c87fcbb88..9aeecb61df 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -15,12 +15,14 @@ actix = { workspace = true } anyhow = { workspace = true } clap = { workspace = true } compile-time = { workspace = true } +dialoguer = { workspace = true } e3-config = { workspace = true } e3-crypto = { workspace = true } -dialoguer = { workspace = true } e3-entrypoint = { workspace = true } -e3-init = { workspace = true } e3-events = { workspace = true } +e3-init = { workspace = true } +e3-support-scripts = { workspace = true } +e3-program-listener = { workspace = true } hex = { workspace = true } opentelemetry = { workspace = true } opentelemetry-otlp = { workspace = true } diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index df567b9cf4..156d92d321 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -4,6 +4,7 @@ use crate::helpers::telemetry::setup_tracing; use crate::net::NetCommands; use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; +use crate::program::{self, ProgramCommands}; use crate::start; use crate::wallet::WalletCommands; use crate::{init, net, password, wallet, wizard}; @@ -132,6 +133,8 @@ impl Cli { Commands::Init { .. } => { bail!("Cannot run `enclave init` when a configuration exists."); } + Commands::Compile => e3_support_scripts::program_compile().await?, + Commands::Program { command } => program::execute(command, &config).await?, Commands::Wizard { .. } => { bail!("Cannot run `enclave wizard` when a configuration exists."); } @@ -189,6 +192,15 @@ pub enum Commands { path: Option, }, + /// Compile an Enclave project + Compile, + + /// Program management commands + Program { + #[command(subcommand)] + command: ProgramCommands, + }, + /// Password management commands Password { #[command(subcommand)] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index f0af8c9ded..8f22675a81 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -21,6 +21,7 @@ mod nodes_up; mod password; mod password_delete; mod password_set; +mod program; mod start; mod wallet; mod wallet_set; diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs new file mode 100644 index 0000000000..26ea91cec1 --- /dev/null +++ b/crates/cli/src/program.rs @@ -0,0 +1,30 @@ +use anyhow::Result; +use clap::Subcommand; +use e3_config::AppConfig; + +#[derive(Subcommand, Debug)] +pub enum ProgramCommands { + /// Listen for blockchain events and trigger a computation after an E3Request has expired + Listen { + /// Webhook to trigger upon execution completion + #[arg(long)] + json_rpc_server: String, + + /// Webhook to trigger upon execution completion + #[arg(long)] + chain: String, + }, +} + +pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { + match command { + ProgramCommands::Listen { + json_rpc_server, + chain, + } => { + e3_program_listener::execute(config, &chain, &json_rpc_server).await?; + } + }; + + Ok(()) +} diff --git a/crates/indexer/src/indexer.rs b/crates/indexer/src/indexer.rs index e56bc092b4..00da9dbb77 100644 --- a/crates/indexer/src/indexer.rs +++ b/crates/indexer/src/indexer.rs @@ -145,6 +145,26 @@ pub struct EnclaveIndexer { chain_id: u64, } +impl EnclaveIndexer { + pub async fn new_with_in_mem_store( + listener: EventListener, + contract: EnclaveContract, + ) -> Result> { + let store = InMemoryStore::new(); + + EnclaveIndexer::new(listener, contract, store).await + } + + pub async fn from_endpoint_address_in_mem( + ws_url: &str, + contract_address: &str, + ) -> Result> { + let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; + let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; + EnclaveIndexer::::new_with_in_mem_store(listener, contract).await + } +} + impl EnclaveIndexer { pub async fn new( listener: EventListener, @@ -164,7 +184,11 @@ impl EnclaveIndexer { Ok(instance) } - pub async fn from_strings(ws_url: &str, contract_address: &str, store: S) -> Result { + pub async fn from_endpoint_address( + ws_url: &str, + contract_address: &str, + store: S, + ) -> Result { let listener = EventListener::create_contract_listener(ws_url, contract_address).await?; let contract = EnclaveContractFactory::create_read(ws_url, contract_address).await?; EnclaveIndexer::new(listener, contract, store).await diff --git a/crates/indexer/tests/indexer.rs b/crates/indexer/tests/indexer.rs index 97cfe1409e..f39cb85bf7 100644 --- a/crates/indexer/tests/indexer.rs +++ b/crates/indexer/tests/indexer.rs @@ -21,7 +21,7 @@ async fn test_indexer() -> Result<()> { let (contract, address, endpoint, _anvil) = setup_fake_enclave().await?; let mut indexer = - EnclaveIndexer::from_strings(&endpoint, &address, InMemoryStore::new()).await?; + EnclaveIndexer::::from_endpoint_address_in_mem(&endpoint, &address).await?; indexer .add_event_handler(move |_: InputPublished, mut store| async move { diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 77d8b518e6..a88bbd92c6 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -50,12 +50,15 @@ pub async fn execute(location: Option) -> Result<()> { .await?; copy::copy_with_filters( - &PathBuf::from(TEMP_DIR).join("crates/support/ctl"), + &PathBuf::from(TEMP_DIR).join("crates/support-scripts/ctl"), &cwd.join(".enclave/support/ctl"), &vec![], ) .await?; + // We need to make these chmod 777 because the dockerfile needs to be able to successfully + // write to them. There are better ways to do this but right now this is the most efficient. + // PRs/Ideas welcome. chmod_recursive(&cwd.join("contracts"), "777").await?; chmod_recursive(&cwd.join("tests"), "777").await?; diff --git a/crates/program-listener/Cargo.toml b/crates/program-listener/Cargo.toml new file mode 100644 index 0000000000..f624d7be63 --- /dev/null +++ b/crates/program-listener/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "e3-program-listener" +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true + +[dependencies] +e3-config.workspace = true +e3-indexer.workspace = true +e3-program-client.workspace = true +e3-support-scripts.workspace = true +e3-compute-provider.workspace = true +e3-evm-helpers.workspace = true +anyhow.workspace = true +eyre.workspace = true +tokio.workspace = true +hex.workspace = true +jsonrpsee.workspace = true diff --git a/crates/program-listener/src/lib.rs b/crates/program-listener/src/lib.rs new file mode 100644 index 0000000000..84d4deaad6 --- /dev/null +++ b/crates/program-listener/src/lib.rs @@ -0,0 +1,147 @@ +use anyhow::anyhow; +use anyhow::bail; +use anyhow::Result; +use e3_compute_provider::FHEInputs; +use e3_config::{chain_config::ChainConfig, AppConfig, ContractAddresses}; +use e3_evm_helpers::events::E3Activated; +use e3_indexer::{E3Repository, EnclaveIndexer, InMemoryStore}; +use e3_program_client::run_compute; +use e3_support_scripts::ctl_run; +use jsonrpsee::{ + core::client::ClientT, + http_client::{HttpClient, HttpClientBuilder}, + rpc_params, +}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use tokio::time::{sleep_until, Instant}; + +fn to_hex(bytes: Vec) -> String { + format!("0x{}", hex::encode(bytes)) +} + +#[derive(Clone)] +struct RpcServer { + client: HttpClient, + capabilities: Vec, +} + +impl RpcServer { + pub async fn create(url: &str) -> Result { + let client = HttpClientBuilder::default().build(url)?; + let capabilities = client.request("capabilities", rpc_params![]).await?; + Ok(Self { + client, + capabilities, + }) + } + + fn has_capability(&self, capability: &str) -> bool { + self.capabilities.contains(&capability.to_string()) + } + + async fn should_compute(&self) -> Result { + let result = self.client.request("shouldCompute", rpc_params![]).await?; + Ok(result) + } + + async fn process_output(&self, e3_id: u64, proof: Vec, ciphertext: Vec) -> Result<()> { + let proof = to_hex(proof); + let ciphertext = to_hex(ciphertext); + + let _: u8 = self + .client + .request("processOutput", rpc_params![e3_id, proof, ciphertext]) + .await?; + + Ok(()) + } +} + +pub async fn execute(config: &AppConfig, chain_name: &str, json_rpc_server: &str) -> Result<()> { + let json_rpc_server = json_rpc_server.to_owned(); + let Some(chain) = config.chains().iter().find(|c| c.name == chain_name) else { + anyhow::bail!("No chain '{chain_name}' found in config."); + }; + + tokio::spawn(async { + match ctl_run().await { + Ok(_) => (), + Err(err) => println!("Error running risc0 compute {err}"), + } + }); + + let rpc = RpcServer::create(&json_rpc_server).await?; + + if !rpc.has_capability("processOutput") { + bail!("The JSON_RPC server at {json_rpc_server} must support the `processOutput` method."); + } + + let ChainConfig { + rpc_url, + contracts: + ContractAddresses { + enclave: contract_address, + .. + }, + .. + } = chain; + + let mut indexer = EnclaveIndexer::::from_endpoint_address_in_mem( + &rpc_url, + &contract_address.address(), + ) + .await + .map_err(|e| anyhow!(e))?; + + indexer + .add_event_handler({ + move |event: E3Activated, store| { + let rpc = rpc.clone(); + + async move { + let e3_id = event.e3Id.to::(); + let repo = E3Repository::new(store, e3_id); + + let expiration = event.expiration.to::(); + + // Calculate expiration time to sleep until + let expiration = Instant::now() + + (UNIX_EPOCH + Duration::from_secs(expiration)) + .duration_since(SystemTime::now()) + .unwrap_or_else(|_| Duration::ZERO); + + // TODO: save this to the db and poll in a loop instead of use this async future as if + // the server crashes we loose state sync + sleep_until(expiration).await; + + let e3 = repo.get_e3().await?; + + if rpc.has_capability("shouldCompute") { + // Asks the JSON rpc server if this is ok to compute + if !rpc.should_compute().await.map_err(|e| eyre::eyre!("{e}"))? { + return Ok(()); + } + } + + let fhe_inputs = FHEInputs { + params: e3.e3_params, + ciphertexts: e3.ciphertext_inputs, + }; + + let (proof, ciphertext) = + run_compute(fhe_inputs.params, fhe_inputs.ciphertexts) + .await + .map_err(|e| eyre::eyre!("Error running compute: {e}"))?; + + rpc.process_output(e3_id, proof, ciphertext) + .await + .map_err(|e| eyre::eyre!("{e}"))?; + + Ok(()) + } + } + }) + .await; + + Ok(()) +} diff --git a/crates/support-scripts/Cargo.toml b/crates/support-scripts/Cargo.toml new file mode 100644 index 0000000000..114a278a72 --- /dev/null +++ b/crates/support-scripts/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "e3-support-scripts" +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +tokio.workspace = true diff --git a/crates/support-scripts/README.md b/crates/support-scripts/README.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/crates/support-scripts/README.md @@ -0,0 +1 @@ + diff --git a/crates/support/ctl/compile.sh b/crates/support-scripts/ctl/compile similarity index 100% rename from crates/support/ctl/compile.sh rename to crates/support-scripts/ctl/compile diff --git a/crates/support/ctl/container.sh b/crates/support-scripts/ctl/container similarity index 100% rename from crates/support/ctl/container.sh rename to crates/support-scripts/ctl/container diff --git a/crates/support/ctl/run.sh b/crates/support-scripts/ctl/run similarity index 100% rename from crates/support/ctl/run.sh rename to crates/support-scripts/ctl/run diff --git a/crates/support/ctl/shell.sh b/crates/support-scripts/ctl/shell similarity index 100% rename from crates/support/ctl/shell.sh rename to crates/support-scripts/ctl/shell diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs new file mode 100644 index 0000000000..8ecdffcfa5 --- /dev/null +++ b/crates/support-scripts/src/lib.rs @@ -0,0 +1,48 @@ +use std::{env, path::PathBuf}; + +use anyhow::{bail, Result}; +use tokio::{fs, process::Command}; + +async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { + let mut cmd = Command::new("bash"); + cmd.current_dir(cwd).arg(script); + + for arg in args { + cmd.arg(arg); + } + + let status = cmd.status().await?; + + if status.success() { + Ok(()) + } else { + bail!( + "{} failed with exit code: {:?}", + script.display(), + status.code() + ); + } +} + +async fn ensure_script_exists(script_path: &PathBuf) -> Result<()> { + if !fs::try_exists(script_path).await? { + bail!("Invalid or corrupted project. This command can only be run from within a valid Enclave project."); + } + Ok(()) +} + +pub async fn program_compile() -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/ctl/compile"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) +} + +pub async fn ctl_run() -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/ctl/run"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) +} diff --git a/crates/support/scripts/container/run.sh b/crates/support/scripts/container/run.sh index dd6b38b4e5..80061ffa4b 100755 --- a/crates/support/scripts/container/run.sh +++ b/crates/support/scripts/container/run.sh @@ -1 +1,3 @@ -cargo run --bin e3-support-app +#!/usr/bin/env bash + +cargo run --bin e3-support-app "$@" diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 04375a9118..74d2cd0fe7 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -57,7 +57,7 @@ COPY examples/CRISP/apps/program/methods/Cargo.toml examples/CRISP/apps/program/ COPY Cargo.lock ./Cargo.lock COPY Cargo.toml ./Cargo.toml -# find crates/* -name "Cargo.*" -printf "COPY %p %p\n" +# find crates/* -name "Cargo.toml" -not -path "*/support/*" -printf "COPY %p %p\n" COPY crates/aggregator/Cargo.toml crates/aggregator/Cargo.toml COPY crates/bfv-helpers/Cargo.toml crates/bfv-helpers/Cargo.toml COPY crates/cli/Cargo.toml crates/cli/Cargo.toml @@ -76,12 +76,15 @@ COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml COPY crates/logger/Cargo.toml crates/logger/Cargo.toml COPY crates/net/Cargo.toml crates/net/Cargo.toml COPY crates/program-client/Cargo.toml crates/program-client/Cargo.toml +COPY crates/program-listener/Cargo.toml crates/program-listener/Cargo.toml COPY crates/request/Cargo.toml crates/request/Cargo.toml COPY crates/sdk/Cargo.toml crates/sdk/Cargo.toml COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml +COPY crates/support-scripts/Cargo.toml crates/support-scripts/Cargo.toml COPY crates/test-helpers/Cargo.toml crates/test-helpers/Cargo.toml COPY crates/tests/Cargo.toml crates/tests/Cargo.toml + RUN set -eux; \ find \ examples/CRISP/apps/program \ diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore index c964be9fe8..84943ad254 100644 --- a/examples/basic/.gitignore +++ b/examples/basic/.gitignore @@ -1,6 +1,8 @@ node_modules .env +/.enclave + # Hardhat files /cache /artifacts diff --git a/examples/basic/README.md b/examples/basic/README.md index 09df6c9214..704f9219e1 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -52,15 +52,56 @@ cd ./myproj pnpm install ``` -### 2. Start Local Hardhat Node +### Start Local Hardhat Node ```bash -# Terminal 1 pnpm node ``` Enclave contracts should be automatically deployed. + +### Your FHE program + +Your FHE program is a rust crate located under `./program`. + +### Run your program with enclave + +To verifiably run your program with FHE locally with enclave you first need to setup an RPC server to receive the computation output. + +You RPC server gets called by the enclave program listener when the FHE computation is complete. + +We have set one up in the template to run it you can use the following command: + +```bash +pnpm rpc +``` + +Your RPC must provide the following methods: + +```ts +type Capabilities = "processOutput" | "shouldCompute"; + +interface RpcServer{ + // Handle the FHE + processOutput(e3Id: number, proof: string, ciphertext: string) : number; + capabilities() : Capabilities +} +``` + +### Run a listener + +Next you can use the `enclave program listen` command to run your computation: + +```bash +enclave program listen \ + --json-rpc-server http://localhost:8080 \ + --chain hardhat +``` + +This will listen to your local hardhat node and trigger computations when the E3 round has expired. + + ## Usage Commands ### Ciphernode Management diff --git a/examples/basic/enclave.config.yaml b/examples/basic/enclave.config.yaml new file mode 100644 index 0000000000..4825b41651 --- /dev/null +++ b/examples/basic/enclave.config.yaml @@ -0,0 +1,31 @@ +chains: + - name: "hardhat" + rpc_url: "ws://localhost:8545" + contracts: + enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + ciphernode_registry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" + filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" + +nodes: + cn1: + address: "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" + quic_port: 9201 + autonetkey: true + autopassword: true + cn2: + address: "0xdD2FD4581271e230360230F9337D5c0430Bf44C0" + quic_port: 9202 + autonetkey: true + autopassword: true + cn3: + address: "0x2546BcD3c84621e976D8185a91A922aE77ECEc30" + quic_port: 9203 + autonetkey: true + autopassword: true + ag: + address: "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199" + quic_port: 9094 + autonetkey: true + autopassword: true + role: + type: aggregator diff --git a/examples/basic/package.json b/examples/basic/package.json index 9adef68742..47ea85c0dd 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -7,7 +7,9 @@ "add-ciphernode": "hardhat run scripts/interact.ts -- add-ciphernode", "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", "compile": "hardhat compile", - "test": "hardhat test" + "test": "hardhat test", + "rpc": "ts-node ./server", + "program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"" }, "devDependencies": { "@gnosis-guild/enclave": "workspace:*", @@ -22,16 +24,20 @@ "@typechain/ethers-v6": "^0.5.0", "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", + "@types/express": "^5.0.2", "@types/mocha": ">=9.1.0", "@types/node": ">=18.0.0", "chai": "^4.2.0", + "concurrently": "^9.1.2", "ethers": "^6.4.0", + "express": "^5.1.0", "hardhat": "^2.14.0", "hardhat-deploy": "^0.12.1", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.8.0", - "ts-node": ">=8.0.0", + "ts-node": "^10.9.2", "typechain": "^8.3.0", + "typed-rpc": "^6.1.1", "typescript": ">=4.5.0" } -} \ No newline at end of file +} diff --git a/examples/basic/server/index.ts b/examples/basic/server/index.ts new file mode 100644 index 0000000000..618db59f54 --- /dev/null +++ b/examples/basic/server/index.ts @@ -0,0 +1,42 @@ +import express, { Request, Response } from 'express'; +import { handleRpc } from 'typed-rpc/server'; + +const app = express(); + +app.use(express.json()); + +app.post('/', (req: Request, res: Response) => { + handleRpc(req.body, { + // This is called before a computation is attempted. You can use it to prevent unecessary computation. + shouldCompute(e3Params: string, ciphertextInputs: Array<[string, number]>) { + return ciphertextInputs.length > 0 + }, + + // This is called after computation has occurred + async processOutput(e3Id: number, proof: string, ciphertext: string) { + + + console.log({ e3Id, proof, ciphertext }) + + /* + + const sdk = new EnclaveSdk(...); + await sdk.publishCiphertext(e3Id, proof, ciphertext); + + */ + + return 0; + }, + + + // This informs the caller of what methods are available on this server + capabilities() { + return [ + "shouldCompute", // optional + "processOutput" // mandatory + ] + } + }).then(result => res.json(result)); +}); + +app.listen(8080); diff --git a/examples/basic/tsconfig.json b/examples/basic/tsconfig.json index 574e785c71..76bd0bf91e 100644 --- a/examples/basic/tsconfig.json +++ b/examples/basic/tsconfig.json @@ -1,11 +1,14 @@ { "compilerOptions": { - "target": "es2020", + "target": "ES2020", "module": "commonjs", "esModuleInterop": true, + + "moduleResolution": "bundler", "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "resolveJsonModule": true - } + }, + "include": ["server", "hardhat.config.ts"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4566fcd3a6..3dc58d4118 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,10 +72,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 version: 1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -84,13 +84,13 @@ importers: version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(b303323ac6c5d8ae0490d4ec7875b5eb) + version: 5.0.0(bcfa0a3510ae60f54adff38812306c62) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -311,6 +311,9 @@ importers: '@types/chai': specifier: ^4.2.0 version: 4.3.20 + '@types/express': + specifier: ^5.0.2 + version: 5.0.2 '@types/mocha': specifier: '>=9.1.0' version: 10.0.10 @@ -320,9 +323,15 @@ importers: chai: specifier: ^4.2.0 version: 4.5.0 + concurrently: + specifier: ^9.1.2 + version: 9.1.2 ethers: specifier: ^6.4.0 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + express: + specifier: ^5.1.0 + version: 5.1.0 hardhat: specifier: ^2.14.0 version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -336,11 +345,14 @@ importers: specifier: ^0.8.0 version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: - specifier: '>=8.0.0' + specifier: ^10.9.2 version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) + typed-rpc: + specifier: ^6.1.1 + version: 6.1.1 typescript: specifier: '>=4.5.0' version: 5.8.3 @@ -3104,6 +3116,9 @@ packages: '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} @@ -3113,6 +3128,9 @@ packages: '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/d3-scale-chromatic@3.1.0': resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} @@ -3131,6 +3149,12 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@5.0.2': + resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} + '@types/form-data@0.0.33': resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} @@ -3149,6 +3173,9 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -3170,6 +3197,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -3209,6 +3239,9 @@ packages: '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@18.3.7': resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: @@ -3226,6 +3259,12 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} @@ -3467,6 +3506,10 @@ packages: zod: optional: true + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3751,6 +3794,10 @@ packages: bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -4152,6 +4199,14 @@ packages: constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -4161,10 +4216,18 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + core-js-compat@3.42.0: resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} @@ -4605,6 +4668,9 @@ packages: resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -4631,6 +4697,10 @@ packages: encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -4698,6 +4768,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -4821,6 +4894,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + eth-block-tracker@7.1.0: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} @@ -4902,6 +4979,10 @@ packages: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -5003,6 +5084,10 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -5075,6 +5160,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} @@ -5090,6 +5179,10 @@ packages: framesync@6.0.1: resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -5554,6 +5647,10 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -5659,6 +5756,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -6096,10 +6196,18 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6302,10 +6410,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -6403,6 +6519,10 @@ packages: engines: {node: '>=10'} hasBin: true + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -6581,6 +6701,10 @@ packages: on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -6704,6 +6828,10 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -6734,6 +6862,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7008,6 +7140,10 @@ packages: protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-compare@2.6.0: resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} @@ -7074,10 +7210,18 @@ packages: randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -7334,6 +7478,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7398,9 +7546,17 @@ packages: engines: {node: '>=10'} hasBin: true + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -7984,12 +8140,19 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typechain@8.3.2: resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: typescript: '>=4.3.0' + typed-rpc@6.1.1: + resolution: {integrity: sha512-PZCwvDWNyXHp5ZuHJqixU59jw+61JIL95jkW71VUXPJagYRJtpmRdFdIF3EL5tEz6XHLaBtrqgJEBysHIu4vOw==} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -8259,6 +8422,10 @@ packages: react: optional: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -8652,7 +8819,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -8677,10 +8844,10 @@ snapshots: '@babel/helpers': 7.27.4 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.3 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8721,7 +8888,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -8738,7 +8905,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -8759,7 +8926,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color @@ -8774,9 +8948,9 @@ snapshots: '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -8791,7 +8965,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -8800,13 +8974,13 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color @@ -8824,7 +8998,7 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color @@ -8842,7 +9016,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -8869,7 +9043,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -8913,14 +9087,14 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: @@ -8959,7 +9133,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9020,7 +9194,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9066,7 +9240,7 @@ snapshots: '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9186,7 +9360,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) '@babel/types': 7.27.3 @@ -9400,7 +9574,19 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.27.5 '@babel/types': 7.27.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 + debug: 4.4.1(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9463,11 +9649,10 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -9497,7 +9682,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/runtime': 7.27.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -9792,7 +9977,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10119,7 +10304,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10356,7 +10541,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -10380,7 +10565,7 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -10403,7 +10588,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -10416,7 +10601,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10430,7 +10615,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10654,42 +10839,40 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.0 '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -10699,14 +10882,6 @@ snapshots: hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -10715,13 +10890,20 @@ snapshots: ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 10.1.0 hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -10737,7 +10919,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 10.1.0 hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -10798,20 +10980,19 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(b303323ac6c5d8ae0490d4ec7875b5eb)': + '@nomicfoundation/hardhat-toolbox@5.0.0(bcfa0a3510ae60f54adff38812306c62)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -10824,7 +11005,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -10839,7 +11020,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -10854,7 +11035,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -11635,9 +11816,9 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 @@ -11720,10 +11901,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -11806,14 +11987,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - typescript: 5.8.3 - '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11822,20 +11995,19 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': @@ -11867,6 +12039,11 @@ snapshots: dependencies: '@types/node': 20.10.4 + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.4 + '@types/chai-as-promised@7.1.8': dependencies: '@types/chai': 4.3.20 @@ -11877,6 +12054,10 @@ snapshots: dependencies: '@types/node': 20.10.4 + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.10.4 + '@types/d3-scale-chromatic@3.1.0': {} '@types/d3-scale@4.0.9': @@ -11895,6 +12076,19 @@ snapshots: '@types/estree@1.0.7': {} + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 20.10.4 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.2': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.7 + '@types/form-data@0.0.33': dependencies: '@types/node': 20.10.4 @@ -11919,6 +12113,8 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.4': {} + '@types/js-yaml@4.0.9': {} '@types/jsonfile@6.1.4': @@ -11939,6 +12135,8 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/mime@1.3.5': {} + '@types/minimatch@5.1.2': {} '@types/mkdirp@0.5.2': @@ -11973,6 +12171,8 @@ snapshots: '@types/qs@6.14.0': {} + '@types/range-parser@1.2.7': {} + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: '@types/react': 18.3.23 @@ -11994,6 +12194,17 @@ snapshots: dependencies: '@types/node': 20.10.4 + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.4 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.10.4 + '@types/send': 0.17.4 + '@types/tinycolor2@1.4.6': {} '@types/trusted-types@2.0.7': {} @@ -12026,7 +12237,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12042,7 +12253,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12056,7 +12267,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12791,6 +13002,11 @@ snapshots: typescript: 5.8.3 zod: 3.25.51 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -12811,7 +13027,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13076,6 +13292,20 @@ snapshots: bn.js@5.2.2: {} + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1(supports-color@8.1.1) + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} bowser@2.11.0: {} @@ -13543,14 +13773,24 @@ snapshots: constants-browserify@1.0.0: {} + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} cookie-es@1.2.2: {} + cookie-signature@1.2.2: {} + cookie@0.4.2: {} + cookie@0.7.2: {} + core-js-compat@3.42.0: dependencies: browserslist: 4.25.0 @@ -14044,6 +14284,8 @@ snapshots: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 + ee-first@1.1.1: {} + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -14070,6 +14312,8 @@ snapshots: encode-utf8@1.0.3: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -14200,6 +14444,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -14256,7 +14502,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14349,6 +14595,8 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + eth-block-tracker@7.1.0: dependencies: '@metamask/eth-json-rpc-provider': 1.0.1 @@ -14554,6 +14802,38 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -14645,6 +14925,17 @@ snapshots: filter-obj@1.1.0: {} + finalhandler@2.1.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -14687,7 +14978,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -14717,6 +15008,8 @@ snapshots: format@0.2.2: {} + forwarded@0.2.0: {} + fp-ts@1.19.3: {} fraction.js@4.3.7: {} @@ -14738,6 +15031,8 @@ snapshots: dependencies: tslib: 2.8.1 + fresh@2.0.0: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -15021,7 +15316,7 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -15076,7 +15371,7 @@ snapshots: lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -15099,7 +15394,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15150,7 +15445,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15433,7 +15728,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15499,6 +15794,8 @@ snapshots: dependencies: fp-ts: 1.19.3 + ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} is-alphabetical@1.0.4: {} @@ -15580,6 +15877,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-promise@4.0.0: {} + is-reference@3.0.3: dependencies: '@types/estree': 1.0.7 @@ -16154,8 +16453,12 @@ snapshots: mdn-data@2.0.30: {} + media-typer@1.1.0: {} + memorystream@0.3.1: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -16563,7 +16866,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -16585,7 +16888,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16616,10 +16919,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -16717,6 +17026,8 @@ snapshots: split2: 3.2.2 through2: 4.0.2 + negotiator@1.0.0: {} + neo-async@2.6.2: {} next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -16952,6 +17263,10 @@ snapshots: on-exit-leak-free@0.2.0: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -17002,6 +17317,21 @@ snapshots: transitivePeerDependencies: - zod + ox@0.7.1(typescript@5.8.3): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + ox@0.7.1(typescript@5.8.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -17126,6 +17456,8 @@ snapshots: dependencies: entities: 6.0.0 + parseurl@1.3.3: {} + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -17145,6 +17477,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} pathval@1.1.1: {} @@ -17343,6 +17677,11 @@ snapshots: protocols@2.0.2: {} + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-compare@2.6.0: {} proxy-from-env@1.1.0: {} @@ -17417,6 +17756,8 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 + range-parser@1.2.1: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -17424,6 +17765,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -17753,6 +18101,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -17825,10 +18183,35 @@ snapshots: semver@7.7.2: {} + send@1.2.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -18544,7 +18927,7 @@ snapshots: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 @@ -18583,10 +18966,16 @@ snapshots: type-fest@1.4.0: {} + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18599,6 +18988,8 @@ snapshots: transitivePeerDependencies: - supports-color + typed-rpc@6.1.1: {} + typedarray@0.0.6: {} typescript@5.5.4: {} @@ -18846,6 +19237,8 @@ snapshots: '@types/react': 18.3.23 react: 18.3.1 + vary@1.1.2: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -18913,6 +19306,23 @@ snapshots: - utf-8-validate - zod + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.7.1(typescript@5.8.3) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 @@ -18988,7 +19398,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: From d1634486b0d9edc5ab11520a7baa716c350754bc Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:51:32 +0500 Subject: [PATCH 044/106] Enclave TS & React SDK (#475) * Init Enclave TS SDK * Init Enclave React SDK * Update TS version * Update Types inside the SDK PLEASE WORK * UPrettier :) * Update PNPM lockfile --- examples/basic/client/package.json | 2 + examples/basic/client/src/App.tsx | 4 +- .../basic/client/src/abis/enclave.abi.json | 2136 ----------------- .../client/src/hooks/useEnclaveContract.ts | 268 --- .../basic/client/src/hooks/useWebAssembly.tsx | 1 + examples/basic/client/src/main.tsx | 19 +- examples/basic/client/src/pages/Wizard.tsx | 862 ------- examples/basic/client/src/pages/WizardSDK.tsx | 1024 ++++++++ .../client/src/pages/components/Spinner.tsx | 18 +- examples/basic/client/src/utils/bfv.ts | 114 - .../basic/client/src/utils/enclave.config.ts | 42 - examples/basic/client/src/utils/env-config.ts | 43 + .../client/src/utils/error-formatting.ts | 53 + examples/basic/client/tailwind.config.js | 14 + examples/basic/client/vite.config.ts | 19 +- packages/enclave-react/.gitignore | 21 + packages/enclave-react/README.md | 136 ++ packages/enclave-react/package.json | 48 + packages/enclave-react/src/index.ts | 26 + packages/enclave-react/src/useEnclaveSDK.ts | 177 ++ packages/enclave-react/tsconfig.json | 35 + packages/evm/package.json | 7 +- packages/evm/src/sdk/README.md | 315 +++ packages/evm/src/sdk/contract-client.ts | 302 +++ packages/evm/src/sdk/enclave-sdk.ts | 282 +++ packages/evm/src/sdk/event-listener.ts | 256 ++ packages/evm/src/sdk/index.ts | 56 + packages/evm/src/sdk/types.ts | 209 ++ packages/evm/src/sdk/utils.ts | 171 ++ pnpm-lock.yaml | 796 +++--- pnpm-workspace.yaml | 1 + 31 files changed, 3608 insertions(+), 3849 deletions(-) delete mode 100644 examples/basic/client/src/abis/enclave.abi.json delete mode 100644 examples/basic/client/src/hooks/useEnclaveContract.ts delete mode 100644 examples/basic/client/src/pages/Wizard.tsx create mode 100644 examples/basic/client/src/pages/WizardSDK.tsx delete mode 100644 examples/basic/client/src/utils/bfv.ts delete mode 100644 examples/basic/client/src/utils/enclave.config.ts create mode 100644 examples/basic/client/src/utils/env-config.ts create mode 100644 examples/basic/client/src/utils/error-formatting.ts create mode 100644 packages/enclave-react/.gitignore create mode 100644 packages/enclave-react/README.md create mode 100644 packages/enclave-react/package.json create mode 100644 packages/enclave-react/src/index.ts create mode 100644 packages/enclave-react/src/useEnclaveSDK.ts create mode 100644 packages/enclave-react/tsconfig.json create mode 100644 packages/evm/src/sdk/README.md create mode 100644 packages/evm/src/sdk/contract-client.ts create mode 100644 packages/evm/src/sdk/enclave-sdk.ts create mode 100644 packages/evm/src/sdk/event-listener.ts create mode 100644 packages/evm/src/sdk/index.ts create mode 100644 packages/evm/src/sdk/types.ts create mode 100644 packages/evm/src/sdk/utils.ts diff --git a/examples/basic/client/package.json b/examples/basic/client/package.json index 8a10f5dd67..153c31f28a 100644 --- a/examples/basic/client/package.json +++ b/examples/basic/client/package.json @@ -16,6 +16,8 @@ "preview": "vite preview" }, "dependencies": { + "@gnosis-guild/enclave": "workspace:*", + "@gnosis-guild/enclave-react": "workspace:*", "@phosphor-icons/react": "^2.1.4", "@tanstack/react-query": "^5.74.3", "@wagmi/core": "^2.14.16", diff --git a/examples/basic/client/src/App.tsx b/examples/basic/client/src/App.tsx index 811b175878..eec6d6503d 100644 --- a/examples/basic/client/src/App.tsx +++ b/examples/basic/client/src/App.tsx @@ -1,11 +1,11 @@ import React from 'react' -import Wizard from './pages/Wizard' +import WizardSDK from './pages/WizardSDK' import './globals.css' const App: React.FC = () => { return (
- +
) } diff --git a/examples/basic/client/src/abis/enclave.abi.json b/examples/basic/client/src/abis/enclave.abi.json deleted file mode 100644 index dbd0852dd0..0000000000 --- a/examples/basic/client/src/abis/enclave.abi.json +++ /dev/null @@ -1,2136 +0,0 @@ -{ - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "contract ICiphernodeRegistry", - "name": "_ciphernodeRegistry", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_maxDuration", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "_e3ProgramsParams", - "type": "bytes[]" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "CiphertextOutputAlreadyPublished", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "CiphertextOutputNotPublished", - "type": "error" - }, - { - "inputs": [], - "name": "CommitteeSelectionFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "E3AlreadyActivated", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "E3DoesNotExist", - "type": "error" - }, - { - "inputs": [], - "name": "E3Expired", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "E3NotActivated", - "type": "error" - }, - { - "inputs": [], - "name": "E3NotReady", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "E3ProgramNotAllowed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - } - ], - "name": "InputDeadlineNotPassed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - } - ], - "name": "InputDeadlinePassed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "contract ICiphernodeRegistry", - "name": "ciphernodeRegistry", - "type": "address" - } - ], - "name": "InvalidCiphernodeRegistry", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "contract IInputValidator", - "name": "inputValidator", - "type": "address" - } - ], - "name": "InvalidComputationRequest", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "InvalidDuration", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "InvalidEncryptionScheme", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInput", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "output", - "type": "bytes" - } - ], - "name": "InvalidOutput", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidStartWindow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint32[2]", - "name": "threshold", - "type": "uint32[2]" - } - ], - "name": "InvalidThreshold", - "type": "error" - }, - { - "inputs": [], - "name": "LeafAlreadyExists", - "type": "error" - }, - { - "inputs": [], - "name": "LeafCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "LeafGreaterThanSnarkScalarField", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleAlreadyEnabled", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleNotEnabled", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnableInvalidOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "OwnableUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "PaymentRequired", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "PlaintextOutputAlreadyPublished", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes[]", - "name": "e3ProgramParams", - "type": "bytes[]" - } - ], - "name": "AllowedE3ProgramsParamsSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "ciphernodeRegistry", - "type": "address" - } - ], - "name": "CiphernodeRegistrySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "ciphertextOutput", - "type": "bytes" - } - ], - "name": "CiphertextOutputPublished", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "committeePublicKey", - "type": "bytes" - } - ], - "name": "E3Activated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "E3ProgramDisabled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "E3ProgramEnabled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "seed", - "type": "uint256" - }, - { - "internalType": "uint32[2]", - "name": "threshold", - "type": "uint32[2]" - }, - { - "internalType": "uint256", - "name": "requestBlock", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "startWindow", - "type": "uint256[2]" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - }, - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - }, - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - }, - { - "internalType": "contract IInputValidator", - "name": "inputValidator", - "type": "address" - }, - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "committeePublicKey", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "ciphertextOutput", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - } - ], - "indexed": false, - "internalType": "struct E3", - "name": "e3", - "type": "tuple" - }, - { - "indexed": false, - "internalType": "address", - "name": "filter", - "type": "address" - }, - { - "indexed": true, - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "E3Requested", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "EncryptionSchemeDisabled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "EncryptionSchemeEnabled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "inputHash", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "InputPublished", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "maxDuration", - "type": "uint256" - } - ], - "name": "MaxDurationSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - } - ], - "name": "PlaintextOutputPublished", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - } - ], - "name": "activate", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ciphernodeRegistry", - "outputs": [ - { - "internalType": "contract ICiphernodeRegistry", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "decryptionVerifiers", - "outputs": [ - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "disableE3Program", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "disableEncryptionScheme", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "e3Programs", - "outputs": [ - { - "internalType": "bool", - "name": "allowed", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - } - ], - "name": "e3ProgramsParams", - "outputs": [ - { - "internalType": "bool", - "name": "allowed", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "e3s", - "outputs": [ - { - "internalType": "uint256", - "name": "seed", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "requestBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - }, - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - }, - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - }, - { - "internalType": "contract IInputValidator", - "name": "inputValidator", - "type": "address" - }, - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "committeePublicKey", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "ciphertextOutput", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - } - ], - "name": "enableE3Program", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - } - ], - "name": "getDecryptionVerifier", - "outputs": [ - { - "internalType": "contract IDecryptionVerifier", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "getE3", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "seed", - "type": "uint256" - }, - { - "internalType": "uint32[2]", - "name": "threshold", - "type": "uint32[2]" - }, - { - "internalType": "uint256", - "name": "requestBlock", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "startWindow", - "type": "uint256[2]" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - }, - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - }, - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - }, - { - "internalType": "contract IInputValidator", - "name": "inputValidator", - "type": "address" - }, - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "committeePublicKey", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "ciphertextOutput", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - } - ], - "internalType": "struct E3", - "name": "e3", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "getInputRoot", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "contract ICiphernodeRegistry", - "name": "_ciphernodeRegistry", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_maxDuration", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "_e3ProgramsParams", - "type": "bytes[]" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "inputCounts", - "outputs": [ - { - "internalType": "uint256", - "name": "inputCount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - } - ], - "name": "inputs", - "outputs": [ - { - "internalType": "uint256", - "name": "size", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "depth", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nexte3Id", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "ciphertextOutput", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "name": "publishCiphertextOutput", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "publishInput", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "name": "publishPlaintextOutput", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "filter", - "type": "address" - }, - { - "internalType": "uint32[2]", - "name": "threshold", - "type": "uint32[2]" - }, - { - "internalType": "uint256[2]", - "name": "startWindow", - "type": "uint256[2]" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - }, - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "computeProviderParams", - "type": "bytes" - } - ], - "name": "request", - "outputs": [ - { - "internalType": "uint256", - "name": "e3Id", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "seed", - "type": "uint256" - }, - { - "internalType": "uint32[2]", - "name": "threshold", - "type": "uint32[2]" - }, - { - "internalType": "uint256", - "name": "requestBlock", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "startWindow", - "type": "uint256[2]" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiration", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - }, - { - "internalType": "contract IE3Program", - "name": "e3Program", - "type": "address" - }, - { - "internalType": "bytes", - "name": "e3ProgramParams", - "type": "bytes" - }, - { - "internalType": "contract IInputValidator", - "name": "inputValidator", - "type": "address" - }, - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "committeePublicKey", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "ciphertextOutput", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "plaintextOutput", - "type": "bytes" - } - ], - "internalType": "struct E3", - "name": "e3", - "type": "tuple" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "requests", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ICiphernodeRegistry", - "name": "_ciphernodeRegistry", - "type": "address" - } - ], - "name": "setCiphernodeRegistry", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "encryptionSchemeId", - "type": "bytes32" - }, - { - "internalType": "contract IDecryptionVerifier", - "name": "decryptionVerifier", - "type": "address" - } - ], - "name": "setDecryptionVerifier", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes[]", - "name": "_e3ProgramsParams", - "type": "bytes[]" - } - ], - "name": "setE3ProgramsParams", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_maxDuration", - "type": "uint256" - } - ], - "name": "setMaxDuration", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "transactionIndex": 0, - "gasUsed": "2348382", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000001000000000000000000100000000000000000020000000000000100000800000000000000000000800000000400420000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210000000000001000000000002004000000000000000020000000000000000000000000000001000000000800000000800000000000000000", - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29", - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 0, - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" - }, - { - "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "topics": [ - "0xba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000278d00", - "logIndex": 1, - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" - }, - { - "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "topics": [ - "0x80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 2, - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" - }, - { - "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "topics": [ - "0x027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000ffffffff00001", - "logIndex": 3, - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" - }, - { - "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0xf037dcbc1f7fc6588b024abb9f65da8a6ee46ebe971765bccd7cbc2c4027a9b9", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "topics": [ - "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 4, - "blockHash": "0x832804126cfb7e5a4db86126a96a0b185189e5f10f23d3896b95389c12921a29" - } - ], - "blockNumber": 2, - "cumulativeGasUsed": "2348382", - "status": 1, - "byzantium": true - }, - "args": [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x0000000000000000000000000000000000000001", - 2592000, - [ - "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000ffffffff00001" - ] - ], - "numDeployments": 1, - "solcInputHash": "80cb5ee2e1fd6ae6ae6f35878559ec6f", - "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputAlreadyPublished\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"CiphertextOutputNotPublished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitteeSelectionFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3AlreadyActivated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3DoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3Expired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"E3NotActivated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E3NotReady\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlineNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"InputDeadlinePassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"InvalidCiphernodeRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"}],\"name\":\"InvalidComputationRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"InvalidEncryptionScheme\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"output\",\"type\":\"bytes\"}],\"name\":\"InvalidOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStartWindow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"}],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeafGreaterThanSnarkScalarField\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"PaymentRequired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"PlaintextOutputAlreadyPublished\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"e3ProgramParams\",\"type\":\"bytes[]\"}],\"name\":\"AllowedE3ProgramsParamsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"CiphernodeRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"}],\"name\":\"CiphertextOutputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"committeePublicKey\",\"type\":\"bytes\"}],\"name\":\"E3Activated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3ProgramEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"E3Requested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"EncryptionSchemeEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inputHash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"InputPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxDuration\",\"type\":\"uint256\"}],\"name\":\"MaxDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"name\":\"PlaintextOutputPublished\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"activate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ciphernodeRegistry\",\"outputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"decryptionVerifiers\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"disableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"disableEncryptionScheme\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"e3Programs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"}],\"name\":\"e3ProgramsParams\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"e3s\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"}],\"name\":\"enableE3Program\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"}],\"name\":\"getDecryptionVerifier\",\"outputs\":[{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getE3\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"getInputRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputCounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"inputCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"}],\"name\":\"inputs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nexte3Id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"ciphertextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishCiphertextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"publishInput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"publishPlaintextOutput\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"filter\",\"type\":\"address\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"computeProviderParams\",\"type\":\"bytes\"}],\"name\":\"request\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"e3Id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"uint32[2]\",\"name\":\"threshold\",\"type\":\"uint32[2]\"},{\"internalType\":\"uint256\",\"name\":\"requestBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"startWindow\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IE3Program\",\"name\":\"e3Program\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"e3ProgramParams\",\"type\":\"bytes\"},{\"internalType\":\"contract IInputValidator\",\"name\":\"inputValidator\",\"type\":\"address\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"committeePublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"ciphertextOutput\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"plaintextOutput\",\"type\":\"bytes\"}],\"internalType\":\"struct E3\",\"name\":\"e3\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICiphernodeRegistry\",\"name\":\"_ciphernodeRegistry\",\"type\":\"address\"}],\"name\":\"setCiphernodeRegistry\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionSchemeId\",\"type\":\"bytes32\"},{\"internalType\":\"contract IDecryptionVerifier\",\"name\":\"decryptionVerifier\",\"type\":\"address\"}],\"name\":\"setDecryptionVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"_e3ProgramsParams\",\"type\":\"bytes[]\"}],\"name\":\"setE3ProgramsParams\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxDuration\",\"type\":\"uint256\"}],\"name\":\"setMaxDuration\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"AllowedE3ProgramsParamsSet(bytes[])\":{\"params\":{\"e3ProgramParams\":\"Array of encoded encryption scheme parameters (e.g, for BFV)\"}},\"CiphernodeRegistrySet(address)\":{\"params\":{\"ciphernodeRegistry\":\"The address of the CiphernodeRegistry contract.\"}},\"CiphertextOutputPublished(uint256,bytes)\":{\"params\":{\"ciphertextOutput\":\"ABI encoded ciphertext output.\",\"e3Id\":\"ID of the E3.\"}},\"E3Activated(uint256,uint256,bytes)\":{\"params\":{\"committeePublicKey\":\"Public key of the committee.\",\"e3Id\":\"ID of the E3.\",\"expiration\":\"Timestamp when committee duties expire.\"}},\"E3ProgramDisabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3ProgramEnabled(address)\":{\"params\":{\"e3Program\":\"The address of the E3 Program.\"}},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"params\":{\"e3\":\"Details of the E3.\",\"e3Id\":\"ID of the E3.\",\"e3Program\":\"Address of the Computation module selected.\",\"filter\":\"Address of the pool of nodes from which the Cipher Node committee was selected.\"}},\"EncryptionSchemeDisabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was disabled.\"}},\"EncryptionSchemeEnabled(bytes32)\":{\"params\":{\"encryptionSchemeId\":\"The ID of the encryption scheme that was enabled.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"params\":{\"data\":\"ABI encoded input data.\",\"e3Id\":\"ID of the E3.\"}},\"MaxDurationSet(uint256)\":{\"params\":{\"maxDuration\":\"The maximum duration of a computation in seconds.\"}},\"PlaintextOutputPublished(uint256,bytes)\":{\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\"}}},\"kind\":\"dev\",\"methods\":{\"activate(uint256,bytes)\":{\"details\":\"This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"publicKey\":\"Public key of the committee.\"},\"returns\":{\"success\":\"True if the E3 was successfully activated.\"}},\"constructor\":{\"params\":{\"_e3ProgramsParams\":\"Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\",\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"getE3(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"e3\":\"The struct representing the requested E3.\"}},\"getInputRoot(uint256)\":{\"details\":\"This function MUST revert if the E3 does not exist.\",\"params\":{\"e3Id\":\"ID of the E3.\"},\"returns\":{\"_0\":\"The root of the input merkle tree.\"}},\"initialize(address,address,uint256,bytes[])\":{\"params\":{\"_ciphernodeRegistry\":\"The address of the ciphernode registry\",\"_e3ProgramsParams\":\"Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\",\"_maxDuration\":\"The maximum duration of a computation in seconds\",\"_owner\":\"The owner of this contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST emit the CiphertextOutputPublished event.\",\"params\":{\"ciphertextOutput\":\"ABI encoded output data to verify.\",\"e3Id\":\"ID of the E3.\",\"proof\":\"ABI encoded data to verify the ciphertextOutput.\"},\"returns\":{\"success\":\"True if the output was successfully published.\"}},\"publishInput(uint256,bytes)\":{\"details\":\"This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.\",\"params\":{\"data\":\"ABI encoded input data to publish.\",\"e3Id\":\"ID of the E3.\"},\"returns\":{\"success\":\"True if the input was successfully published.\"}},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"details\":\"This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.\",\"params\":{\"e3Id\":\"ID of the E3.\",\"plaintextOutput\":\"ABI encoded plaintext output.\",\"proof\":\"ABI encoded data to verify the plaintextOutput.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"details\":\"This function MUST emit the E3Requested event.\",\"params\":{\"computeProviderParams\":\"ABI encoded compute provider parameters.\",\"duration\":\"The duration of the computation in seconds.\",\"e3Program\":\"Address of the E3 Program.\",\"e3ProgramParams\":\"ABI encoded computation parameters.\",\"filter\":\"IDs of the pool of nodes from which to select the committee.\",\"threshold\":\"The M/N threshold for the committee.\"},\"returns\":{\"e3\":\"The E3 struct.\",\"e3Id\":\"ID of the E3.\"}},\"setMaxDuration(uint256)\":{\"params\":{\"_maxDuration\":\"The maximum duration of a computation in seconds.\"},\"returns\":{\"success\":\"True if the max duration was successfully set.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"AllowedE3ProgramsParamsSet(bytes[])\":{\"notice\":\"Emitted when the allowed E3 encryption scheme parameters are configured.\"},\"CiphernodeRegistrySet(address)\":{\"notice\":\"This event MUST be emitted any time the CiphernodeRegistry is set.\"},\"CiphertextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published.\"},\"E3Activated(uint256,uint256,bytes)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\"},\"E3ProgramDisabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is disabled.\"},\"E3ProgramEnabled(address)\":{\"notice\":\"This event MUST be emitted any time a E3 Program is enabled.\"},\"E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)\":{\"notice\":\"This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\"},\"EncryptionSchemeDisabled(bytes32)\":{\"notice\":\"This event MUST be emitted any time an encryption scheme is disabled.\"},\"EncryptionSchemeEnabled(bytes32)\":{\"notice\":\"The event MUST be emitted any time an encryption scheme is enabled.\"},\"InputPublished(uint256,bytes,uint256,uint256)\":{\"notice\":\"This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published.\"},\"MaxDurationSet(uint256)\":{\"notice\":\"This event MUST be emitted any time the `maxDuration` is set.\"},\"PlaintextOutputPublished(uint256,bytes)\":{\"notice\":\"This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published.\"}},\"kind\":\"user\",\"methods\":{\"activate(uint256,bytes)\":{\"notice\":\"This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input.\"},\"e3ProgramsParams(bytes)\":{\"notice\":\"Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV).\"},\"getE3(uint256)\":{\"notice\":\"This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\"},\"getInputRoot(uint256)\":{\"notice\":\"This function returns root of the input merkle tree for a given E3.\"},\"publishCiphertextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function should be called to publish output data for an Encrypted Execution Environment (E3).\"},\"publishInput(uint256,bytes)\":{\"notice\":\"This function should be called to publish input data for Encrypted Execution Environment (E3).\"},\"publishPlaintextOutput(uint256,bytes,bytes)\":{\"notice\":\"This function publishes the plaintext output of an Encrypted Execution Environment (E3).\"},\"request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)\":{\"notice\":\"This function should be called to request a computation within an Encrypted Execution Environment (E3).\"},\"setMaxDuration(uint256)\":{\"notice\":\"This function should be called to set the maximum duration of requested computations.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Enclave.sol\":\"Enclave\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\\n struct OwnableStorage {\\n address _owner;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Ownable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\\n\\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\\n assembly {\\n $.slot := OwnableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n function __Ownable_init(address initialOwner) internal onlyInitializing {\\n __Ownable_init_unchained(initialOwner);\\n }\\n\\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n OwnableStorage storage $ = _getOwnableStorage();\\n return $._owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n OwnableStorage storage $ = _getOwnableStorage();\\n address oldOwner = $._owner;\\n $._owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\\n *\\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\\n */\\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\\n return INITIALIZABLE_STORAGE;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n bytes32 slot = _initializableStorageSlot();\\n assembly {\\n $.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\"},\"@zk-kit/lean-imt.sol/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xb1944a1d9f63069b2f22260935adb2d11546f82fbb7d12d853a90134a92f4b5b\",\"license\":\"UNLICENSED\"},\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\nimport {SNARK_SCALAR_FIELD} from \\\"./Constants.sol\\\";\\n\\nstruct LeanIMTData {\\n // Tracks the current number of leaves in the tree.\\n uint256 size;\\n // Represents the current depth of the tree, which can increase as new leaves are inserted.\\n uint256 depth;\\n // A mapping from each level of the tree to the node value of the last even position at that level.\\n // Used for efficient inserts, updates and root calculations.\\n mapping(uint256 => uint256) sideNodes;\\n // A mapping from leaf values to their respective indices in the tree.\\n // This facilitates checks for leaf existence and retrieval of leaf positions.\\n mapping(uint256 => uint256) leaves;\\n}\\n\\nerror WrongSiblingNodes();\\nerror LeafGreaterThanSnarkScalarField();\\nerror LeafCannotBeZero();\\nerror LeafAlreadyExists();\\nerror LeafDoesNotExist();\\n\\n/// @title Lean Incremental binary Merkle tree.\\n/// @dev The LeanIMT is an optimized version of the BinaryIMT.\\n/// This implementation eliminates the use of zeroes, and make the tree depth dynamic.\\n/// When a node doesn't have the right child, instead of using a zero hash as in the BinaryIMT,\\n/// the node's value becomes that of its left child. Furthermore, rather than utilizing a static tree depth,\\n/// it is updated based on the number of leaves in the tree. This approach\\n/// results in the calculation of significantly fewer hashes, making the tree more efficient.\\nlibrary InternalLeanIMT {\\n /// @dev Inserts a new leaf into the incremental merkle tree.\\n /// The function ensures that the leaf is valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the new leaf to be inserted into the tree.\\n /// @return The new hash of the node after the leaf has been inserted.\\n function _insert(LeanIMTData storage self, uint256 leaf) internal returns (uint256) {\\n if (leaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaf == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = self.size;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // A new insertion can increase a tree's depth by at most 1,\\n // and only if the number of leaves supported by the current\\n // depth is less than the number of leaves to be supported after insertion.\\n if (2 ** treeDepth < index + 1) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n uint256 node = leaf;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n node = PoseidonT3.hash([self.sideNodes[level], node]);\\n } else {\\n self.sideNodes[level] = node;\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n self.size = ++index;\\n\\n self.sideNodes[treeDepth] = node;\\n self.leaves[leaf] = index;\\n\\n return node;\\n }\\n\\n /// @dev Inserts many leaves into the incremental merkle tree.\\n /// The function ensures that the leaves are valid according to the\\n /// constraints of the tree and then updates the tree's structure accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaves: The values of the new leaves to be inserted into the tree.\\n /// @return The root after the leaves have been inserted.\\n function _insertMany(LeanIMTData storage self, uint256[] calldata leaves) internal returns (uint256) {\\n // Cache tree size to optimize gas\\n uint256 treeSize = self.size;\\n\\n // Check that all the new values are correct to be added.\\n for (uint256 i = 0; i < leaves.length; ) {\\n if (leaves[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (leaves[i] == 0) {\\n revert LeafCannotBeZero();\\n } else if (_has(self, leaves[i])) {\\n revert LeafAlreadyExists();\\n }\\n\\n self.leaves[leaves[i]] = treeSize + 1 + i;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Array to save the nodes that will be used to create the next level of the tree.\\n uint256[] memory currentLevelNewNodes;\\n\\n currentLevelNewNodes = leaves;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n // Calculate the depth of the tree after adding the new values.\\n // Unlike the 'insert' function, we need a while here as\\n // N insertions can increase the tree's depth more than once.\\n while (2 ** treeDepth < treeSize + leaves.length) {\\n ++treeDepth;\\n }\\n\\n self.depth = treeDepth;\\n\\n // First index to change in every level.\\n uint256 currentLevelStartIndex = treeSize;\\n\\n // Size of the level used to create the next level.\\n uint256 currentLevelSize = treeSize + leaves.length;\\n\\n // The index where changes begin at the next level.\\n uint256 nextLevelStartIndex = currentLevelStartIndex >> 1;\\n\\n // The size of the next level.\\n uint256 nextLevelSize = ((currentLevelSize - 1) >> 1) + 1;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n // The number of nodes for the new level that will be created,\\n // only the new values, not the entire level.\\n uint256 numberOfNewNodes = nextLevelSize - nextLevelStartIndex;\\n uint256[] memory nextLevelNewNodes = new uint256[](numberOfNewNodes);\\n for (uint256 i = 0; i < numberOfNewNodes; ) {\\n uint256 leftNode;\\n\\n // Assign the left node using the saved path or the position in the array.\\n if ((i + nextLevelStartIndex) * 2 < currentLevelStartIndex) {\\n leftNode = self.sideNodes[level];\\n } else {\\n leftNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 - currentLevelStartIndex];\\n }\\n\\n uint256 rightNode;\\n\\n // Assign the right node if the value exists.\\n if ((i + nextLevelStartIndex) * 2 + 1 < currentLevelSize) {\\n rightNode = currentLevelNewNodes[(i + nextLevelStartIndex) * 2 + 1 - currentLevelStartIndex];\\n }\\n\\n uint256 parentNode;\\n\\n // Assign the parent node.\\n // If it has a right child the result will be the hash(leftNode, rightNode) if not,\\n // it will be the leftNode.\\n if (rightNode != 0) {\\n parentNode = PoseidonT3.hash([leftNode, rightNode]);\\n } else {\\n parentNode = leftNode;\\n }\\n\\n nextLevelNewNodes[i] = parentNode;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Update the `sideNodes` variable.\\n // If `currentLevelSize` is odd, the saved value will be the last value of the array\\n // if it is even and there are more than 1 element in `currentLevelNewNodes`, the saved value\\n // will be the value before the last one.\\n // If it is even and there is only one element, there is no need to save anything because\\n // the correct value for this level was already saved before.\\n if (currentLevelSize & 1 == 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 1];\\n } else if (currentLevelNewNodes.length > 1) {\\n self.sideNodes[level] = currentLevelNewNodes[currentLevelNewNodes.length - 2];\\n }\\n\\n currentLevelStartIndex = nextLevelStartIndex;\\n\\n // Calculate the next level startIndex value.\\n // It is the position of the parent node which is pos/2.\\n nextLevelStartIndex >>= 1;\\n\\n // Update the next array that will be used to calculate the next level.\\n currentLevelNewNodes = nextLevelNewNodes;\\n\\n currentLevelSize = nextLevelSize;\\n\\n // Calculate the size of the next level.\\n // The size of the next level is (currentLevelSize - 1) / 2 + 1.\\n nextLevelSize = ((nextLevelSize - 1) >> 1) + 1;\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n // Update tree size\\n self.size = treeSize + leaves.length;\\n\\n // Update tree root\\n self.sideNodes[treeDepth] = currentLevelNewNodes[0];\\n\\n return currentLevelNewNodes[0];\\n }\\n\\n /// @dev Updates the value of an existing leaf and recalculates hashes\\n /// to maintain tree integrity.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf that is to be updated.\\n /// @param newLeaf: The new value that will replace the oldLeaf in the tree.\\n /// @param siblingNodes: An array of sibling nodes that are necessary to recalculate the path to the root.\\n /// @return The new hash of the updated node after the leaf has been updated.\\n function _update(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256 newLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n if (newLeaf >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n } else if (!_has(self, oldLeaf)) {\\n revert LeafDoesNotExist();\\n } else if (_has(self, newLeaf)) {\\n revert LeafAlreadyExists();\\n }\\n\\n uint256 index = _indexOf(self, oldLeaf);\\n uint256 node = newLeaf;\\n uint256 oldRoot = oldLeaf;\\n\\n uint256 lastIndex = self.size - 1;\\n uint256 i = 0;\\n\\n // Cache tree depth to optimize gas\\n uint256 treeDepth = self.depth;\\n\\n for (uint256 level = 0; level < treeDepth; ) {\\n if ((index >> level) & 1 == 1) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([siblingNodes[i], node]);\\n oldRoot = PoseidonT3.hash([siblingNodes[i], oldRoot]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n if (index >> level != lastIndex >> level) {\\n if (siblingNodes[i] >= SNARK_SCALAR_FIELD) {\\n revert LeafGreaterThanSnarkScalarField();\\n }\\n\\n node = PoseidonT3.hash([node, siblingNodes[i]]);\\n oldRoot = PoseidonT3.hash([oldRoot, siblingNodes[i]]);\\n\\n unchecked {\\n ++i;\\n }\\n } else {\\n self.sideNodes[i] = node;\\n }\\n }\\n\\n unchecked {\\n ++level;\\n }\\n }\\n\\n if (oldRoot != _root(self)) {\\n revert WrongSiblingNodes();\\n }\\n\\n self.sideNodes[treeDepth] = node;\\n\\n if (newLeaf != 0) {\\n self.leaves[newLeaf] = self.leaves[oldLeaf];\\n }\\n\\n self.leaves[oldLeaf] = 0;\\n\\n return node;\\n }\\n\\n /// @dev Removes a leaf from the tree by setting its value to zero.\\n /// This function utilizes the update function to set the leaf's value\\n /// to zero and update the tree's state accordingly.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param oldLeaf: The value of the leaf to be removed.\\n /// @param siblingNodes: An array of sibling nodes required for updating the path to the root after removal.\\n /// @return The new root hash of the tree after the leaf has been removed.\\n function _remove(\\n LeanIMTData storage self,\\n uint256 oldLeaf,\\n uint256[] calldata siblingNodes\\n ) internal returns (uint256) {\\n return _update(self, oldLeaf, 0, siblingNodes);\\n }\\n\\n /// @dev Checks if a leaf exists in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf to check for existence.\\n /// @return A boolean value indicating whether the leaf exists in the tree.\\n function _has(LeanIMTData storage self, uint256 leaf) internal view returns (bool) {\\n return self.leaves[leaf] != 0;\\n }\\n\\n /// @dev Retrieves the index of a given leaf in the tree.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @param leaf: The value of the leaf whose index is to be found.\\n /// @return The index of the specified leaf within the tree. If the leaf is not present, the function\\n /// reverts with a custom error.\\n function _indexOf(LeanIMTData storage self, uint256 leaf) internal view returns (uint256) {\\n if (self.leaves[leaf] == 0) {\\n revert LeafDoesNotExist();\\n }\\n\\n return self.leaves[leaf] - 1;\\n }\\n\\n /// @dev Retrieves the root of the tree from the 'sideNodes' mapping using the\\n /// current tree depth.\\n /// @param self: A storage reference to the 'LeanIMTData' struct.\\n /// @return The root hash of the tree.\\n function _root(LeanIMTData storage self) internal view returns (uint256) {\\n return self.sideNodes[self.depth];\\n }\\n}\\n\",\"keccak256\":\"0x6385ce9153d11d9824163464193d4ba3dd304e662dccd365ba2fc381a359762b\",\"license\":\"MIT\"},\"contracts/Enclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IEnclave, E3, IE3Program } from \\\"./interfaces/IEnclave.sol\\\";\\nimport { IInputValidator } from \\\"./interfaces/IInputValidator.sol\\\";\\nimport { ICiphernodeRegistry } from \\\"./interfaces/ICiphernodeRegistry.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./interfaces/IDecryptionVerifier.sol\\\";\\nimport {\\n OwnableUpgradeable\\n} from \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport {\\n InternalLeanIMT,\\n LeanIMTData,\\n PoseidonT3\\n} from \\\"@zk-kit/lean-imt.sol/InternalLeanIMT.sol\\\";\\n\\ncontract Enclave is IEnclave, OwnableUpgradeable {\\n using InternalLeanIMT for LeanIMTData;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Storage Variables //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n ICiphernodeRegistry public ciphernodeRegistry; // address of the Ciphernode registry.\\n uint256 public maxDuration; // maximum duration of a computation in seconds.\\n uint256 public nexte3Id; // ID of the next E3.\\n uint256 public requests; // total number of requests made to Enclave.\\n\\n // Mapping of allowed E3 Programs.\\n mapping(IE3Program e3Program => bool allowed) public e3Programs;\\n\\n // Mapping of E3s.\\n mapping(uint256 e3Id => E3 e3) public e3s;\\n\\n // Mapping of input merkle trees.\\n mapping(uint256 e3Id => LeanIMTData imt) public inputs;\\n\\n // Mapping counting the number of inputs for each E3.\\n mapping(uint256 e3Id => uint256 inputCount) public inputCounts;\\n\\n // Mapping of enabled encryption schemes.\\n mapping(bytes32 encryptionSchemeId => IDecryptionVerifier decryptionVerifier)\\n public decryptionVerifiers;\\n\\n /// Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV).\\n mapping(bytes e3ProgramParams => bool allowed) public e3ProgramsParams;\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Errors //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n error CommitteeSelectionFailed();\\n error E3ProgramNotAllowed(IE3Program e3Program);\\n error E3AlreadyActivated(uint256 e3Id);\\n error E3Expired();\\n error E3NotActivated(uint256 e3Id);\\n error E3NotReady();\\n error E3DoesNotExist(uint256 e3Id);\\n error ModuleAlreadyEnabled(address module);\\n error ModuleNotEnabled(address module);\\n error InvalidEncryptionScheme(bytes32 encryptionSchemeId);\\n error InputDeadlinePassed(uint256 e3Id, uint256 expiration);\\n error InputDeadlineNotPassed(uint256 e3Id, uint256 expiration);\\n error InvalidComputationRequest(IInputValidator inputValidator);\\n error InvalidCiphernodeRegistry(ICiphernodeRegistry ciphernodeRegistry);\\n error InvalidDuration(uint256 duration);\\n error InvalidOutput(bytes output);\\n error InvalidInput();\\n error InvalidStartWindow();\\n error InvalidThreshold(uint32[2] threshold);\\n error CiphertextOutputAlreadyPublished(uint256 e3Id);\\n error CiphertextOutputNotPublished(uint256 e3Id);\\n error PaymentRequired(uint256 value);\\n error PlaintextOutputAlreadyPublished(uint256 e3Id);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Initialization //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @param _owner The owner of this contract\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\\n constructor(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration,\\n bytes[] memory _e3ProgramsParams\\n ) {\\n initialize(\\n _owner,\\n _ciphernodeRegistry,\\n _maxDuration,\\n _e3ProgramsParams\\n );\\n }\\n\\n /// @param _owner The owner of this contract\\n /// @param _ciphernodeRegistry The address of the ciphernode registry\\n /// @param _maxDuration The maximum duration of a computation in seconds\\n /// @param _e3ProgramsParams Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)\\n function initialize(\\n address _owner,\\n ICiphernodeRegistry _ciphernodeRegistry,\\n uint256 _maxDuration,\\n bytes[] memory _e3ProgramsParams\\n ) public initializer {\\n __Ownable_init(msg.sender);\\n setMaxDuration(_maxDuration);\\n setCiphernodeRegistry(_ciphernodeRegistry);\\n setE3ProgramsParams(_e3ProgramsParams);\\n if (_owner != owner()) transferOwnership(_owner);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3) {\\n // TODO: allow for other payment methods or only native tokens?\\n // TODO: should payment checks be somewhere else? Perhaps in the E3 Program or ciphernode registry?\\n require(msg.value > 0, PaymentRequired(msg.value));\\n require(\\n threshold[1] >= threshold[0] && threshold[0] > 0,\\n InvalidThreshold(threshold)\\n );\\n require(\\n // TODO: do we need a minimum start window to allow time for committee selection?\\n startWindow[1] >= startWindow[0] &&\\n startWindow[1] >= block.timestamp,\\n InvalidStartWindow()\\n );\\n require(\\n duration > 0 && duration <= maxDuration,\\n InvalidDuration(duration)\\n );\\n require(e3Programs[e3Program], E3ProgramNotAllowed(e3Program));\\n\\n // TODO: should IDs be incremental or produced deterministically?\\n e3Id = nexte3Id;\\n nexte3Id++;\\n uint256 seed = uint256(keccak256(abi.encode(block.prevrandao, e3Id)));\\n\\n (bytes32 encryptionSchemeId, IInputValidator inputValidator) = e3Program\\n .validate(e3Id, seed, e3ProgramParams, computeProviderParams);\\n IDecryptionVerifier decryptionVerifier = decryptionVerifiers[\\n encryptionSchemeId\\n ];\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n require(\\n address(inputValidator) != address(0),\\n InvalidComputationRequest(inputValidator)\\n );\\n\\n e3 = E3({\\n seed: seed,\\n threshold: threshold,\\n requestBlock: block.number,\\n startWindow: startWindow,\\n duration: duration,\\n expiration: 0,\\n encryptionSchemeId: encryptionSchemeId,\\n e3Program: e3Program,\\n e3ProgramParams: e3ProgramParams,\\n inputValidator: inputValidator,\\n decryptionVerifier: decryptionVerifier,\\n committeePublicKey: hex\\\"\\\",\\n ciphertextOutput: hex\\\"\\\",\\n plaintextOutput: hex\\\"\\\"\\n });\\n e3s[e3Id] = e3;\\n\\n require(\\n ciphernodeRegistry.requestCommittee(e3Id, filter, threshold),\\n CommitteeSelectionFailed()\\n );\\n\\n emit E3Requested(e3Id, e3, filter, e3Program);\\n }\\n\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n require(e3.expiration == 0, E3AlreadyActivated(e3Id));\\n require(e3.startWindow[0] <= block.timestamp, E3NotReady());\\n // TODO: handle what happens to the payment if the start window has passed.\\n require(e3.startWindow[1] >= block.timestamp, E3Expired());\\n\\n bytes32 publicKeyHash = ciphernodeRegistry.committeePublicKey(e3Id);\\n require(\\n keccak256(publicKey) == publicKeyHash,\\n CommitteeSelectionFailed()\\n );\\n uint256 expiresAt = block.timestamp + e3.duration;\\n e3s[e3Id].expiration = expiresAt;\\n e3s[e3Id].committeePublicKey = keccak256(publicKey);\\n\\n emit E3Activated(e3Id, expiresAt, publicKey);\\n\\n return true;\\n }\\n\\n function publishInput(\\n uint256 e3Id,\\n bytes memory data\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n // TODO: should we have an input window, including both a start and end timestamp?\\n require(\\n e3.expiration > block.timestamp,\\n InputDeadlinePassed(e3Id, e3.expiration)\\n );\\n\\n bytes memory input = e3.inputValidator.validate(msg.sender, data);\\n uint256 inputHash = PoseidonT3.hash(\\n [uint256(keccak256(input)), inputCounts[e3Id]]\\n );\\n\\n inputCounts[e3Id]++;\\n inputs[e3Id]._insert(inputHash);\\n success = true;\\n\\n emit InputPublished(e3Id, input, inputHash, inputCounts[e3Id] - 1);\\n }\\n\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.expiration <= block.timestamp,\\n InputDeadlineNotPassed(e3Id, e3.expiration)\\n );\\n // TODO: should the output verifier be able to change its mind?\\n //i.e. should we be able to call this multiple times?\\n require(\\n e3.ciphertextOutput == bytes32(0),\\n CiphertextOutputAlreadyPublished(e3Id)\\n );\\n bytes32 ciphertextOutputHash = keccak256(ciphertextOutput);\\n (success) = e3.e3Program.verify(e3Id, ciphertextOutputHash, proof);\\n require(success, InvalidOutput(ciphertextOutput));\\n e3s[e3Id].ciphertextOutput = ciphertextOutputHash;\\n\\n emit CiphertextOutputPublished(e3Id, ciphertextOutput);\\n }\\n\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success) {\\n E3 memory e3 = getE3(e3Id);\\n // Note: if we make 0 a no expiration, this has to be refactored\\n require(e3.expiration > 0, E3NotActivated(e3Id));\\n require(\\n e3.ciphertextOutput != bytes32(0),\\n CiphertextOutputNotPublished(e3Id)\\n );\\n require(\\n e3.plaintextOutput.length == 0,\\n PlaintextOutputAlreadyPublished(e3Id)\\n );\\n (success) = e3.decryptionVerifier.verify(\\n e3Id,\\n keccak256(plaintextOutput),\\n proof\\n );\\n require(success, InvalidOutput(plaintextOutput));\\n e3s[e3Id].plaintextOutput = plaintextOutput;\\n\\n emit PlaintextOutputPublished(e3Id, plaintextOutput);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) public onlyOwner returns (bool success) {\\n maxDuration = _maxDuration;\\n success = true;\\n emit MaxDurationSet(_maxDuration);\\n }\\n\\n function setCiphernodeRegistry(\\n ICiphernodeRegistry _ciphernodeRegistry\\n ) public onlyOwner returns (bool success) {\\n require(\\n address(_ciphernodeRegistry) != address(0) &&\\n _ciphernodeRegistry != ciphernodeRegistry,\\n InvalidCiphernodeRegistry(_ciphernodeRegistry)\\n );\\n ciphernodeRegistry = _ciphernodeRegistry;\\n success = true;\\n emit CiphernodeRegistrySet(address(_ciphernodeRegistry));\\n }\\n\\n function enableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(\\n !e3Programs[e3Program],\\n ModuleAlreadyEnabled(address(e3Program))\\n );\\n e3Programs[e3Program] = true;\\n success = true;\\n emit E3ProgramEnabled(e3Program);\\n }\\n\\n function disableE3Program(\\n IE3Program e3Program\\n ) public onlyOwner returns (bool success) {\\n require(e3Programs[e3Program], ModuleNotEnabled(address(e3Program)));\\n delete e3Programs[e3Program];\\n success = true;\\n emit E3ProgramDisabled(e3Program);\\n }\\n\\n function setDecryptionVerifier(\\n bytes32 encryptionSchemeId,\\n IDecryptionVerifier decryptionVerifier\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifier != IDecryptionVerifier(address(0)) &&\\n decryptionVerifiers[encryptionSchemeId] != decryptionVerifier,\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = decryptionVerifier;\\n success = true;\\n emit EncryptionSchemeEnabled(encryptionSchemeId);\\n }\\n\\n function disableEncryptionScheme(\\n bytes32 encryptionSchemeId\\n ) public onlyOwner returns (bool success) {\\n require(\\n decryptionVerifiers[encryptionSchemeId] !=\\n IDecryptionVerifier(address(0)),\\n InvalidEncryptionScheme(encryptionSchemeId)\\n );\\n decryptionVerifiers[encryptionSchemeId] = IDecryptionVerifier(\\n address(0)\\n );\\n success = true;\\n emit EncryptionSchemeDisabled(encryptionSchemeId);\\n }\\n\\n function setE3ProgramsParams(\\n bytes[] memory _e3ProgramsParams\\n ) public onlyOwner returns (bool success) {\\n uint256 length = _e3ProgramsParams.length;\\n for (uint256 i; i < length; ) {\\n e3ProgramsParams[_e3ProgramsParams[i]] = true;\\n unchecked {\\n ++i;\\n }\\n }\\n success = true;\\n emit AllowedE3ProgramsParamsSet(_e3ProgramsParams);\\n }\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n function getE3(uint256 e3Id) public view returns (E3 memory e3) {\\n e3 = e3s[e3Id];\\n require(e3.e3Program != IE3Program(address(0)), E3DoesNotExist(e3Id));\\n }\\n\\n function getInputRoot(uint256 e3Id) public view returns (uint256) {\\n require(\\n e3s[e3Id].e3Program != IE3Program(address(0)),\\n E3DoesNotExist(e3Id)\\n );\\n return InternalLeanIMT._root(inputs[e3Id]);\\n }\\n\\n function getDecryptionVerifier(\\n bytes32 encryptionSchemeId\\n ) public view returns (IDecryptionVerifier) {\\n return decryptionVerifiers[encryptionSchemeId];\\n }\\n}\\n\",\"keccak256\":\"0x1292264979903b363daa16b2585aa48e1dbfcccf24c103340def18a41986e724\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/ICiphernodeRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface ICiphernodeRegistry {\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param filter Address of the contract that will coordinate committee selection.\\n /// @param threshold The M/N threshold for the committee.\\n event CommitteeRequested(\\n uint256 indexed e3Id,\\n address filter,\\n uint32[2] threshold\\n );\\n\\n /// @notice This event MUST be emitted when a committee is selected for an E3.\\n /// @param e3Id ID of the E3 for which the committee was selected.\\n /// @param publicKey Public key of the committee.\\n event CommitteePublished(uint256 indexed e3Id, bytes publicKey);\\n\\n /// @notice This event MUST be emitted when `enclave` is set.\\n /// @param enclave Address of the enclave contract.\\n event EnclaveSet(address indexed enclave);\\n\\n /// @notice This event MUST be emitted when a ciphernode is added to the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeAdded(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n /// @notice This event MUST be emitted when a ciphernode is removed from the registry.\\n /// @param node Address of the ciphernode.\\n /// @param index Index of the ciphernode in the registry.\\n /// @param numNodes Number of ciphernodes in the registry.\\n /// @param size Size of the registry.\\n event CiphernodeRemoved(\\n address indexed node,\\n uint256 index,\\n uint256 numNodes,\\n uint256 size\\n );\\n\\n function isCiphernodeEligible(address ciphernode) external returns (bool);\\n\\n /// @notice Initiates the committee selection process for a specified E3.\\n /// @dev This function MUST revert when not called by the Enclave contract.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param filter The address of the filter responsible for the committee selection process.\\n /// @param threshold The M/N threshold for the committee.\\n /// @return success True if committee selection was successfully initiated.\\n function requestCommittee(\\n uint256 e3Id,\\n address filter,\\n uint32[2] calldata threshold\\n ) external returns (bool success);\\n\\n /// @notice Publishes the public key resulting from the committee selection process.\\n /// @dev This function MUST revert if not called by the previously selected filter.\\n /// @param e3Id ID of the E3 for which to select the committee.\\n /// @param publicKey The hash of the public key generated by the given committee.\\n function publishCommittee(\\n uint256 e3Id,\\n bytes calldata proof,\\n bytes calldata publicKey\\n ) external;\\n\\n /// @notice This function should be called by the Enclave contract to get the public key of a committee.\\n /// @dev This function MUST revert if no committee has been requested for the given E3.\\n /// @dev This function MUST revert if the committee has not yet published a public key.\\n /// @param e3Id ID of the E3 for which to get the committee public key.\\n /// @return publicKeyHash The hash of the public key of the given committee.\\n function committeePublicKey(\\n uint256 e3Id\\n ) external view returns (bytes32 publicKeyHash);\\n}\\n\",\"keccak256\":\"0xe24e6322e8c6fc83461edfbdbedb409e243f1c4e79021a74585cfe875c225aa2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IDecryptionVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IDecryptionVerifier {\\n /// @notice This function should be called by the Enclave contract to verify the\\n /// decryption of output of a computation.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutputHash The keccak256 hash of the plaintext output to be verified.\\n /// @param proof ABI encoded proof of the given output hash.\\n /// @return success Whether or not the plaintextOutputHash was successfully verified.\\n function verify(\\n uint256 e3Id,\\n bytes32 plaintextOutputHash,\\n bytes memory proof\\n ) external view returns (bool success);\\n}\\n\",\"keccak256\":\"0xb92991a581d3c18cdc273497687ec1c6e3016674314f21fe56917aece5d10863\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\nimport { IE3Program } from \\\"./IE3Program.sol\\\";\\nimport { IDecryptionVerifier } from \\\"./IDecryptionVerifier.sol\\\";\\n\\n/// @title E3 struct\\n/// @notice This struct represents an E3 computation.\\n/// @param threshold M/N threshold for the committee.\\n/// @param requestBlock Block number when the E3 was requested.\\n/// @param startWindow Start window for the computation: index zero is minimum, index 1 is the maxium.\\n/// @param duration Duration of the E3.\\n/// @param expiration Timestamp when committee duties expire.\\n/// @param e3Program Address of the E3 Program contract.\\n/// @param e3ProgramParams ABI encoded computation parameters.\\n/// @param computeProvider Address of the compute provider contract.\\n/// @param inputValidator Address of the input validator contract.\\n/// @param decryptionVerifier Address of the output verifier contract.\\n/// @param committeeId ID of the selected committee.\\n/// @param ciphertextOutput Encrypted output data.\\n/// @param plaintextOutput Decrypted output data.\\nstruct E3 {\\n uint256 seed;\\n uint32[2] threshold;\\n uint256 requestBlock;\\n uint256[2] startWindow;\\n uint256 duration;\\n uint256 expiration;\\n bytes32 encryptionSchemeId;\\n IE3Program e3Program;\\n bytes e3ProgramParams;\\n IInputValidator inputValidator;\\n IDecryptionVerifier decryptionVerifier;\\n bytes32 committeePublicKey;\\n bytes32 ciphertextOutput;\\n bytes plaintextOutput;\\n}\\n\",\"keccak256\":\"0x9c18920667ddc73d14c6c8cbccf283c89b1a29b0c79d5262ffe7c93787b2397d\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IE3Program.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { IInputValidator } from \\\"./IInputValidator.sol\\\";\\n\\ninterface IE3Program {\\n /// @notice This function should be called by the Enclave contract to validate the computation parameters.\\n /// @param e3Id ID of the E3.\\n /// @param seed Seed for the computation.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return encryptionSchemeId ID of the encryption scheme to be used for the computation.\\n /// @return inputValidator The input validator to be used for the computation.\\n function validate(\\n uint256 e3Id,\\n uint256 seed,\\n bytes calldata e3ProgramParams,\\n bytes calldata computeProviderParams\\n )\\n external\\n returns (bytes32 encryptionSchemeId, IInputValidator inputValidator);\\n\\n /// @notice This function should be called by the Enclave contract to verify the decrypted output of an E3.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutputHash The keccak256 hash of output data to be verified.\\n /// @param proof ABI encoded data to verify the ciphertextOutputHash.\\n /// @return success Whether the output data is valid.\\n function verify(\\n uint256 e3Id,\\n bytes32 ciphertextOutputHash,\\n bytes memory proof\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xd60e92b5b6498daf0b7f1238d354156c67d25c03caaaabbc601368e9e4a295b2\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IEnclave.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\nimport { E3, IE3Program } from \\\"./IE3.sol\\\";\\n\\ninterface IEnclave {\\n ////////////////////////////////////////////////////////////\\n // //\\n // Events //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested.\\n /// @param e3Id ID of the E3.\\n /// @param e3 Details of the E3.\\n /// @param filter Address of the pool of nodes from which the Cipher Node committee was selected.\\n /// @param e3Program Address of the Computation module selected.\\n event E3Requested(\\n uint256 e3Id,\\n E3 e3,\\n address filter,\\n IE3Program indexed e3Program\\n );\\n\\n /// @notice This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated.\\n /// @param e3Id ID of the E3.\\n /// @param expiration Timestamp when committee duties expire.\\n /// @param committeePublicKey Public key of the committee.\\n event E3Activated(\\n uint256 e3Id,\\n uint256 expiration,\\n bytes committeePublicKey\\n );\\n\\n /// @notice This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is\\n /// successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data.\\n event InputPublished(\\n uint256 indexed e3Id,\\n bytes data,\\n uint256 inputHash,\\n uint256 index\\n );\\n\\n /// @notice This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput);\\n\\n /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3)\\n /// is successfully published.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded ciphertext output.\\n event CiphertextOutputPublished(\\n uint256 indexed e3Id,\\n bytes ciphertextOutput\\n );\\n\\n /// @notice This event MUST be emitted any time the `maxDuration` is set.\\n /// @param maxDuration The maximum duration of a computation in seconds.\\n event MaxDurationSet(uint256 maxDuration);\\n\\n /// @notice This event MUST be emitted any time the CiphernodeRegistry is set.\\n /// @param ciphernodeRegistry The address of the CiphernodeRegistry contract.\\n event CiphernodeRegistrySet(address ciphernodeRegistry);\\n\\n /// @notice The event MUST be emitted any time an encryption scheme is enabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was enabled.\\n event EncryptionSchemeEnabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time an encryption scheme is disabled.\\n /// @param encryptionSchemeId The ID of the encryption scheme that was disabled.\\n event EncryptionSchemeDisabled(bytes32 encryptionSchemeId);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is enabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramEnabled(IE3Program e3Program);\\n\\n /// @notice This event MUST be emitted any time a E3 Program is disabled.\\n /// @param e3Program The address of the E3 Program.\\n event E3ProgramDisabled(IE3Program e3Program);\\n\\n /// @notice Emitted when the allowed E3 encryption scheme parameters are configured.\\n /// @param e3ProgramParams Array of encoded encryption scheme parameters (e.g, for BFV)\\n event AllowedE3ProgramsParamsSet(bytes[] e3ProgramParams);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Core Entrypoints //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to request a computation within an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the E3Requested event.\\n /// @param filter IDs of the pool of nodes from which to select the committee.\\n /// @param threshold The M/N threshold for the committee.\\n /// @param duration The duration of the computation in seconds.\\n /// @param e3Program Address of the E3 Program.\\n /// @param e3ProgramParams ABI encoded computation parameters.\\n /// @param computeProviderParams ABI encoded compute provider parameters.\\n /// @return e3Id ID of the E3.\\n /// @return e3 The E3 struct.\\n function request(\\n address filter,\\n uint32[2] calldata threshold,\\n uint256[2] calldata startWindow,\\n uint256 duration,\\n IE3Program e3Program,\\n bytes memory e3ProgramParams,\\n bytes memory computeProviderParams\\n ) external payable returns (uint256 e3Id, E3 memory e3);\\n\\n /// @notice This function should be called to activate an Encrypted Execution Environment (E3) once it has been\\n /// initialized and is ready for input.\\n /// @dev This function MUST emit the E3Activated event.\\n /// @dev This function MUST revert if the given E3 has not yet been requested.\\n /// @dev This function MUST revert if the selected node committee has not yet published a public key.\\n /// @param e3Id ID of the E3.\\n /// @param publicKey Public key of the committee.\\n /// @return success True if the E3 was successfully activated.\\n function activate(\\n uint256 e3Id,\\n bytes memory publicKey\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish input data for Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 is not yet activated.\\n /// @dev This function MUST emit the InputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param data ABI encoded input data to publish.\\n /// @return success True if the input was successfully published.\\n function publishInput(\\n uint256 e3Id,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n /// @notice This function should be called to publish output data for an Encrypted Execution Environment (E3).\\n /// @dev This function MUST emit the CiphertextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param ciphertextOutput ABI encoded output data to verify.\\n /// @param proof ABI encoded data to verify the ciphertextOutput.\\n /// @return success True if the output was successfully published.\\n function publishCiphertextOutput(\\n uint256 e3Id,\\n bytes memory ciphertextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n /// @notice This function publishes the plaintext output of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the output has not been published.\\n /// @dev This function MUST emit the PlaintextOutputPublished event.\\n /// @param e3Id ID of the E3.\\n /// @param plaintextOutput ABI encoded plaintext output.\\n /// @param proof ABI encoded data to verify the plaintextOutput.\\n function publishPlaintextOutput(\\n uint256 e3Id,\\n bytes memory plaintextOutput,\\n bytes memory proof\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Set Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to set the maximum duration of requested computations.\\n /// @param _maxDuration The maximum duration of a computation in seconds.\\n /// @return success True if the max duration was successfully set.\\n function setMaxDuration(\\n uint256 _maxDuration\\n ) external returns (bool success);\\n\\n ////////////////////////////////////////////////////////////\\n // //\\n // Get Functions //\\n // //\\n ////////////////////////////////////////////////////////////\\n\\n /// @notice This function should be called to retrieve the details of an Encrypted Execution Environment (E3).\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return e3 The struct representing the requested E3.\\n function getE3(uint256 e3Id) external view returns (E3 memory e3);\\n\\n /// @notice This function returns root of the input merkle tree for a given E3.\\n /// @dev This function MUST revert if the E3 does not exist.\\n /// @param e3Id ID of the E3.\\n /// @return root The root of the input merkle tree.\\n function getInputRoot(uint256 e3Id) external view returns (uint256 root);\\n}\\n\",\"keccak256\":\"0x0c0e1ceded42a214489cdbb6d3cdeb7a7589f69750bd7fbd32f754d12d921f4b\",\"license\":\"LGPL-3.0-only\"},\"contracts/interfaces/IInputValidator.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.8.27;\\n\\ninterface IInputValidator {\\n /// @notice This function should be called by the Enclave contract to validate the\\n /// input of a computation.\\n /// @param sender The account that is submitting the input.\\n /// @param data The input to be verified.\\n /// @return input The decoded, policy-approved application payload.\\n function validate(\\n address sender,\\n bytes memory data\\n ) external returns (bytes memory input);\\n}\\n\",\"keccak256\":\"0x20d4016bd59c317c5571cfe6c3e8f46cbabddc0b926dc64019eeae8d29788653\",\"license\":\"LGPL-3.0-only\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523461047d57612ccb8038038061001981610498565b928339810160808282031261047d578151906001600160a01b0382169081830361047d5760208401516001600160a01b0381169081900361047d576040850151606086015190956001600160401b03821161047d57019082601f8301121561047d578151926001600160401b038411610482578360051b92602061009e818601610498565b809681520191602083958301019181831161047d5760208101935b838510610409575050600080516020612cab83398151915254604081901c60ff16159993509150506001600160401b03811680159081610401575b60011490816103f7575b1590816103ee575b506103dd576001600160401b03198116600117600080516020612cab833981519152557fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355291602091896103b2575b5061015d610556565b610165610556565b61016e336104e0565b610176610584565b80600155604051908152a1610189610584565b8015158061039d575b1561038957600080546001600160a01b031916821790556040519081527f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690602090a16101dd610584565b815160005b81811061032c5750506040519160208301906020845251809152604083019060408160051b85010192916000905b8282106102e9575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600080516020612c8b833981519152546001600160a01b0316036102d2575b50610276575b6040516126d090816105bb8239f35b68ff000000000000000019600080516020612cab8339815191525416600080516020612cab833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1610267565b6102e3906102de610584565b6104e0565b38610261565b9091929360208080600193603f198a82030186528851610314815180928185528580860191016104bd565b601f01601f1916010196019493919091019101610210565b8351811015610373578061035960208060019460051b8801015181604051938285809451938492016104bd565b810160098152030190208260ff19825416179055016101e2565b634e487b7160e01b600052603260045260246000fd5b6375ac4eb760e11b60005260045260246000fd5b506000546001600160a01b0316811415610192565b6001600160481b0319166801000000000000000117600080516020612cab8339815191525538610154565b63f92ee8a960e01b60005260046000fd5b90501538610106565b303b1591506100fe565b8991506100f4565b84516001600160401b03811161047d5782019083603f8301121561047d576020820151906001600160401b0382116104825761044e601f8301601f1916602001610498565b828152604084840101861061047d57610472602094938594604086850191016104bd565b8152019401936100b9565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761048257604052565b60005b8381106104d05750506000910152565b81810151838201526020016104c0565b6001600160a01b0316801561054057600080516020612c8b83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff600080516020612cab8339815191525460401c161561057357565b631afcd79f60e31b60005260046000fd5b600080516020612c8b833981519152546001600160a01b031633036105a557565b63118cdaa760e01b6000523360045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611c1d5780630ef81b2f14611be857806310bc628114611be85780634017daf014611afb578063406ed35c14611ac8578063459d929414611a665780634e92ec63146119d85780634fc7726414611938578063503f3288146116e65780635314e9fa1461155e5780636db5c8fd14611540578063715018a6146114a75780637edcd7ab1461124e5780638da5cb5b146112085780638dcdd86b146111e157806393b58f86146109ec5780639c8570c814610879578063b3c88d671461084d578063b68fd1be14610812578063b74cb2db146107f4578063c4ccafa2146107b5578063cb64961714610797578063cbd16872146106de578063cf0f34c4146106c0578063d016b08d1461028f578063ddef9ea11461025a578063f2fde38b1461022f578063fad8e111146102025763fd2f3d011461015b57600080fd5b346101fd5760203660031901126101fd576001600160a01b0361017c611f87565b61018461263b565b1680600052600460205260ff604060002054166101e9576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101fd5760203660031901126101fd576020610225610220611f87565b6125b0565b6040519015158152f35b346101fd5760203660031901126101fd5761025861024b611f87565b61025361263b565b61250a565b005b346101fd5760203660031901126101fd5760043560005260066020526040806000206001815491015482519182526020820152f35b346101fd5761029d36612027565b6102a682612151565b60a081016102b784825115156122a1565b51428111156106a857506103026000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611dde565b03925af180156105a757600090610623575b6103709150733333333C0A88F9BE4fd23ed0536F9B6c427e3B93602060405161033c81611cd9565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b8352600483016124dc565b0381845af49283156105a7576000936105ef575b50836000526007602052604060002061039d8154612394565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103e5576361c0541760e11b60005260046000fd5b836103fb576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105de57805491600182019283549360ff85116104e857600182018083116104e8576001861b106105ce575b84905585916000905b8582106104fe5750509061045760039392612394565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104e8577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104cf92604051938493606085526060850190611dde565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c16146000146105b3576020610552916040519061052282611cd9565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b8352600483016124dc565b0381855af480156105a757600090610572575b60019150935b0190610441565b6020823d821161059f575b8161058a60209383611cf5565b8101031261059c575060019051610565565b80fd5b3d915061057d565b6040513d6000823e3d90fd5b9280600191600052600286016020528460406000205561056b565b936105d890612394565b93610438565b6312c50cad60e11b60005260046000fd5b90926020823d60201161061b575b8161060a60209383611cf5565b8101031261059c5750519184610384565b3d91506105fd565b3d8082843e6106328184611cf5565b8201916020818403126106a05780519067ffffffffffffffff82116106a4570182601f820112156106a05780519161066983611f24565b936106776040519586611cf5565b8385526020848401011161059c5750829161069b9160208061037096019101611dbb565b610314565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101fd5760203660031901126101fd5760206102256004356124a0565b346101fd5760403660031901126101fd576004356024356001600160a01b0381168091036101fd577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161073361263b565b8015158281610775575b61074691612285565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b031682141590508261073d565b346101fd5760003660031901126101fd576020600254604051908152f35b346101fd5760203660031901126101fd576001600160a01b036107d6611f87565b166000526004602052602060ff604060002054166040519015158152f35b346101fd5760003660031901126101fd576020600354604051908152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd576102256108486020923690600401611f9d565b6123a3565b346101fd5760203660031901126101fd5760043560005260076020526020604060002054604051908152f35b346101fd5761088736612057565b9161089181612151565b9160a083016108a383825115156122a1565b514281116109d457506101808301516109bf5760206108f16000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a600485016122d5565b03925af19283156105a757602094600094610968575b508161095b916109387f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07194876122f1565b8460005260058752600d6040600020015560405191829187835287830190611dde565b0390a26040519015158152f35b61095b919450916109af7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d89116109b8575b6109a78183611cf5565b8101906122bd565b94915091610907565b503d61099d565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101fd57610a01611f87565b366064116101fd573660a4116101fd5760a43560c435916001600160a01b03831683036101fd5760e43567ffffffffffffffff81116101fd57610a48903690600401611f40565b906101043567ffffffffffffffff81116101fd57610a6a903690600401611f40565b90610a736120c2565b5034156111cc5760443563ffffffff8116908181036101fd575063ffffffff610a9a612339565b161115806111b6575b1561119857608435606435811015908161118d575b501561117c5783151580611170575b1561115b576001600160a01b038516600052600460205260ff604060002054161561113d57610b659060025493610afd85612394565b6002556040805160208101904482528783820152828152610b1f606082611cf5565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b536084840187611dde565b83810360031901606485015290611dde565b038160006001600160a01b038c165af19081156105a75760009384926110ec575b506000848152600860205260409020546001600160a01b0390811692610bae86851515612285565b169081156110d75760405195610bc387611cbc565b8652604094855198610bd5878b611cf5565b6000996024815b606482106110bf575050602089015243878901528651610bfc8882611cf5565b6064815b60a482106110af575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c5d8782611cf5565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110875750505060018201558385015160028201556060850151825b600281106110725750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610fb357610d166009840154611c82565b601f8111611041575b508890601f8311600114610fd257600e939291859183610fc7575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610fb3578190610de58454611c82565b601f8111610f7a575b508990601f8311600114610f17578592610f0c575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e546044840161235d565b5af1908115610f02578291610ee5575b5015610ed657507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610ed2959697845191829189835260608b840152610eb56060840189611e03565b958784015216930390a28080519586958652850152830190611e03565b0390f35b630d8dbe2560e01b8152600490fd5b610efc9150873d89116109b8576109a78183611cf5565b88610e64565b84513d84823e3d90fd5b015190508a80610e03565b8486528a86209250601f198416865b8c828210610f64575050908460019594939210610f4b575b505050811b019055610e18565b015160001960f88460031b161c191690558a8080610f3e565b6001859682939686015181550195019301610f26565b610fa3908587528b8720601f850160051c8101918d8610610fa9575b601f0160051c0190612322565b8b610dee565b9091508190610f96565b634e487b7160e01b84526041600452602484fd5b015190508b80610d3a565b9060098401855289852091855b8b601f198616821061102b575050918391600193600e9695601f19811610611012575b505050811b016009820155610d52565b015160001960f88460031b161c191690558b8080611002565b6001849582939585015181550194019201610fdf565b61106c906009850186528a8620601f850160051c8101918c8610610fa957601f0160051c0190612322565b8a610d1f565b81518382016003015590880190600101610c9e565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c7d565b8135815260209182019101610c00565b602080916110cc8461234c565b815201910190610bdc565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d604011611135575b8161110860409383611cf5565b810103126111315760208151910151936001600160a01b038516850361059c5750929088610b86565b8380fd5b3d91506110fb565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610ac7565b6308594fb760e01b60005260046000fd5b905042111586610ab8565b604051633744092160e21b81526044906111b46004820161235d565bfd5b5063ffffffff6111c4612339565b161515610aa3565b638c4fcd9360e01b6000523460045260246000fd5b346101fd5760003660031901126101fd5760206001600160a01b0360005416604051908152f35b346101fd5760003660031901126101fd5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101fd5761125c36612057565b611267839293612151565b6112778360a083015115156122a1565b61018081015115611492576101a08101515161147d576112c692916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b845288600485016122d5565b03915afa9182156105a75760009261145c575b506112e483836122f1565b806000526005602052600e6040600020019280519367ffffffffffffffff8511611446576020946113158254611c82565b601f8111611416575b5085601f821160011461138d5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261095b94600091611382575b508160011b916000199060031b1c19161790555b60405191829187835287830190611dde565b90508301518961135c565b601f1982169083600052806000209160005b8181106113ff57509261095b9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1699896106113e6575b5050811b019055611370565b85015160001960f88460031b161c1916905589806113da565b91928960018192868a01518155019401920161139f565b611440908360005287600020601f840160051c810191898510610fa957601f0160051c0190612322565b8661131e565b634e487b7160e01b600052604160045260246000fd5b61147691925060203d6020116109b8576109a78183611cf5565b90836112d9565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101fd5760003660031901126101fd576114c061263b565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101fd5760003660031901126101fd576020600154604051908152f35b346101fd5761156c36612027565b9061157681612151565b9060a08201516116d2576060820180515142106116c15760204291510151106116b05760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105a75760009361167c575b50835192602085019384200361166b57608001514201918242116104e8577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361165d918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611dde565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d6020116116a8575b8161169860209383611cf5565b810103126101fd575191846115d2565b3d915061168b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101fd5760803660031901126101fd576116ff611f87565b602435906001600160a01b03821682036101fd5760643567ffffffffffffffff81116101fd57611733903690600401611f9d565b917ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549260ff8460401c16159367ffffffffffffffff811680159081611930575b6001149081611926575b15908161191d575b5061190c5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556117fb926117f591866118cd575b506117d3612683565b6117db612683565b6117e43361250a565b6117ef6044356124a0565b506125b0565b506123a3565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036118bb575b5061183e57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6118c79061025361263b565b81611837565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055866117ca565b63f92ee8a960e01b60005260046000fd5b90501586611786565b303b15915061177e565b869150611774565b346101fd5760203660031901126101fd576001600160a01b03611959611f87565b61196161263b565b1680600052600460205260ff60406000205416156119c4576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101fd5760203660031901126101fd577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc6020600435611a1761263b565b8060005260088252611a39816001600160a01b03604060002054161515612285565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd5760ff611ab26020611a9f81943690600401611f40565b8160405193828580945193849201611dbb565b8101600981520301902054166040519015158152f35b346101fd5760203660031901126101fd57610ed2611ae7600435612151565b604051918291602083526020830190611e03565b346101fd5760203660031901126101fd57600435600052600560205260206040600020610ed28154916002810154600582015491600681015492600782015493611bc26001600160a01b03600885015416611b5860098601611d17565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611b8e600e600d8b01549a01611d17565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611dde565b9460e0880152610100870152610120860152610140850152838203610160850152611dde565b346101fd5760203660031901126101fd57600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101fd5760203660031901126101fd57600435806000526005602052611c57816001600160a01b036008604060002001541615156120a6565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b90600182811c92168015611cb2575b6020831014611c9c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611c91565b6101c0810190811067ffffffffffffffff82111761144657604052565b6040810190811067ffffffffffffffff82111761144657604052565b90601f8019910116810190811067ffffffffffffffff82111761144657604052565b9060405191826000825492611d2b84611c82565b8084529360018116908115611d995750600114611d52575b50611d5092500383611cf5565b565b90506000929192526020600020906000915b818310611d7d575050906020611d509282010138611d43565b6020919350806001915483858901015201910190918492611d64565b905060209250611d5094915060ff191682840152151560051b82010138611d43565b60005b838110611dce5750506000910152565b8181015183820152602001611dbe565b90602091611df781518092818552858086019101611dbb565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611f085750505060408101516060840152606081015192608081016000905b60028210611ef2575050611eef929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611e9d610100840151610200610140850152610200840190611dde565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611dde565b90565b6020806001928851815201960191019094611e3a565b60208060019263ffffffff865116815201930191019091611e17565b67ffffffffffffffff811161144657601f01601f191660200190565b81601f820112156101fd57803590611f5782611f24565b92611f656040519485611cf5565b828452602083830101116101fd57816000926020809301838601378301015290565b600435906001600160a01b03821682036101fd57565b9080601f830112156101fd5781359167ffffffffffffffff8311611446578260051b9060405193611fd16020840186611cf5565b8452602080850192820101918383116101fd5760208201905b838210611ff957505050505090565b813567ffffffffffffffff81116101fd5760209161201c87848094880101611f40565b815201910190611fea565b9060406003198301126101fd57600435916024359067ffffffffffffffff82116101fd57611eef91600401611f40565b60606003198201126101fd576004359160243567ffffffffffffffff81116101fd578261208691600401611f40565b916044359067ffffffffffffffff82116101fd57611eef91600401611f40565b156120ae5750565b63cd6f4a4f60e01b60005260045260246000fd5b604051906120cf82611cbc565b60606101a08360008152604080516120e78282611cf5565b8136823760208301526000818301528051906121038183611cf5565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b9061215a6120c2565b5081600052600560205260406000209160405161217681611cbc565b8354815260405163ffffffff6001860154818116835260201c1660208201526121a0604082611cf5565b6020820152600284015460408201526040518060038601906000905b6002821061226f57505050611d509291816121e060406001600160a01b0394611cf5565b606082015260058601546080820152600686015460a0820152600786015460c082015261225f600e836008890154169760e0840198895261222360098201611d17565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611d17565b6101a082015294511615156120a6565b60016020819285548152019301910190916121bc565b1561228d5750565b6381c4951960e01b60005260045260246000fd5b156122a95750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101fd575180151581036101fd5790565b611eef9392606092825260208201528160408201520190611dde565b156122f95750565b604051632f9f8ab960e01b81526020600482015290819061231e906024830190611dde565b0390fd5b81811061232d575050565b60008155600101612322565b60243563ffffffff811681036101fd5790565b359063ffffffff821682036101fd57565b6024906000905b6002821061237157505050565b60208060019263ffffffff6123858761234c565b16815201930191019091612364565b60001981146104e85760010190565b6123ab61263b565b805160005b81811061244357505060405190602082016020835281518091526040830190602060408260051b8601019301916000905b828210612418575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600190565b90919293602080612435600193603f198a82030186528851611dde565b9601920192019092916123e1565b825181101561248a578061247060208060019460051b870101518160405193828580945193849201611dbb565b810160098152030190208260ff19825416179055016123b0565b634e487b7160e01b600052603260045260246000fd5b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916124cc61263b565b80600155604051908152a1600190565b919060408301926000905b600282106124f457505050565b60208060019285518152019301910190916124e7565b6001600160a01b0316801561259a576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b03906125c161263b565b1680151580612626575b15612612576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b03600054168114156125cb565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361266e57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156126b257565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630e092fc314611c1d5780630ef81b2f14611be857806310bc628114611be85780634017daf014611afb578063406ed35c14611ac8578063459d929414611a665780634e92ec63146119d85780634fc7726414611938578063503f3288146116e65780635314e9fa1461155e5780636db5c8fd14611540578063715018a6146114a75780637edcd7ab1461124e5780638da5cb5b146112085780638dcdd86b146111e157806393b58f86146109ec5780639c8570c814610879578063b3c88d671461084d578063b68fd1be14610812578063b74cb2db146107f4578063c4ccafa2146107b5578063cb64961714610797578063cbd16872146106de578063cf0f34c4146106c0578063d016b08d1461028f578063ddef9ea11461025a578063f2fde38b1461022f578063fad8e111146102025763fd2f3d011461015b57600080fd5b346101fd5760203660031901126101fd576001600160a01b0361017c611f87565b61018461263b565b1680600052600460205260ff604060002054166101e9576020817fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46792600052600482526040600020600160ff19825416179055604051908152a1602060405160018152f35b63b29d459560e01b60005260045260246000fd5b600080fd5b346101fd5760203660031901126101fd576020610225610220611f87565b6125b0565b6040519015158152f35b346101fd5760203660031901126101fd5761025861024b611f87565b61025361263b565b61250a565b005b346101fd5760203660031901126101fd5760043560005260066020526040806000206001815491015482519182526020820152f35b346101fd5761029d36612027565b6102a682612151565b60a081016102b784825115156122a1565b51428111156106a857506103026000926001600160a01b0361012085940151169060405194858094819363caf9278560e01b8352336004840152604060248401526044830190611dde565b03925af180156105a757600090610623575b610370915073__$75f79a42d9bcbdbb69ad79ebd80f556f39$__602060405161033c81611cd9565b835182850120815285600052600782526040600020548282015260405180958192632b0aac7f60e11b8352600483016124dc565b0381845af49283156105a7576000936105ef575b50836000526007602052604060002061039d8154612394565b905560008481526006602052604090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184106103e5576361c0541760e11b60005260046000fd5b836103fb576314b48df160e11b60005260046000fd5b83600052600381016020526040600020546105de57805491600182019283549360ff85116104e857600182018083116104e8576001861b106105ce575b84905585916000905b8582106104fe5750509061045760039392612394565b938483556000526002820160205260406000205584600052016020526040600020558260005260076020526040600020549060001982019182116104e8577f7555a0b1b87fe36304326aed23f5c78102b63922b1141f8df7d4593eff2021dd926104cf92604051938493606085526060850190611dde565b91602084015260408301520390a2602060405160018152f35b634e487b7160e01b600052601160045260246000fd5b909260018084861c16146000146105b3576020610552916040519061052282611cd9565b8660005260028801835260406000205482528282015260405180938192632b0aac7f60e11b8352600483016124dc565b0381855af480156105a757600090610572575b60019150935b0190610441565b6020823d821161059f575b8161058a60209383611cf5565b8101031261059c575060019051610565565b80fd5b3d915061057d565b6040513d6000823e3d90fd5b9280600191600052600286016020528460406000205561056b565b936105d890612394565b93610438565b6312c50cad60e11b60005260046000fd5b90926020823d60201161061b575b8161060a60209383611cf5565b8101031261059c5750519184610384565b3d91506105fd565b3d8082843e6106328184611cf5565b8201916020818403126106a05780519067ffffffffffffffff82116106a4570182601f820112156106a05780519161066983611f24565b936106776040519586611cf5565b8385526020848401011161059c5750829161069b9160208061037096019101611dbb565b610314565b5080fd5b8280fd5b8363142c294360e31b60005260045260245260446000fd5b346101fd5760203660031901126101fd5760206102256004356124a0565b346101fd5760403660031901126101fd576004356024356001600160a01b0381168091036101fd577ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb699160209161073361263b565b8015158281610775575b61074691612285565b81600052600883526040600020906001600160a01b0319825416179055604051908152a1602060405160018152f35b60009081526008855260409020546001600160a01b031682141590508261073d565b346101fd5760003660031901126101fd576020600254604051908152f35b346101fd5760203660031901126101fd576001600160a01b036107d6611f87565b166000526004602052602060ff604060002054166040519015158152f35b346101fd5760003660031901126101fd576020600354604051908152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd576102256108486020923690600401611f9d565b6123a3565b346101fd5760203660031901126101fd5760043560005260076020526020604060002054604051908152f35b346101fd5761088736612057565b9161089181612151565b9160a083016108a383825115156122a1565b514281116109d457506101808301516109bf5760206108f16000956001600160a01b0360e08551858701209701511690604051978880948193632f0e1bbf60e01b83528a8a600485016122d5565b03925af19283156105a757602094600094610968575b508161095b916109387f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07194876122f1565b8460005260058752600d6040600020015560405191829187835287830190611dde565b0390a26040519015158152f35b61095b919450916109af7f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade07193873d89116109b8575b6109a78183611cf5565b8101906122bd565b94915091610907565b503d61099d565b50637eb9cea960e11b60005260045260246000fd5b826370c05fb960e11b60005260045260245260446000fd5b6101203660031901126101fd57610a01611f87565b366064116101fd573660a4116101fd5760a43560c435916001600160a01b03831683036101fd5760e43567ffffffffffffffff81116101fd57610a48903690600401611f40565b906101043567ffffffffffffffff81116101fd57610a6a903690600401611f40565b90610a736120c2565b5034156111cc5760443563ffffffff8116908181036101fd575063ffffffff610a9a612339565b161115806111b6575b1561119857608435606435811015908161118d575b501561117c5783151580611170575b1561115b576001600160a01b038516600052600460205260ff604060002054161561113d57610b659060025493610afd85612394565b6002556040805160208101904482528783820152828152610b1f606082611cf5565b5190209481518095819263530ebf1f60e11b835289600484015288602484015260806044840152610b536084840187611dde565b83810360031901606485015290611dde565b038160006001600160a01b038c165af19081156105a75760009384926110ec575b506000848152600860205260409020546001600160a01b0390811692610bae86851515612285565b169081156110d75760405195610bc387611cbc565b8652604094855198610bd5878b611cf5565b6000996024815b606482106110bf575050602089015243878901528651610bfc8882611cf5565b6064815b60a482106110af575050606089015260808801528860a088015260c08701526001600160a01b03891660e087015261010086015261012085015261014084015284610160840152846101808401526020948251610c5d8782611cf5565b8181526101a0850152848152600586528281208451815560208501518290835b89600282106110875750505060018201558385015160028201556060850151825b600281106110725750506080850151600582015560a0850151600682015560c085015160078201556001600160a01b0360e0860151166001600160a01b036008830191166001600160a01b031982541617905561010085015180519067ffffffffffffffff8211610fb357610d166009840154611c82565b601f8111611041575b508890601f8311600114610fd257600e939291859183610fc7575b50508160011b916000199060031b1c19161760098201555b6001600160a01b03610120870151166001600160a01b03600a830191166001600160a01b03198254161790556001600160a01b03610140870151166001600160a01b03600b830191166001600160a01b0319825416179055610160860151600c820155610180860151600d820155016101a085015180519067ffffffffffffffff8211610fb3578190610de58454611c82565b601f8111610f7a575b508990601f8311600114610f17578592610f0c575b50508160011b916000199060031b1c19161790555b80866001600160a01b036084818454169587519485938492639ccb58d560e01b84528c60048501521697886024840152610e546044840161235d565b5af1908115610f02578291610ee5575b5015610ed657507fe31ba2ed37bce9c2bca28aabe3990572a1694b7a208f61e5cced4471fa33c8e56001600160a01b03610ed2959697845191829189835260608b840152610eb56060840189611e03565b958784015216930390a28080519586958652850152830190611e03565b0390f35b630d8dbe2560e01b8152600490fd5b610efc9150873d89116109b8576109a78183611cf5565b88610e64565b84513d84823e3d90fd5b015190508a80610e03565b8486528a86209250601f198416865b8c828210610f64575050908460019594939210610f4b575b505050811b019055610e18565b015160001960f88460031b161c191690558a8080610f3e565b6001859682939686015181550195019301610f26565b610fa3908587528b8720601f850160051c8101918d8610610fa9575b601f0160051c0190612322565b8b610dee565b9091508190610f96565b634e487b7160e01b84526041600452602484fd5b015190508b80610d3a565b9060098401855289852091855b8b601f198616821061102b575050918391600193600e9695601f19811610611012575b505050811b016009820155610d52565b015160001960f88460031b161c191690558b8080611002565b6001849582939585015181550194019201610fdf565b61106c906009850186528a8620601f850160051c8101918c8610610fa957601f0160051c0190612322565b8a610d1f565b81518382016003015590880190600101610c9e565b829363ffffffff6001939451169063ffffffff8560051b92831b921b19161793019101610c7d565b8135815260209182019101610c00565b602080916110cc8461234c565b815201910190610bdc565b50633ca1cee360e11b60005260045260246000fd5b9091506040813d604011611135575b8161110860409383611cf5565b810103126111315760208151910151936001600160a01b038516850361059c5750929088610b86565b8380fd5b3d91506110fb565b6001600160a01b038563295a6a6f60e11b6000521660045260246000fd5b836313b783af60e21b60005260045260246000fd5b50600154841115610ac7565b6308594fb760e01b60005260046000fd5b905042111586610ab8565b604051633744092160e21b81526044906111b46004820161235d565bfd5b5063ffffffff6111c4612339565b161515610aa3565b638c4fcd9360e01b6000523460045260246000fd5b346101fd5760003660031901126101fd5760206001600160a01b0360005416604051908152f35b346101fd5760003660031901126101fd5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346101fd5761125c36612057565b611267839293612151565b6112778360a083015115156122a1565b61018081015115611492576101a08101515161147d576112c692916001600160a01b03610140602093015116855183870120604051809681948293632f0e1bbf60e01b845288600485016122d5565b03915afa9182156105a75760009261145c575b506112e483836122f1565b806000526005602052600e6040600020019280519367ffffffffffffffff8511611446576020946113158254611c82565b601f8111611416575b5085601f821160011461138d5791817f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca169949261095b94600091611382575b508160011b916000199060031b1c19161790555b60405191829187835287830190611dde565b90508301518961135c565b601f1982169083600052806000209160005b8181106113ff57509261095b9492600192827f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1699896106113e6575b5050811b019055611370565b85015160001960f88460031b161c1916905589806113da565b91928960018192868a01518155019401920161139f565b611440908360005287600020601f840160051c810191898510610fa957601f0160051c0190612322565b8661131e565b634e487b7160e01b600052604160045260246000fd5b61147691925060203d6020116109b8576109a78183611cf5565b90836112d9565b826360ec327960e01b60005260045260246000fd5b8263032c20ef60e21b60005260045260246000fd5b346101fd5760003660031901126101fd576114c061263b565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101fd5760003660031901126101fd576020600154604051908152f35b346101fd5761156c36612027565b9061157681612151565b9060a08201516116d2576060820180515142106116c15760204291510151106116b05760249160206001600160a01b036000541660405194858092630e82f3b760e41b82528660048301525afa9283156105a75760009361167c575b50835192602085019384200361166b57608001514201918242116104e8577f50df9e2c9fc5a7f4a07e403fa0300b88fcc8c6943bdff4b8ae71f55b7fd95f899361165d918360005260056020528460066040600020015581519020836000526005602052600c6040600020015560405193849384526020840152606060408401526060830190611dde565b0390a1602060405160018152f35b630d8dbe2560e01b60005260046000fd5b9092506020813d6020116116a8575b8161169860209383611cf5565b810103126101fd575191846115d2565b3d915061168b565b633d82a7cd60e11b60005260046000fd5b63a0750b5160e01b60005260046000fd5b633e26347b60e21b60005260045260246000fd5b346101fd5760803660031901126101fd576116ff611f87565b602435906001600160a01b03821682036101fd5760643567ffffffffffffffff81116101fd57611733903690600401611f9d565b917ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549260ff8460401c16159367ffffffffffffffff811680159081611930575b6001149081611926575b15908161191d575b5061190c5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556117fb926117f591866118cd575b506117d3612683565b6117db612683565b6117e43361250a565b6117ef6044356124a0565b506125b0565b506123a3565b506001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036118bb575b5061183e57005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6118c79061025361263b565b81611837565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055866117ca565b63f92ee8a960e01b60005260046000fd5b90501586611786565b303b15915061177e565b869150611774565b346101fd5760203660031901126101fd576001600160a01b03611959611f87565b61196161263b565b1680600052600460205260ff60406000205416156119c4576020817f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e79260005260048252604060002060ff198154169055604051908152a1602060405160018152f35b6321ac7c5f60e01b60005260045260246000fd5b346101fd5760203660031901126101fd577f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc6020600435611a1761263b565b8060005260088252611a39816001600160a01b03604060002054161515612285565b806000526008825260406000206001600160a01b03198154169055604051908152a1602060405160018152f35b346101fd5760203660031901126101fd5760043567ffffffffffffffff81116101fd5760ff611ab26020611a9f81943690600401611f40565b8160405193828580945193849201611dbb565b8101600981520301902054166040519015158152f35b346101fd5760203660031901126101fd57610ed2611ae7600435612151565b604051918291602083526020830190611e03565b346101fd5760203660031901126101fd57600435600052600560205260206040600020610ed28154916002810154600582015491600681015492600782015493611bc26001600160a01b03600885015416611b5860098601611d17565b906001600160a01b03600a87015416976001600160a01b03600b8801541694600c88015496611b8e600e600d8b01549a01611d17565b996040519e8f9e8f908152015260408d015260608c015260808b015260a08a015261018060c08a0152610180890190611dde565b9460e0880152610100870152610120860152610140850152838203610160850152611dde565b346101fd5760203660031901126101fd57600435600052600860205260206001600160a01b0360406000205416604051908152f35b346101fd5760203660031901126101fd57600435806000526005602052611c57816001600160a01b036008604060002001541615156120a6565b6000526006602052600260406000206001810154600052016020526020604060002054604051908152f35b90600182811c92168015611cb2575b6020831014611c9c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611c91565b6101c0810190811067ffffffffffffffff82111761144657604052565b6040810190811067ffffffffffffffff82111761144657604052565b90601f8019910116810190811067ffffffffffffffff82111761144657604052565b9060405191826000825492611d2b84611c82565b8084529360018116908115611d995750600114611d52575b50611d5092500383611cf5565b565b90506000929192526020600020906000915b818310611d7d575050906020611d509282010138611d43565b6020919350806001915483858901015201910190918492611d64565b905060209250611d5094915060ff191682840152151560051b82010138611d43565b60005b838110611dce5750506000910152565b8181015183820152602001611dbe565b90602091611df781518092818552858086019101611dbb565b601f01601f1916010190565b919091805183526020810151602084016000905b60028210611f085750505060408101516060840152606081015192608081016000905b60028210611ef2575050611eef929350608082015160c082015260a082015160e082015260c08201516101008201526001600160a01b0360e0830151166101208201526101a0611e9d610100840151610200610140850152610200840190611dde565b926001600160a01b03610120820151166101608401526001600160a01b0361014082015116610180840152610160810151828401526101808101516101c08401520151906101e0818403910152611dde565b90565b6020806001928851815201960191019094611e3a565b60208060019263ffffffff865116815201930191019091611e17565b67ffffffffffffffff811161144657601f01601f191660200190565b81601f820112156101fd57803590611f5782611f24565b92611f656040519485611cf5565b828452602083830101116101fd57816000926020809301838601378301015290565b600435906001600160a01b03821682036101fd57565b9080601f830112156101fd5781359167ffffffffffffffff8311611446578260051b9060405193611fd16020840186611cf5565b8452602080850192820101918383116101fd5760208201905b838210611ff957505050505090565b813567ffffffffffffffff81116101fd5760209161201c87848094880101611f40565b815201910190611fea565b9060406003198301126101fd57600435916024359067ffffffffffffffff82116101fd57611eef91600401611f40565b60606003198201126101fd576004359160243567ffffffffffffffff81116101fd578261208691600401611f40565b916044359067ffffffffffffffff82116101fd57611eef91600401611f40565b156120ae5750565b63cd6f4a4f60e01b60005260045260246000fd5b604051906120cf82611cbc565b60606101a08360008152604080516120e78282611cf5565b8136823760208301526000818301528051906121038183611cf5565b3682378382015260006080820152600060a0820152600060c0820152600060e08201528261010082015260006101208201526000610140820152600061016082015260006101808201520152565b9061215a6120c2565b5081600052600560205260406000209160405161217681611cbc565b8354815260405163ffffffff6001860154818116835260201c1660208201526121a0604082611cf5565b6020820152600284015460408201526040518060038601906000905b6002821061226f57505050611d509291816121e060406001600160a01b0394611cf5565b606082015260058601546080820152600686015460a0820152600786015460c082015261225f600e836008890154169760e0840198895261222360098201611d17565b61010085015284600a8201541661012085015284600b82015416610140850152600c810154610160850152600d81015461018085015201611d17565b6101a082015294511615156120a6565b60016020819285548152019301910190916121bc565b1561228d5750565b6381c4951960e01b60005260045260246000fd5b156122a95750565b63166b4d0360e01b60005260045260246000fd5b908160209103126101fd575180151581036101fd5790565b611eef9392606092825260208201528160408201520190611dde565b156122f95750565b604051632f9f8ab960e01b81526020600482015290819061231e906024830190611dde565b0390fd5b81811061232d575050565b60008155600101612322565b60243563ffffffff811681036101fd5790565b359063ffffffff821682036101fd57565b6024906000905b6002821061237157505050565b60208060019263ffffffff6123858761234c565b16815201930191019091612364565b60001981146104e85760010190565b6123ab61263b565b805160005b81811061244357505060405190602082016020835281518091526040830190602060408260051b8601019301916000905b828210612418575050505090807f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81920390a1600190565b90919293602080612435600193603f198a82030186528851611dde565b9601920192019092916123e1565b825181101561248a578061247060208060019460051b870101518160405193828580945193849201611dbb565b810160098152030190208260ff19825416179055016123b0565b634e487b7160e01b600052603260045260246000fd5b60207fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b523552916124cc61263b565b80600155604051908152a1600190565b919060408301926000905b600282106124f457505050565b60208060019285518152019301910190916124e7565b6001600160a01b0316801561259a576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b03906125c161263b565b1680151580612626575b15612612576020817f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b6926001600160a01b03196000541617600055604051908152a1600190565b6375ac4eb760e11b60005260045260246000fd5b506001600160a01b03600054168114156125cb565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361266e57565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156126b257565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a", - "libraries": { - "PoseidonT3": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" - }, - "devdoc": { - "errors": { - "InvalidInitialization()": [ - { - "details": "The contract is already initialized." - } - ], - "NotInitializing()": [ - { - "details": "The contract is not initializing." - } - ], - "OwnableInvalidOwner(address)": [ - { - "details": "The owner is not a valid owner account. (eg. `address(0)`)" - } - ], - "OwnableUnauthorizedAccount(address)": [ - { - "details": "The caller account is not authorized to perform an operation." - } - ] - }, - "events": { - "AllowedE3ProgramsParamsSet(bytes[])": { - "params": { - "e3ProgramParams": "Array of encoded encryption scheme parameters (e.g, for BFV)" - } - }, - "CiphernodeRegistrySet(address)": { - "params": { - "ciphernodeRegistry": "The address of the CiphernodeRegistry contract." - } - }, - "CiphertextOutputPublished(uint256,bytes)": { - "params": { - "ciphertextOutput": "ABI encoded ciphertext output.", - "e3Id": "ID of the E3." - } - }, - "E3Activated(uint256,uint256,bytes)": { - "params": { - "committeePublicKey": "Public key of the committee.", - "e3Id": "ID of the E3.", - "expiration": "Timestamp when committee duties expire." - } - }, - "E3ProgramDisabled(address)": { - "params": { - "e3Program": "The address of the E3 Program." - } - }, - "E3ProgramEnabled(address)": { - "params": { - "e3Program": "The address of the E3 Program." - } - }, - "E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)": { - "params": { - "e3": "Details of the E3.", - "e3Id": "ID of the E3.", - "e3Program": "Address of the Computation module selected.", - "filter": "Address of the pool of nodes from which the Cipher Node committee was selected." - } - }, - "EncryptionSchemeDisabled(bytes32)": { - "params": { - "encryptionSchemeId": "The ID of the encryption scheme that was disabled." - } - }, - "EncryptionSchemeEnabled(bytes32)": { - "params": { - "encryptionSchemeId": "The ID of the encryption scheme that was enabled." - } - }, - "Initialized(uint64)": { - "details": "Triggered when the contract has been initialized or reinitialized." - }, - "InputPublished(uint256,bytes,uint256,uint256)": { - "params": { - "data": "ABI encoded input data.", - "e3Id": "ID of the E3." - } - }, - "MaxDurationSet(uint256)": { - "params": { - "maxDuration": "The maximum duration of a computation in seconds." - } - }, - "PlaintextOutputPublished(uint256,bytes)": { - "params": { - "e3Id": "ID of the E3.", - "plaintextOutput": "ABI encoded plaintext output." - } - } - }, - "kind": "dev", - "methods": { - "activate(uint256,bytes)": { - "details": "This function MUST emit the E3Activated event.This function MUST revert if the given E3 has not yet been requested.This function MUST revert if the selected node committee has not yet published a public key.", - "params": { - "e3Id": "ID of the E3.", - "publicKey": "Public key of the committee." - }, - "returns": { - "success": "True if the E3 was successfully activated." - } - }, - "constructor": { - "params": { - "_e3ProgramsParams": "Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)", - "_maxDuration": "The maximum duration of a computation in seconds", - "_owner": "The owner of this contract" - } - }, - "getE3(uint256)": { - "details": "This function MUST revert if the E3 does not exist.", - "params": { - "e3Id": "ID of the E3." - }, - "returns": { - "e3": "The struct representing the requested E3." - } - }, - "getInputRoot(uint256)": { - "details": "This function MUST revert if the E3 does not exist.", - "params": { - "e3Id": "ID of the E3." - }, - "returns": { - "_0": "The root of the input merkle tree." - } - }, - "initialize(address,address,uint256,bytes[])": { - "params": { - "_ciphernodeRegistry": "The address of the ciphernode registry", - "_e3ProgramsParams": "Array of ABI encoded E3 encryption scheme parameters sets (e.g., for BFV)", - "_maxDuration": "The maximum duration of a computation in seconds", - "_owner": "The owner of this contract" - } - }, - "owner()": { - "details": "Returns the address of the current owner." - }, - "publishCiphertextOutput(uint256,bytes,bytes)": { - "details": "This function MUST emit the CiphertextOutputPublished event.", - "params": { - "ciphertextOutput": "ABI encoded output data to verify.", - "e3Id": "ID of the E3.", - "proof": "ABI encoded data to verify the ciphertextOutput." - }, - "returns": { - "success": "True if the output was successfully published." - } - }, - "publishInput(uint256,bytes)": { - "details": "This function MUST revert if the E3 is not yet activated.This function MUST emit the InputPublished event.", - "params": { - "data": "ABI encoded input data to publish.", - "e3Id": "ID of the E3." - }, - "returns": { - "success": "True if the input was successfully published." - } - }, - "publishPlaintextOutput(uint256,bytes,bytes)": { - "details": "This function MUST revert if the output has not been published.This function MUST emit the PlaintextOutputPublished event.", - "params": { - "e3Id": "ID of the E3.", - "plaintextOutput": "ABI encoded plaintext output.", - "proof": "ABI encoded data to verify the plaintextOutput." - } - }, - "renounceOwnership()": { - "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." - }, - "request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)": { - "details": "This function MUST emit the E3Requested event.", - "params": { - "computeProviderParams": "ABI encoded compute provider parameters.", - "duration": "The duration of the computation in seconds.", - "e3Program": "Address of the E3 Program.", - "e3ProgramParams": "ABI encoded computation parameters.", - "filter": "IDs of the pool of nodes from which to select the committee.", - "threshold": "The M/N threshold for the committee." - }, - "returns": { - "e3": "The E3 struct.", - "e3Id": "ID of the E3." - } - }, - "setMaxDuration(uint256)": { - "params": { - "_maxDuration": "The maximum duration of a computation in seconds." - }, - "returns": { - "success": "True if the max duration was successfully set." - } - }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." - } - }, - "version": 1 - }, - "userdoc": { - "events": { - "AllowedE3ProgramsParamsSet(bytes[])": { - "notice": "Emitted when the allowed E3 encryption scheme parameters are configured." - }, - "CiphernodeRegistrySet(address)": { - "notice": "This event MUST be emitted any time the CiphernodeRegistry is set." - }, - "CiphertextOutputPublished(uint256,bytes)": { - "notice": "This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) is successfully published." - }, - "E3Activated(uint256,uint256,bytes)": { - "notice": "This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully activated." - }, - "E3ProgramDisabled(address)": { - "notice": "This event MUST be emitted any time a E3 Program is disabled." - }, - "E3ProgramEnabled(address)": { - "notice": "This event MUST be emitted any time a E3 Program is enabled." - }, - "E3Requested(uint256,(uint256,uint32[2],uint256,uint256[2],uint256,uint256,bytes32,address,bytes,address,address,bytes32,bytes32,bytes),address,address)": { - "notice": "This event MUST be emitted when an Encrypted Execution Environment (E3) is successfully requested." - }, - "EncryptionSchemeDisabled(bytes32)": { - "notice": "This event MUST be emitted any time an encryption scheme is disabled." - }, - "EncryptionSchemeEnabled(bytes32)": { - "notice": "The event MUST be emitted any time an encryption scheme is enabled." - }, - "InputPublished(uint256,bytes,uint256,uint256)": { - "notice": "This event MUST be emitted when an input to an Encrypted Execution Environment (E3) is successfully published." - }, - "MaxDurationSet(uint256)": { - "notice": "This event MUST be emitted any time the `maxDuration` is set." - }, - "PlaintextOutputPublished(uint256,bytes)": { - "notice": "This event MUST be emitted when the plaintext output of an Encrypted Execution Environment (E3) is successfully published." - } - }, - "kind": "user", - "methods": { - "activate(uint256,bytes)": { - "notice": "This function should be called to activate an Encrypted Execution Environment (E3) once it has been initialized and is ready for input." - }, - "e3ProgramsParams(bytes)": { - "notice": "Mapping that stores the valid E3 program ABI encoded parameter sets (e.g., BFV)." - }, - "getE3(uint256)": { - "notice": "This function should be called to retrieve the details of an Encrypted Execution Environment (E3)." - }, - "getInputRoot(uint256)": { - "notice": "This function returns root of the input merkle tree for a given E3." - }, - "publishCiphertextOutput(uint256,bytes,bytes)": { - "notice": "This function should be called to publish output data for an Encrypted Execution Environment (E3)." - }, - "publishInput(uint256,bytes)": { - "notice": "This function should be called to publish input data for Encrypted Execution Environment (E3)." - }, - "publishPlaintextOutput(uint256,bytes,bytes)": { - "notice": "This function publishes the plaintext output of an Encrypted Execution Environment (E3)." - }, - "request(address,uint32[2],uint256[2],uint256,address,bytes,bytes)": { - "notice": "This function should be called to request a computation within an Encrypted Execution Environment (E3)." - }, - "setMaxDuration(uint256)": { - "notice": "This function should be called to set the maximum duration of requested computations." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 1396, - "contract": "contracts/Enclave.sol:Enclave", - "label": "ciphernodeRegistry", - "offset": 0, - "slot": "0", - "type": "t_contract(ICiphernodeRegistry)2611" - }, - { - "astId": 1398, - "contract": "contracts/Enclave.sol:Enclave", - "label": "maxDuration", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 1400, - "contract": "contracts/Enclave.sol:Enclave", - "label": "nexte3Id", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 1402, - "contract": "contracts/Enclave.sol:Enclave", - "label": "requests", - "offset": 0, - "slot": "3", - "type": "t_uint256" - }, - { - "astId": 1407, - "contract": "contracts/Enclave.sol:Enclave", - "label": "e3Programs", - "offset": 0, - "slot": "4", - "type": "t_mapping(t_contract(IE3Program)2705,t_bool)" - }, - { - "astId": 1412, - "contract": "contracts/Enclave.sol:Enclave", - "label": "e3s", - "offset": 0, - "slot": "5", - "type": "t_mapping(t_uint256,t_struct(E3)2671_storage)" - }, - { - "astId": 1417, - "contract": "contracts/Enclave.sol:Enclave", - "label": "inputs", - "offset": 0, - "slot": "6", - "type": "t_mapping(t_uint256,t_struct(LeanIMTData)532_storage)" - }, - { - "astId": 1421, - "contract": "contracts/Enclave.sol:Enclave", - "label": "inputCounts", - "offset": 0, - "slot": "7", - "type": "t_mapping(t_uint256,t_uint256)" - }, - { - "astId": 1426, - "contract": "contracts/Enclave.sol:Enclave", - "label": "decryptionVerifiers", - "offset": 0, - "slot": "8", - "type": "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2626)" - }, - { - "astId": 1431, - "contract": "contracts/Enclave.sol:Enclave", - "label": "e3ProgramsParams", - "offset": 0, - "slot": "9", - "type": "t_mapping(t_bytes_memory_ptr,t_bool)" - } - ], - "types": { - "t_array(t_uint256)2_storage": { - "base": "t_uint256", - "encoding": "inplace", - "label": "uint256[2]", - "numberOfBytes": "64" - }, - "t_array(t_uint32)2_storage": { - "base": "t_uint32", - "encoding": "inplace", - "label": "uint32[2]", - "numberOfBytes": "32" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_bytes_memory_ptr": { - "encoding": "bytes", - "label": "bytes", - "numberOfBytes": "32" - }, - "t_bytes_storage": { - "encoding": "bytes", - "label": "bytes", - "numberOfBytes": "32" - }, - "t_contract(ICiphernodeRegistry)2611": { - "encoding": "inplace", - "label": "contract ICiphernodeRegistry", - "numberOfBytes": "20" - }, - "t_contract(IDecryptionVerifier)2626": { - "encoding": "inplace", - "label": "contract IDecryptionVerifier", - "numberOfBytes": "20" - }, - "t_contract(IE3Program)2705": { - "encoding": "inplace", - "label": "contract IE3Program", - "numberOfBytes": "20" - }, - "t_contract(IInputValidator)2906": { - "encoding": "inplace", - "label": "contract IInputValidator", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_contract(IDecryptionVerifier)2626)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => contract IDecryptionVerifier)", - "numberOfBytes": "32", - "value": "t_contract(IDecryptionVerifier)2626" - }, - "t_mapping(t_bytes_memory_ptr,t_bool)": { - "encoding": "mapping", - "key": "t_bytes_memory_ptr", - "label": "mapping(bytes => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_contract(IE3Program)2705,t_bool)": { - "encoding": "mapping", - "key": "t_contract(IE3Program)2705", - "label": "mapping(contract IE3Program => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_uint256,t_struct(E3)2671_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => struct E3)", - "numberOfBytes": "32", - "value": "t_struct(E3)2671_storage" - }, - "t_mapping(t_uint256,t_struct(LeanIMTData)532_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => struct LeanIMTData)", - "numberOfBytes": "32", - "value": "t_struct(LeanIMTData)532_storage" - }, - "t_mapping(t_uint256,t_uint256)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_struct(E3)2671_storage": { - "encoding": "inplace", - "label": "struct E3", - "members": [ - { - "astId": 2637, - "contract": "contracts/Enclave.sol:Enclave", - "label": "seed", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 2641, - "contract": "contracts/Enclave.sol:Enclave", - "label": "threshold", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint32)2_storage" - }, - { - "astId": 2643, - "contract": "contracts/Enclave.sol:Enclave", - "label": "requestBlock", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 2647, - "contract": "contracts/Enclave.sol:Enclave", - "label": "startWindow", - "offset": 0, - "slot": "3", - "type": "t_array(t_uint256)2_storage" - }, - { - "astId": 2649, - "contract": "contracts/Enclave.sol:Enclave", - "label": "duration", - "offset": 0, - "slot": "5", - "type": "t_uint256" - }, - { - "astId": 2651, - "contract": "contracts/Enclave.sol:Enclave", - "label": "expiration", - "offset": 0, - "slot": "6", - "type": "t_uint256" - }, - { - "astId": 2653, - "contract": "contracts/Enclave.sol:Enclave", - "label": "encryptionSchemeId", - "offset": 0, - "slot": "7", - "type": "t_bytes32" - }, - { - "astId": 2656, - "contract": "contracts/Enclave.sol:Enclave", - "label": "e3Program", - "offset": 0, - "slot": "8", - "type": "t_contract(IE3Program)2705" - }, - { - "astId": 2658, - "contract": "contracts/Enclave.sol:Enclave", - "label": "e3ProgramParams", - "offset": 0, - "slot": "9", - "type": "t_bytes_storage" - }, - { - "astId": 2661, - "contract": "contracts/Enclave.sol:Enclave", - "label": "inputValidator", - "offset": 0, - "slot": "10", - "type": "t_contract(IInputValidator)2906" - }, - { - "astId": 2664, - "contract": "contracts/Enclave.sol:Enclave", - "label": "decryptionVerifier", - "offset": 0, - "slot": "11", - "type": "t_contract(IDecryptionVerifier)2626" - }, - { - "astId": 2666, - "contract": "contracts/Enclave.sol:Enclave", - "label": "committeePublicKey", - "offset": 0, - "slot": "12", - "type": "t_bytes32" - }, - { - "astId": 2668, - "contract": "contracts/Enclave.sol:Enclave", - "label": "ciphertextOutput", - "offset": 0, - "slot": "13", - "type": "t_bytes32" - }, - { - "astId": 2670, - "contract": "contracts/Enclave.sol:Enclave", - "label": "plaintextOutput", - "offset": 0, - "slot": "14", - "type": "t_bytes_storage" - } - ], - "numberOfBytes": "480" - }, - "t_struct(LeanIMTData)532_storage": { - "encoding": "inplace", - "label": "struct LeanIMTData", - "members": [ - { - "astId": 521, - "contract": "contracts/Enclave.sol:Enclave", - "label": "size", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 523, - "contract": "contracts/Enclave.sol:Enclave", - "label": "depth", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 527, - "contract": "contracts/Enclave.sol:Enclave", - "label": "sideNodes", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_uint256,t_uint256)" - }, - { - "astId": 531, - "contract": "contracts/Enclave.sol:Enclave", - "label": "leaves", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_uint256,t_uint256)" - } - ], - "numberOfBytes": "128" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint32": { - "encoding": "inplace", - "label": "uint32", - "numberOfBytes": "4" - } - } - } -} \ No newline at end of file diff --git a/examples/basic/client/src/hooks/useEnclaveContract.ts b/examples/basic/client/src/hooks/useEnclaveContract.ts deleted file mode 100644 index 38b9130103..0000000000 --- a/examples/basic/client/src/hooks/useEnclaveContract.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { useState, useEffect, useRef } from 'react' -import { useWriteContract, useWaitForTransactionReceipt, useConfig } from 'wagmi' -import { watchContractEvent } from '@wagmi/core' -import { parseEther, bytesToHex } from 'viem' -import { ENCLAVE_ADDRESS, ENCLAVE_ABI, E3_PROGRAM_ADDRESS, REGISTRY_ADDRESS, FILTER_REGISTRY_ADDRESS, REGISTRY_ABI } from '@/utils/enclave.config' -import { - encodeBfvParams, - encodeComputeProviderParams, - calculateStartWindow, - DEFAULT_COMPUTE_PROVIDER_PARAMS, - DEFAULT_E3_CONFIG -} from '@/utils/bfv' - -export interface E3RequestParams { - threshold?: [number, number] - windowSize?: number - duration?: number - paymentAmount?: string -} - -export interface E3State { - id: bigint | null - isRequested: boolean - isCommitteePublished: boolean - isActivated: boolean - publicKey: `0x${string}` | null - expiresAt: bigint | null - plaintextOutput: string | null - hasPlaintextOutput: boolean -} - -export const useEnclaveContract = () => { - const [e3State, setE3State] = useState({ - id: null, - isRequested: false, - isCommitteePublished: false, - isActivated: false, - publicKey: null, - expiresAt: null, - plaintextOutput: null, - hasPlaintextOutput: false - }) - - const config = useConfig() - const unsubscribersRef = useRef void>>([]) - - const { - data: txHash, - writeContract, - error: writeError, - isPending: isWritePending, - } = useWriteContract() - - const { isLoading: isConfirming, isSuccess: isConfirmed } = useWaitForTransactionReceipt({ - hash: txHash, - }) - - // Set up event watchers to listen for blockchain events - useEffect(() => { - // Clean up previous watchers - unsubscribersRef.current.forEach(unsubscribe => unsubscribe()) - unsubscribersRef.current = [] - - // Listen for E3Requested events - const e3RequestedUnsubscribe = watchContractEvent(config, { - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - eventName: 'E3Requested', - chainId: 31337, - onLogs(logs) { - logs.forEach((log) => { - const { e3Id } = (log as any).args - if (e3Id) { - setE3State(prev => ({ - ...prev, - id: e3Id, - isRequested: true - })) - } - }) - } - }) - - // Listen for CommitteePublished events from the Registry - const committeePublishedUnsubscribe = watchContractEvent(config, { - address: REGISTRY_ADDRESS as `0x${string}`, - abi: REGISTRY_ABI, - eventName: 'CommitteePublished', - chainId: 31337, - onLogs(logs) { - logs.forEach((log) => { - const { e3Id, publicKey } = (log as any).args - setE3State(prevState => { - if (e3Id && prevState.id && e3Id === prevState.id && !prevState.isCommitteePublished) { - return { - ...prevState, - isCommitteePublished: true, - publicKey: publicKey as `0x${string}` - } - } - return prevState - }) - }) - } - }) - - // Listen for E3Activated events - const e3ActivatedUnsubscribe = watchContractEvent(config, { - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - eventName: 'E3Activated', - chainId: 31337, - onLogs(logs) { - logs.forEach((log) => { - const { e3Id, expiration } = (log as any).args - setE3State(prevState => { - if (e3Id && prevState.id && e3Id === prevState.id) { - return { - ...prevState, - isActivated: true, - expiresAt: expiration || null - } - } - return prevState - }) - }) - } - }) - - // Listen for PlaintextOutputPublished events - const plaintextOutputUnsubscribe = watchContractEvent(config, { - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - eventName: 'PlaintextOutputPublished', - chainId: 31337, - onLogs(logs) { - logs.forEach((log) => { - const { e3Id, plaintextOutput } = (log as any).args - setE3State(prevState => { - if (e3Id && prevState.id && e3Id === prevState.id) { - return { - ...prevState, - plaintextOutput: plaintextOutput as string, - hasPlaintextOutput: true - } - } - return prevState - }) - }) - } - }) - - // Store unsubscribers for cleanup - unsubscribersRef.current = [ - e3RequestedUnsubscribe, - committeePublishedUnsubscribe, - e3ActivatedUnsubscribe, - plaintextOutputUnsubscribe - ] - - // Cleanup on unmount - return () => { - unsubscribersRef.current.forEach(unsubscribe => unsubscribe()) - unsubscribersRef.current = [] - } - }, [config]) - - const requestComputation = async (params: E3RequestParams = {}) => { - // Reset E3 state for new request - setE3State({ - id: null, - isRequested: false, - isCommitteePublished: false, - isActivated: false, - publicKey: null, - expiresAt: null, - plaintextOutput: null, - hasPlaintextOutput: false - }) - - try { - // Prepare parameters with defaults - const threshold: [number, number] = params.threshold || [DEFAULT_E3_CONFIG.threshold_min, DEFAULT_E3_CONFIG.threshold_max] - const startWindow = calculateStartWindow(params.windowSize) - const duration = BigInt(params.duration || DEFAULT_E3_CONFIG.duration) - const paymentAmount = params.paymentAmount || "0.001" - - // Encode parameters for the smart contract - const e3ProgramParams = encodeBfvParams() - const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) - - // Make the contract call - writeContract({ - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - functionName: 'request', - args: [ - FILTER_REGISTRY_ADDRESS as `0x${string}`, - threshold as [number, number], - startWindow, - duration, - E3_PROGRAM_ADDRESS as `0x${string}`, - e3ProgramParams, - computeProviderParams - ], - value: parseEther(paymentAmount) - }) - - } catch (error: any) { - console.error('Failed to request computation:', error) - } - } - - const activateE3 = async () => { - if (!e3State.id || !e3State.publicKey) { - console.error('Cannot activate: Missing E3 ID or public key') - return - } - - try { - writeContract({ - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - functionName: 'activate', - args: [e3State.id, e3State.publicKey] - }) - } catch (error: any) { - console.error('Failed to activate E3:', error) - } - } - - const publishInput = async (encryptedData: Uint8Array) => { - if (!e3State.id) { - console.error('Cannot publish input: Missing E3 ID') - return - } - - if (!e3State.isActivated) { - console.error('Cannot publish input: E3 is not activated') - return - } - - try { - const hexData = bytesToHex(encryptedData) - - writeContract({ - address: ENCLAVE_ADDRESS as `0x${string}`, - abi: ENCLAVE_ABI, - functionName: 'publishInput', - args: [e3State.id, hexData], - gas: 2000000n - }) - } catch (error: any) { - console.error('Failed to publish input:', error) - } - } - - return { - requestComputation, - activateE3, - publishInput, - e3State, - isRequesting: isWritePending || isConfirming, - isSuccess: isConfirmed, - error: writeError, - transactionHash: txHash - } -} \ No newline at end of file diff --git a/examples/basic/client/src/hooks/useWebAssembly.tsx b/examples/basic/client/src/hooks/useWebAssembly.tsx index 8d5014a830..977aeb3031 100644 --- a/examples/basic/client/src/hooks/useWebAssembly.tsx +++ b/examples/basic/client/src/hooks/useWebAssembly.tsx @@ -27,6 +27,7 @@ export const useWebAssemblyHook = () => { console.log('Encrypting input') const encryptor = new Encrypt() const result = encryptor.encrypt(value, publicKey) + console.log('Encrypted input:', result) return result } catch (error) { console.error('Error encrypting input:', error) diff --git a/examples/basic/client/src/main.tsx b/examples/basic/client/src/main.tsx index c85937ca01..8f4cc8fc64 100644 --- a/examples/basic/client/src/main.tsx +++ b/examples/basic/client/src/main.tsx @@ -6,32 +6,25 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { ConnectKitProvider, getDefaultConfig } from 'connectkit' import App from './App.tsx' -// Web3 Configuration -const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID || '' -if (!walletConnectProjectId) { - console.warn('VITE_WALLETCONNECT_PROJECT_ID is not set in .env file. WalletConnect will not function properly.') -} - -const chains = import.meta.env.DEV ? ([sepolia, anvil] as const) : ([sepolia] as const) - -const config = createConfig( +const wagmiConfig = createConfig( getDefaultConfig({ appName: 'Enclave E3', enableFamily: false, - chains, - walletConnectProjectId: walletConnectProjectId, + chains: import.meta.env.DEV + ? ([sepolia, anvil] as const) + : ([sepolia] as const), + walletConnectProjectId: import.meta.env.VITE_WALLETCONNECT_PROJECT_ID!, }), ) const queryClient = new QueryClient() - const connectKitOptions = import.meta.env.DEV ? { initialChainId: 0 } : { initialChainId: sepolia.id } createRoot(document.getElementById('root')!).render( - + diff --git a/examples/basic/client/src/pages/Wizard.tsx b/examples/basic/client/src/pages/Wizard.tsx deleted file mode 100644 index 16198604c2..0000000000 --- a/examples/basic/client/src/pages/Wizard.tsx +++ /dev/null @@ -1,862 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { useAccount } from 'wagmi' -import { ConnectKitButton } from 'connectkit' -import { hexToBytes } from 'viem' - -// Components -import CardContent from './components/CardContent' -import EnvironmentError from './components/EnvironmentError' -import Spinner from './components/Spinner' - -// Hooks and utilities -import { useEnclaveContract } from '@/hooks/useEnclaveContract' -import { useWebAssemblyHook } from '@/hooks/useWebAssembly' - -// Config & Utils -import { HAS_MISSING_ENV_VARS, MISSING_ENV_VARS } from '@/utils/enclave.config' -import { decodePlaintextOutput } from '@/utils/bfv' - -// Icons -import { - Wallet, - Calculator, - Lock, - CheckCircle, - NumberSquareOne, - NumberSquareTwo, - NumberSquareThree, - NumberSquareFour, - NumberSquareFive, - NumberSquareSix -} from '@phosphor-icons/react' - -// ============================================================================ -// TYPES & ENUMS -// ============================================================================ - -enum WizardStep { - CONNECT_WALLET = 1, - REQUEST_COMPUTATION = 2, - ACTIVATE_E3 = 3, - ENTER_INPUTS = 4, - ENCRYPT_SUBMIT = 5, - RESULTS = 6, -} - - -// ============================================================================ -// STEP COMPONENTS -// ============================================================================ - -const ConnectWalletStep: React.FC = () => ( - -
-
- -
-

Step 1: Connect Your Wallet

-
-

Welcome to Encrypted Computation

-

- To begin the encrypted computation process, you'll need to connect your wallet. This enables secure - cryptographic operations and ensures your privacy throughout the computation. -

-
-

- What happens next: After connecting, you'll request a computation session, - wait for committee activation, activate the E3, enter two numbers, and see them encrypted - before being published to the secure computation environment. -

-
-
-
- -
-
-
-) - -interface RequestComputationStepProps { - e3State: any - isRequesting: boolean - transactionHash: string | undefined - error: any - isSuccess: boolean - onRequestComputation: () => Promise -} - -const RequestComputationStep: React.FC = ({ - e3State, - isRequesting, - transactionHash, - error, - isSuccess, - onRequestComputation -}) => ( - -
-
- -
-

Step 2: Request Computation

-
-

Initialize Encrypted Execution Environment

-

- Request an E3 computation from the Enclave network. This will create a secure - computation environment and wait for the committee to activate it with a public key. -

-
-

- What happens: Request → Committee Selection → Public Key → Ready for Activation -

-
- - {/* E3 State Progress */} - {e3State.id !== null && ( -
-
-

- ✅ E3 ID: {String(e3State.id)} -
- Status: Computation requested -

-
- - {e3State.isCommitteePublished && e3State.publicKey ? ( -
-

- 🔑 Committee Published Public Key! -
- Public Key: {e3State.publicKey.slice(0, 20)}...{e3State.publicKey.slice(-10)} -
- Ready to activate E3 environment. -

-
- ) : ( -
-
- -

- ⏳ Waiting for committee to publish public key... -
- The computation committee is being selected and will provide the public key shortly. -

-
-
- )} -
- )} - - {error && ( -
-

- Error: {error.message} -

-
- )} - - {isSuccess && transactionHash && ( -
-

- ✅ Transaction Successful! -
- Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} -

-
- )} -
- - {isRequesting && ( -
- -
- )} - - -
-
-) - -interface ActivateE3StepProps { - e3State: any - isRequesting: boolean - transactionHash: string | undefined - error: any - isSuccess: boolean - onActivateE3: () => Promise -} - -const ActivateE3Step: React.FC = ({ - e3State, - isRequesting, - transactionHash, - error, - isSuccess, - onActivateE3 -}) => ( - -
-
- -
-

Step 3: Activate E3

-
-

Activate the Computation Environment

-

- The committee has published their public key. Now you need to activate the E3 environment - which will allow it to accept encrypted inputs until it expires. -

-
-

🔒 Committee Ready

-
-

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

- {e3State.publicKey && ( -

Public Key: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

- )} -
-
- -
-

- What activation does: Activating the E3 sets an expiration time and - enables the environment to accept encrypted inputs from authorized users. -

-
- - {error && ( -
-

- Error: {error.message} -

-
- )} - - {isSuccess && transactionHash && e3State.isActivated && ( -
-

- ✅ E3 Successfully Activated! -
- Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} -
- Environment is now ready to accept encrypted inputs. -

-
- )} -
- - {isRequesting && ( -
- -
- )} - - -
-
-) - -interface EnterInputsStepProps { - e3State: any - input1: string - input2: string - onInput1Change: (value: string) => void - onInput2Change: (value: string) => void - onSubmit: (e: React.FormEvent) => void -} - -const EnterInputsStep: React.FC = ({ - e3State, - input1, - input2, - onInput1Change, - onInput2Change, - onSubmit -}) => ( - -
-
-
- -
-

Step 4: Enter Your Numbers

-

Input Data for Encrypted Computation

-

- Enter two numbers that will be encrypted using the committee's public key and published to the E3 environment. -

-
- - {/* E3 Environment Info */} -
-

🔒 Active E3 Environment

-
-

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

- {e3State.publicKey && ( -

Encryption Key: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

- )} - {e3State.expiresAt !== null && ( -

Valid Until: {new Date(Number(e3State.expiresAt) * 1000).toLocaleString()}

- )} -

Status: {e3State.isActivated ? '✅ Activated & Ready for Inputs' : '⏳ Activating...'}

-
-
- -
-
- - onInput1Change(e.target.value)} - placeholder='Enter your first number...' - className='w-full rounded-lg border-2 border-slate-300 px-4 py-3 text-slate-700 transition-all duration-200 focus:border-lime-400 focus:outline-none focus:ring-2 focus:ring-lime-400/20 focus:scale-[1.02]' - required - min="0" - max="999999" - /> -
- -
- - onInput2Change(e.target.value)} - placeholder='Enter your second number...' - className='w-full rounded-lg border-2 border-slate-300 px-4 py-3 text-slate-700 transition-all duration-200 focus:border-lime-400 focus:outline-none focus:ring-2 focus:ring-lime-400/20 focus:scale-[1.02]' - required - min="0" - max="999999" - /> -
- -
-

- Privacy Guarantee: These numbers will be encrypted using the committee's public key - from E3 ID {e3State.id !== null ? String(e3State.id) : 'N/A'}, ensuring they remain completely private - throughout the homomorphic computation process and will be published to the blockchain. -

-
- - -
-
-
-) - -interface EncryptSubmitStepProps { - inputPublishError: string | null - inputPublishSuccess: boolean - onTryAgain: () => void -} - -const EncryptSubmitStep: React.FC = ({ - inputPublishError, - inputPublishSuccess, - onTryAgain -}) => ( - -
-
- -
-

Step 5: Encrypting & Publishing

-
-

Processing Your Encrypted Data

- - {!inputPublishSuccess ? ( -

- Your numbers are being encrypted using homomorphic encryption and published to the secure computation environment. - Each input is published as a separate transaction to the blockchain. -

- ) : ( -

- Your encrypted inputs have been successfully published to the blockchain. - The committee is now performing the homomorphic computation and will publish the decrypted result. -

- )} - - {!inputPublishSuccess && ( -
-

- Processing Steps: -
• Encrypting your inputs with FHE -
• Publishing encrypted input 1 to blockchain -
• Publishing encrypted input 2 to blockchain -
• Preparing secure result -

-
- )} - - {inputPublishSuccess && ( -
-

- ✅ Inputs Successfully Published! -
- Both encrypted inputs have been submitted to the blockchain. -
- ⏳ Waiting for committee to process and decrypt the result... -

-
- )} - - {inputPublishError && ( -
-

- ❌ Publishing Failed: -
- {inputPublishError} -

-
- )} -
- -
- -
- - {inputPublishError && ( -
- -
- )} -
-
-) - -interface ResultsStepProps { - input1: string - input2: string - result: number | null - e3State: any - transactionHash: string | undefined - onReset: () => void -} - -const ResultsStep: React.FC = ({ - input1, - input2, - result, - e3State, - transactionHash, - onReset -}) => ( - -
-
- -
-

Step 6: Computation Complete

- -
-

Encrypted Computation Results

- -
-
-

Your Inputs

-

First Number: {input1}

-

Second Number: {input2}

-
- -
-

Computed Result

- {e3State.hasPlaintextOutput ? ( - <> -

- {decodePlaintextOutput(e3State.plaintextOutput!) ?? 'Decoding failed'} -

-

✅ Decrypted by committee

- - ) : ( - <> -

{result}

-

⏳ Awaiting committee decryption...

- - )} -
-
- - {/* Committee Processing Status */} - {!e3State.hasPlaintextOutput && ( -
-
- -

Committee Processing

-
-

- The encrypted inputs have been published to the blockchain. The committee is now performing - the homomorphic computation and will publish the decrypted result once complete. -

-
- )} - - {/* E3 Environment Details */} -
-

🔒 E3 Computation Details

-
-

E3 ID: {e3State.id !== null ? String(e3State.id) : 'N/A'}

- {e3State.publicKey && ( -

Encryption Key Used: {e3State.publicKey.slice(0, 16)}...{e3State.publicKey.slice(-8)}

- )} - {transactionHash && ( -

Request Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)}

- )} -

Status: {e3State.hasPlaintextOutput ? '✅ Computation Complete' : '⏳ Inputs Published, Awaiting Result'}

-
-
- -
-

What Just Happened?

-

- Your numbers were encrypted using the committee's public key from E3 environment {e3State.id !== null ? String(e3State.id) : 'N/A'}, - published as encrypted inputs to the blockchain{e3State.hasPlaintextOutput - ? ', and the committee has successfully computed and published the decrypted result.' - : ', and are now being processed by the committee for secure computation.' - } Your original numbers remained completely private throughout the entire process. -

-
- - -
-
-
-) - -// ============================================================================ -// MAIN WIZARD COMPONENT -// ============================================================================ - -const Wizard: React.FC = () => { - // ======================================================================== - // ENVIRONMENT CHECK - // ======================================================================== - if (HAS_MISSING_ENV_VARS) { - return - } - - // ======================================================================== - // STATE MANAGEMENT - // ======================================================================== - - // Wizard flow state - const [currentStep, setCurrentStep] = useState(WizardStep.CONNECT_WALLET) - - // Input state - const [input1, setInput1] = useState('') - const [input2, setInput2] = useState('') - - // Processing state - const [result, setResult] = useState(null) - - // Error and success state - const [inputPublishError, setInputPublishError] = useState(null) - const [inputPublishSuccess, setInputPublishSuccess] = useState(false) - - // ======================================================================== - // HOOKS - // ======================================================================== - - const { encryptInput } = useWebAssemblyHook() - const { isConnected } = useAccount() - const { requestComputation, activateE3, publishInput, e3State, isRequesting, isSuccess, error, transactionHash } = useEnclaveContract() - - // ======================================================================== - // EFFECTS - Wallet Connection Management - // ======================================================================== - - // Auto-advance from step 1 when wallet connects - useEffect(() => { - if (isConnected && currentStep === WizardStep.CONNECT_WALLET) { - setCurrentStep(WizardStep.REQUEST_COMPUTATION) - } - }, [isConnected, currentStep]) - - // Auto-move back to step 1 if wallet disconnects - useEffect(() => { - if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { - setCurrentStep(WizardStep.CONNECT_WALLET) - } - }, [isConnected, currentStep]) - - // ======================================================================== - // EFFECTS - E3 Lifecycle Management - // ======================================================================== - - // Auto-advance when committee publishes public key - useEffect(() => { - if (e3State.isCommitteePublished && e3State.publicKey && currentStep === WizardStep.REQUEST_COMPUTATION) { - setCurrentStep(WizardStep.ACTIVATE_E3) - } - }, [e3State.isCommitteePublished, e3State.publicKey, currentStep]) - - // Auto-advance when E3 is activated - useEffect(() => { - if (e3State.isActivated && currentStep === WizardStep.ACTIVATE_E3) { - setCurrentStep(WizardStep.ENTER_INPUTS) - } - }, [e3State.isActivated, currentStep]) - - // Auto-advance to results when plaintext output is published by committee - useEffect(() => { - if (e3State.hasPlaintextOutput && currentStep === WizardStep.ENCRYPT_SUBMIT) { - setCurrentStep(WizardStep.RESULTS) - } - }, [e3State.hasPlaintextOutput, currentStep]) - - // ======================================================================== - // EVENT HANDLERS - // ======================================================================== - - const handleRequestComputation = async () => { - try { - await requestComputation({ - paymentAmount: "0.001" - }) - } catch (error) { - console.error('Failed to request computation:', error) - } - } - - const handleActivateE3 = async () => { - try { - await activateE3() - } catch (error) { - console.error('Failed to activate E3:', error) - } - } - - const handleInputSubmit = async (e: React.FormEvent) => { - e.preventDefault() - if (!input1.trim() || !input2.trim()) return - - setCurrentStep(WizardStep.ENCRYPT_SUBMIT) - setInputPublishError(null) - setInputPublishSuccess(false) - - try { - // UI feedback delay - await new Promise(resolve => setTimeout(resolve, 1500)) - - // Encrypt inputs - const publicKeyBytes = hexToBytes(e3State.publicKey as `0x${string}`) - const encryptedInput1 = await encryptInput(BigInt(input1), publicKeyBytes) - const encryptedInput2 = await encryptInput(BigInt(input2), publicKeyBytes) - - if (!encryptedInput1 || !encryptedInput2) { - throw new Error('Encryption failed') - } - - // Log encrypted values for debugging - console.log('Encrypted input 1:', encryptedInput1) - console.log('Encrypted input 2:', encryptedInput2) - - // Publish inputs sequentially - wait for first TX to complete before second - await publishInput(encryptedInput1) - // Now publish the second input after first is confirmed - await publishInput(encryptedInput2) - - // Calculate expected result for display until committee decrypts - const sum = parseInt(input1) + parseInt(input2) - setResult(sum) - - setInputPublishSuccess(true) - } catch (error) { - console.error('Encryption or publishing failed:', error) - setInputPublishError(error instanceof Error ? error.message : 'Unknown error occurred') - } - } - - const handleReset = () => { - setCurrentStep(WizardStep.REQUEST_COMPUTATION) - setInput1('') - setInput2('') - setResult(null) - setInputPublishError(null) - setInputPublishSuccess(false) - } - - const handleTryAgain = () => { - setCurrentStep(WizardStep.ENTER_INPUTS) - setInputPublishError(null) - } - - // ======================================================================== - // UTILITY FUNCTIONS - // ======================================================================== - - const getStepIcon = (step: WizardStep) => { - const iconProps = { size: 20, weight: 'bold' as const } - switch (step) { - case WizardStep.CONNECT_WALLET: return - case WizardStep.REQUEST_COMPUTATION: return - case WizardStep.ACTIVATE_E3: return - case WizardStep.ENTER_INPUTS: return - case WizardStep.ENCRYPT_SUBMIT: return - case WizardStep.RESULTS: return - } - } - - const renderStepIndicator = () => ( -
- {[1, 2, 3, 4, 5, 6].map((step) => ( -
-
- {getStepIcon(step as WizardStep)} -
- {step < 6 && ( -
- )} -
- ))} -
- ) - - // ======================================================================== - // STEP ROUTING - // ======================================================================== - - const renderStepContent = () => { - switch (currentStep) { - case WizardStep.CONNECT_WALLET: - return - - case WizardStep.REQUEST_COMPUTATION: - return ( - - ) - - case WizardStep.ACTIVATE_E3: - return ( - - ) - - case WizardStep.ENTER_INPUTS: - return ( - - ) - - case WizardStep.ENCRYPT_SUBMIT: - return ( - - ) - - case WizardStep.RESULTS: - return ( - - ) - - default: - return null - } - } - - // ======================================================================== - // RENDER - // ======================================================================== - - return ( -
-
-
-

Enclave E3

-

- Confidential computation with Enclave Encrypted Execution Environments -

-
- - {renderStepIndicator()} - -
- {renderStepContent()} -
-
-
- ) -} - -export default Wizard \ No newline at end of file diff --git a/examples/basic/client/src/pages/WizardSDK.tsx b/examples/basic/client/src/pages/WizardSDK.tsx new file mode 100644 index 0000000000..3c359bcc24 --- /dev/null +++ b/examples/basic/client/src/pages/WizardSDK.tsx @@ -0,0 +1,1024 @@ +import React, { useState, useEffect, useMemo } from 'react' +import { useAccount } from 'wagmi' +import { ConnectKitButton } from 'connectkit' +import { hexToBytes } from 'viem' + +// Components +import CardContent from './components/CardContent' +import EnvironmentError from './components/EnvironmentError' +import Spinner from './components/Spinner' + +// SDK and utilities +import { useEnclaveSDK } from '@gnosis-guild/enclave-react' +import { + encodeBfvParams, + encodeComputeProviderParams, + calculateStartWindow, + decodePlaintextOutput, + DEFAULT_COMPUTE_PROVIDER_PARAMS, + DEFAULT_E3_CONFIG +} from '@gnosis-guild/enclave/sdk' +import { HAS_MISSING_ENV_VARS, MISSING_ENV_VARS, getContractAddresses } from '@/utils/env-config' +import { formatContractError } from '@/utils/error-formatting' + +// WebAssembly hook +import { useWebAssemblyHook } from '@/hooks/useWebAssembly' + +// Icons +import { + Wallet, + Calculator, + Lock, + CheckCircle, + NumberSquareOne, + NumberSquareTwo, + NumberSquareThree, + NumberSquareFour, + NumberSquareFive, + NumberSquareSix +} from '@phosphor-icons/react' + +// ============================================================================ +// TYPES & ENUMS +// ============================================================================ + +enum WizardStep { + CONNECT_WALLET = 1, + REQUEST_COMPUTATION = 2, + ACTIVATE_E3 = 3, + ENTER_INPUTS = 4, + ENCRYPT_SUBMIT = 5, + RESULTS = 6, +} + +interface E3State { + id: bigint | null + isRequested: boolean + isCommitteePublished: boolean + isActivated: boolean + publicKey: `0x${string}` | null + expiresAt: bigint | null + plaintextOutput: string | null + hasPlaintextOutput: boolean +} + +// ============================================================================ +// ERROR DISPLAY COMPONENT +// ============================================================================ + +interface ErrorDisplayProps { + error: any + showDetails: boolean + onToggleDetails: () => void +} + +const ErrorDisplay: React.FC = ({ error, showDetails, onToggleDetails }) => { + if (!error) return null; + + const userMessage = formatContractError(error); + const technicalMessage = error.message || JSON.stringify(error, null, 2); + + return ( +
+

+ Error: {userMessage} +

+ {userMessage !== technicalMessage && ( + + )} + {showDetails && userMessage !== technicalMessage && ( +
+                    {technicalMessage}
+                
+ )} +
+ ); +}; + +// ============================================================================ +// STEP COMPONENTS +// ============================================================================ + +const ConnectWalletStep: React.FC = () => ( + +
+
+ +
+

Step 1: Connect Your Wallet

+
+

Welcome to Enclave

+

+ Enclave is a protocol for Encrypted Execution Environments (E3) that enables secure computations + on private data using fully homomorphic encryption (FHE), zero-knowledge proofs, and distributed + key cryptography. Connect your wallet to experience privacy-preserving computation. +

+
+

+ How it works: You'll request an E3 computation → Ciphernode committee is selected + → Committee publishes shared public key → You encrypt and submit inputs → Secure computation executes + → Only verified outputs are decrypted by the committee. +

+
+
+
+ +
+
+
+) + +interface RequestComputationStepProps { + e3State: E3State + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onRequestComputation: () => Promise +} + +const RequestComputationStep: React.FC = ({ + e3State, + isRequesting, + transactionHash, + error, + isSuccess, + onRequestComputation +}) => ( + +
+
+ +
+

Step 2: Request Computation

+
+

Request Encrypted Execution Environment

+

+ Request an E3 computation from Enclave's decentralized network. This initiates the selection + of a Ciphernode Committee through cryptographic sortition, who will generate shared + keys for securing your computation without any single point of trust. +

+
+

+ Process: Request E3 → Committee Selection via Sortition → Key Generation → Ready for Activation +

+
+ + {/* E3 State Progress */} + {e3State.id !== null && ( +
+
+

+ ✅ E3 ID: {String(e3State.id)} +
+ Status: Computation requested +

+
+ + {e3State.isCommitteePublished && e3State.publicKey ? ( +
+

+ 🔑 Committee Published Public Key! +
+ Public Key: {e3State.publicKey.slice(0, 20)}...{e3State.publicKey.slice(-10)} +
+ Ready to activate E3 environment. +

+
+ ) : ( +
+
+ +

+ ⏳ Waiting for committee to publish public key... +
+ The computation committee is being selected and will provide the public key shortly. +

+
+
+ )} +
+ )} + + {error && ( + { }} + /> + )} + + {isSuccess && transactionHash && ( +
+

+ ✅ Transaction Successful! +
+ Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} +
+ + {isRequesting && ( +
+ +
+ )} + + +
+
+) + +interface ActivateE3StepProps { + e3State: E3State + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onActivateE3: () => Promise +} + +const ActivateE3Step: React.FC = ({ + e3State, + isRequesting, + transactionHash, + error, + isSuccess, + onActivateE3 +}) => ( + +
+
+ +
+

Step 3: Activate E3

+
+

Activate Encrypted Execution Environment

+

+ Activate the E3 using the Ciphernode Committee's shared public key. This distributed + key ensures no single node can decrypt your inputs or intermediate states - only the verified + final output can be collectively decrypted by the committee. +

+ + {e3State.isActivated && e3State.expiresAt && ( +
+

+ ✅ E3 Environment Activated! +
+ Expires At: {new Date(Number(e3State.expiresAt) * 1000).toLocaleString()} +

+
+ )} + + {error && ( + { }} + /> + )} + + {isSuccess && transactionHash && ( +
+

+ ✅ Transaction Successful! +
+ Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} +
+ + {isRequesting && ( +
+ +
+ )} + + +
+
+) + +interface EnterInputsStepProps { + e3State: E3State + input1: string + input2: string + onInput1Change: (value: string) => void + onInput2Change: (value: string) => void + onSubmit: (e: React.FormEvent) => void +} + +const EnterInputsStep: React.FC = ({ + e3State, + input1, + input2, + onInput1Change, + onInput2Change, + onSubmit +}) => ( + +
+
+ +
+

Step 4: Enter Your Numbers

+
+

Homomorphic Encrypted Computation

+

+ Enter two numbers for a privacy-preserving addition using fully homomorphic encryption (FHE). + Your inputs will be encrypted locally and remain encrypted throughout the entire computation + process, with only the final result being decrypted. +

+
+

+ Privacy Guarantee: FHE allows computation on encrypted data. Your numbers remain + private throughout the process - inputs, intermediate states, and execution are all encrypted. +

+
+ +
+
+ + onInput1Change(e.target.value)} + className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-enclave-500 focus:border-transparent" + placeholder="Enter first number" + required + /> +
+
+ + onInput2Change(e.target.value)} + className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-enclave-500 focus:border-transparent" + placeholder="Enter second number" + required + /> +
+
+ + {input1 && input2 && ( +
+

+ Ready to compute: {input1} + {input2} = ? +

+
+ )} +
+ + +
+
+) + +interface EncryptSubmitStepProps { + inputPublishError: string | null + inputPublishSuccess: boolean + showErrorDetails: boolean + onToggleErrorDetails: () => void + onTryAgain: () => void +} + +const EncryptSubmitStep: React.FC = ({ + inputPublishError, + inputPublishSuccess, + showErrorDetails, + onToggleErrorDetails, + onTryAgain +}) => ( + +
+
+ +
+

Step 5: Encrypting & Submitting

+
+

Secure Process Execution

+ + {!inputPublishError && !inputPublishSuccess && ( +
+
+ +
+

+ Your inputs are being encrypted to the committee's public key and submitted to the E3. + The Compute Provider will execute the FHE computation over your encrypted data... +

+
+

+ Process: Encrypt to Key → Submit to E3 → FHE Computation → Ciphertext Output +

+
+
+ )} + + {inputPublishError && ( +
+ + +
+ )} + + {inputPublishSuccess && ( +
+
+ +
+
+

+ ✅ Inputs Successfully Submitted! +
+ Your encrypted inputs have been published to the E3. The Compute Provider is executing + the FHE computation and will publish the ciphertext output for committee decryption. +

+
+
+
+ +
+

+ Computing... Waiting for the Ciphernode Committee to collectively decrypt the verified output. +

+
+
+ )} +
+
+
+) + +interface ResultsStepProps { + input1: string + input2: string + result: number | null + e3State: E3State + transactionHash: string | undefined + onReset: () => void +} + +const ResultsStep: React.FC = ({ + input1, + input2, + result, + e3State, + transactionHash, + onReset +}) => ( + +
+
+ +
+

Step 6: Results

+
+

Computation Complete!

+ +
+
+

+ Your Encrypted Computation: +

+

+ {input1} + {input2} = {result !== null ? result : 'Computing...'} +

+ {result !== null && ( +

+ ✅ Computed securely using FHE with distributed key decryption! +

+ )} +
+
+ +
+
+

+ E3 ID: {String(e3State.id)} +

+
+ {transactionHash && ( +
+

+ Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} + {e3State.plaintextOutput && ( +
+

+ Raw Output: {e3State.plaintextOutput.slice(0, 20)}... +

+
+ )} +
+ +
+

+ 🔒 Cryptographic Guarantees: Your inputs remained encrypted throughout the entire + process. The Ciphernode Committee used distributed key cryptography to decrypt only the + verified output, ensuring data privacy, data integrity, and correct execution. +

+
+
+ + +
+
+) + +// ============================================================================ +// MAIN WIZARD COMPONENT +// ============================================================================ + +const WizardSDK: React.FC = () => { + const { isConnected } = useAccount() + const { isLoaded: isWasmLoaded, encryptInput } = useWebAssemblyHook() + + if (HAS_MISSING_ENV_VARS) { + return + } + const contracts = getContractAddresses() + const sdkConfig = useMemo(() => ({ + autoConnect: true, + contracts: { + enclave: contracts.enclave, + ciphernodeRegistry: contracts.ciphernodeRegistry + } + }), [contracts.enclave, contracts.ciphernodeRegistry]) + + const { + isInitialized, + error: sdkError, + requestE3, + activateE3, + publishInput, + onEnclaveEvent, + off, + EnclaveEventType, + RegistryEventType + } = useEnclaveSDK(sdkConfig) + + // Component state + const [currentStep, setCurrentStep] = useState(WizardStep.CONNECT_WALLET) + const [input1, setInput1] = useState('') + const [input2, setInput2] = useState('') + const [lastTransactionHash, setLastTransactionHash] = useState() + const [inputPublishError, setInputPublishError] = useState(null) + const [inputPublishSuccess, setInputPublishSuccess] = useState(false) + const [requestError, setRequestError] = useState(null) + const [showErrorDetails, setShowErrorDetails] = useState(false) + const [isRequesting, setIsRequesting] = useState(false) + const [requestSuccess, setRequestSuccess] = useState(false) + const [result, setResult] = useState(null) + + // E3 state tracking + const [e3State, setE3State] = useState({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false + }) + + // Set up event listeners + useEffect(() => { + if (!isInitialized) return + + const handleE3Requested = (event: any) => { + const e3Id = event.data.e3Id + setE3State(prev => ({ + ...prev, + id: e3Id, + isRequested: true + })) + } + + const handleCommitteePublished = (event: any) => { + const { e3Id, publicKey } = event.data + + // I added a 2 second delay to show the waiting state, its too fast on anvil + setTimeout(() => { + setE3State(prev => { + if (prev.id !== null && e3Id === prev.id) { + return { + ...prev, + isCommitteePublished: true, + publicKey: publicKey as `0x${string}` + } + } + return prev + }) + }, 2000) + } + + const handleE3Activated = (event: any) => { + const { e3Id, expiration } = event.data + setE3State(prev => { + if (prev.id !== null && e3Id === prev.id) { + return { + ...prev, + isActivated: true, + expiresAt: expiration || null + } + } + return prev + }) + } + + const handlePlaintextOutput = (event: any) => { + const { e3Id, plaintextOutput } = event.data + setE3State(prev => { + if (prev.id !== null && e3Id === prev.id) { + const decodedResult = decodePlaintextOutput(plaintextOutput) + setResult(decodedResult) + return { + ...prev, + plaintextOutput: plaintextOutput as string, + hasPlaintextOutput: true + } + } + return prev + }) + } + + // Set up event listeners + onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested) + onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) + onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3Activated) + onEnclaveEvent(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) + + // Cleanup + return () => { + off(EnclaveEventType.E3_REQUESTED, handleE3Requested) + off(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) + off(EnclaveEventType.E3_ACTIVATED, handleE3Activated) + off(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) + } + }, [isInitialized, onEnclaveEvent, off, EnclaveEventType, RegistryEventType]) + + // Auto-advance steps based on state + useEffect(() => { + if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.CONNECT_WALLET) + } else if (isConnected && isInitialized && currentStep === WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.REQUEST_COMPUTATION) + } else if (e3State.isCommitteePublished && currentStep === WizardStep.REQUEST_COMPUTATION) { + setCurrentStep(WizardStep.ACTIVATE_E3) + } else if (e3State.isActivated && currentStep === WizardStep.ACTIVATE_E3) { + setCurrentStep(WizardStep.ENTER_INPUTS) + } else if (e3State.hasPlaintextOutput && currentStep < WizardStep.RESULTS) { + setCurrentStep(WizardStep.RESULTS) + } + }, [isConnected, isInitialized, currentStep, e3State]) + + const handleRequestComputation = async () => { + setIsRequesting(true) + setRequestError(null) + setRequestSuccess(false) + + // Reset E3 state + setE3State({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false + }) + + try { + const threshold: [number, number] = [DEFAULT_E3_CONFIG.threshold_min, DEFAULT_E3_CONFIG.threshold_max] + const startWindow = calculateStartWindow() + const duration = BigInt(DEFAULT_E3_CONFIG.duration) + const e3ProgramParams = encodeBfvParams() + const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) + + const hash = await requestE3({ + filter: contracts.filterRegistry, + threshold, + startWindow, + duration, + e3Program: contracts.e3Program, + e3ProgramParams, + computeProviderParams, + value: BigInt("1000000000000000") // 0.001 ETH + }) + + setLastTransactionHash(hash) + setRequestSuccess(true) + } catch (error) { + setRequestError(error) + console.error('Error requesting computation:', error) + } finally { + setIsRequesting(false) + } + } + + const handleActivateE3 = async () => { + if (!e3State.id || !e3State.publicKey) return + + setIsRequesting(true) + setRequestError(null) + + try { + const hash = await activateE3(e3State.id, e3State.publicKey) + setLastTransactionHash(hash) + setRequestSuccess(true) + } catch (error) { + setRequestError(error) + console.error('Error activating E3:', error) + } finally { + setIsRequesting(false) + } + } + + const handleInputSubmit = async (e: React.FormEvent) => { + e.preventDefault() + if (!input1 || !input2 || !e3State.publicKey || !e3State.id) return + + setCurrentStep(WizardStep.ENCRYPT_SUBMIT) + setInputPublishError(null) + setInputPublishSuccess(false) + + try { + // Parse inputs + const num1 = BigInt(input1) + const num2 = BigInt(input2) + + // Convert hex public key to bytes + const publicKeyBytes = hexToBytes(e3State.publicKey) + + // Encrypt both inputs + const encryptedInput1 = await encryptInput(num1, publicKeyBytes) + const encryptedInput2 = await encryptInput(num2, publicKeyBytes) + + if (!encryptedInput1 || !encryptedInput2) { + throw new Error('Failed to encrypt inputs') + } + + // Publish first input + await publishInput( + e3State.id, + `0x${Array.from(encryptedInput1, b => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}` + ) + + // Publish second input + const hash2 = await publishInput( + e3State.id, + `0x${Array.from(encryptedInput2, b => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}` + ) + + setLastTransactionHash(hash2) + setInputPublishSuccess(true) + } catch (error) { + setInputPublishError(error instanceof Error ? error.message : 'Failed to encrypt and publish inputs') + console.error('Error encrypting/publishing inputs:', error) + } + } + + const handleReset = () => { + setCurrentStep(WizardStep.CONNECT_WALLET) + setInput1('') + setInput2('') + setLastTransactionHash(undefined) + setInputPublishError(null) + setInputPublishSuccess(false) + setRequestError(null) + setIsRequesting(false) + setRequestSuccess(false) + setResult(null) + setE3State({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false + }) + } + + const handleTryAgain = () => { + setCurrentStep(WizardStep.ENTER_INPUTS) + setInputPublishError(null) + setInputPublishSuccess(false) + } + + const getStepIcon = (step: WizardStep) => { + const iconProps = { size: 24, className: currentStep >= step ? 'text-enclave-500' : 'text-slate-400' } + switch (step) { + case WizardStep.CONNECT_WALLET: return + case WizardStep.REQUEST_COMPUTATION: return + case WizardStep.ACTIVATE_E3: return + case WizardStep.ENTER_INPUTS: return + case WizardStep.ENCRYPT_SUBMIT: return + case WizardStep.RESULTS: return + } + } + + const renderStepIndicator = () => ( +
+
+ {[1, 2, 3, 4, 5, 6].map((step) => ( +
+
= step + ? 'bg-enclave-100 border-enclave-400 text-enclave-600' + : 'bg-slate-100 border-slate-300 text-slate-400' + }`}> + {getStepIcon(step as WizardStep)} +
+ {step < 6 && ( +
step ? 'bg-enclave-400' : 'bg-slate-300' + }`} /> + )} +
+ ))} +
+
+ ) + + const renderStepContent = () => { + switch (currentStep) { + case WizardStep.CONNECT_WALLET: + return + case WizardStep.REQUEST_COMPUTATION: + return ( + + ) + case WizardStep.ACTIVATE_E3: + return ( + + ) + case WizardStep.ENTER_INPUTS: + return ( + + ) + case WizardStep.ENCRYPT_SUBMIT: + return ( + setShowErrorDetails(!showErrorDetails)} + onTryAgain={handleTryAgain} + /> + ) + case WizardStep.RESULTS: + return ( + + ) + default: + return null + } + } + + if (sdkError) { + return ( +
+
+
+
+
+

+ SDK Error +

+
+ {sdkError} +
+
+
+
+
+
+ ) + } + + return ( +
+
+
+

+ Enclave E3 +

+

+ Confidential computation with Enclave Encrypted Execution Environments +

+
+ + {renderStepIndicator()} + +
+ {renderStepContent()} +
+ + {!isWasmLoaded && ( +
+

+ Loading encryption module... +

+
+ )} +
+
+ ) +} + +export default WizardSDK \ No newline at end of file diff --git a/examples/basic/client/src/pages/components/Spinner.tsx b/examples/basic/client/src/pages/components/Spinner.tsx index acc33d4823..740ae3fa8b 100644 --- a/examples/basic/client/src/pages/components/Spinner.tsx +++ b/examples/basic/client/src/pages/components/Spinner.tsx @@ -2,13 +2,17 @@ // SIMPLE SPINNER // ============================================================================ -const Spinner: React.FC<{ size?: number; className?: string }> = ({ size = 18, className = "" }) => ( -
-
-
+import React from 'react' + +interface SpinnerProps { + size?: number +} + +const Spinner: React.FC = ({ size = 24 }) => ( +
) export default Spinner \ No newline at end of file diff --git a/examples/basic/client/src/utils/bfv.ts b/examples/basic/client/src/utils/bfv.ts deleted file mode 100644 index e891e37f49..0000000000 --- a/examples/basic/client/src/utils/bfv.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { encodeAbiParameters } from 'viem' - -// BFV parameter set matching the Rust SET_2048_1032193_1 configuration -export const BFV_PARAMS_SET = { - degree: 2048, - plaintext_modulus: 1032193, - moduli: [0x3FFFFFFF000001n] // BigInt for the modulus -} as const - -// Compute provider parameters structure -export interface ComputeProviderParams { - name: string - parallel: boolean - batch_size: number -} - -// Default compute provider configuration -export const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = { - name: "risc0", - parallel: false, - batch_size: 2 -} - -// Default E3 configuration -export const DEFAULT_E3_CONFIG = { - threshold_min: 2, - threshold_max: 3, - window_size: 300, // 5 minutes in seconds - duration: 1800, // 30 minutes in seconds - payment_amount: "0" // 0 ETH in wei -} as const - -/** - * Encode BFV parameters for the smart contract - * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption - */ -export function encodeBfvParams( - degree: number = BFV_PARAMS_SET.degree, - plaintext_modulus: number = BFV_PARAMS_SET.plaintext_modulus, - moduli: readonly bigint[] = BFV_PARAMS_SET.moduli -): `0x${string}` { - return encodeAbiParameters( - [ - { - name: 'bfvParams', - type: 'tuple', - components: [ - { name: 'degree', type: 'uint256' }, - { name: 'plaintext_modulus', type: 'uint256' }, - { name: 'moduli', type: 'uint256[]' } - ] - } - ], - [{ - degree: BigInt(degree), - plaintext_modulus: BigInt(plaintext_modulus), - moduli: [...moduli] - }] - ) -} - -/** - * Encode compute provider parameters for the smart contract - */ -export function encodeComputeProviderParams(params: ComputeProviderParams): `0x${string}` { - const jsonString = JSON.stringify(params) - const encoder = new TextEncoder() - const bytes = encoder.encode(jsonString) - - return `0x${Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('')}` -} - -/** - * Get the current timestamp in seconds - */ -export function getCurrentTimestamp(): number { - return Math.floor(Date.now() / 1000) -} - -/** - * Calculate start window for E3 request - */ -export function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] { - const now = getCurrentTimestamp() - return [BigInt(now), BigInt(now + windowSize)] -} - - -/** - * Decode plaintextOutput bytes to get the actual result number - */ -export function decodePlaintextOutput(plaintextOutput: string): number | null { - try { - // Remove '0x' prefix if present - const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput - - // Convert hex to bytes - const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []) - - if (bytes.length < 8) { - console.warn('Plaintext output too short for u64 decoding') - return null - } - - // Decode first u64 (8 bytes) as little-endian - const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) - const result = view.getBigUint64(0, true) // true for little-endian - - return Number(result) - } catch (error) { - console.error('Failed to decode plaintext output:', error) - return null - } -} \ No newline at end of file diff --git a/examples/basic/client/src/utils/enclave.config.ts b/examples/basic/client/src/utils/enclave.config.ts deleted file mode 100644 index c4d613bc24..0000000000 --- a/examples/basic/client/src/utils/enclave.config.ts +++ /dev/null @@ -1,42 +0,0 @@ -import contractABI from '@/abis/enclave.abi.json' - -// Environment variables with validation -export const ENCLAVE_ADDRESS = import.meta.env.VITE_ENCLAVE_ADDRESS -export const E3_PROGRAM_ADDRESS = import.meta.env.VITE_E3_PROGRAM_ADDRESS -export const REGISTRY_ADDRESS = import.meta.env.VITE_REGISTRY_ADDRESS -export const FILTER_REGISTRY_ADDRESS = import.meta.env.VITE_FILTER_REGISTRY_ADDRESS - -// Validate required environment variables -const requiredEnvVars = { - VITE_ENCLAVE_ADDRESS: ENCLAVE_ADDRESS, - VITE_E3_PROGRAM_ADDRESS: E3_PROGRAM_ADDRESS, - VITE_REGISTRY_ADDRESS: REGISTRY_ADDRESS, - VITE_FILTER_REGISTRY_ADDRESS: FILTER_REGISTRY_ADDRESS, -} - -export const MISSING_ENV_VARS = Object.entries(requiredEnvVars) - .filter(([, value]) => !value) - .map(([key]) => key) - -export const HAS_MISSING_ENV_VARS = MISSING_ENV_VARS.length > 0 - -// Contract ABIs -export const ENCLAVE_ABI = contractABI.abi -export const REGISTRY_ABI = [ - { - type: 'event', - name: 'CommitteePublished', - inputs: [ - { - name: 'e3Id', - type: 'uint256', - indexed: true, - }, - { - name: 'publicKey', - type: 'bytes', - indexed: false, - }, - ], - }, -] as const \ No newline at end of file diff --git a/examples/basic/client/src/utils/env-config.ts b/examples/basic/client/src/utils/env-config.ts new file mode 100644 index 0000000000..aa36ef789c --- /dev/null +++ b/examples/basic/client/src/utils/env-config.ts @@ -0,0 +1,43 @@ +export const ENCLAVE_ADDRESS = import.meta.env.VITE_ENCLAVE_ADDRESS +export const E3_PROGRAM_ADDRESS = import.meta.env.VITE_E3_PROGRAM_ADDRESS +export const REGISTRY_ADDRESS = import.meta.env.VITE_REGISTRY_ADDRESS +export const FILTER_REGISTRY_ADDRESS = import.meta.env.VITE_FILTER_REGISTRY_ADDRESS +export const RPC_URL = import.meta.env.VITE_RPC_URL || 'http://localhost:8545' + +const requiredEnvVars = { + VITE_ENCLAVE_ADDRESS: ENCLAVE_ADDRESS, + VITE_E3_PROGRAM_ADDRESS: E3_PROGRAM_ADDRESS, + VITE_REGISTRY_ADDRESS: REGISTRY_ADDRESS, + VITE_FILTER_REGISTRY_ADDRESS: FILTER_REGISTRY_ADDRESS, +} + +export const MISSING_ENV_VARS = Object.entries(requiredEnvVars) + .filter(([, value]) => !value) + .map(([key]) => key) + +export const HAS_MISSING_ENV_VARS = MISSING_ENV_VARS.length > 0 + +/** + * Validate environment variables and throw an error if any are missing + */ +export function validateEnvVars(): void { + if (HAS_MISSING_ENV_VARS) { + throw new Error( + `Missing required environment variables: ${MISSING_ENV_VARS.join(', ')}\n` + + 'Please check your .env file and ensure all required variables are set.' + ) + } +} + +/** + * Get validated contract addresses + */ +export function getContractAddresses() { + validateEnvVars() + return { + enclave: ENCLAVE_ADDRESS as `0x${string}`, + ciphernodeRegistry: REGISTRY_ADDRESS as `0x${string}`, + filterRegistry: FILTER_REGISTRY_ADDRESS as `0x${string}`, + e3Program: E3_PROGRAM_ADDRESS as `0x${string}`, + } +} \ No newline at end of file diff --git a/examples/basic/client/src/utils/error-formatting.ts b/examples/basic/client/src/utils/error-formatting.ts new file mode 100644 index 0000000000..5b8a832754 --- /dev/null +++ b/examples/basic/client/src/utils/error-formatting.ts @@ -0,0 +1,53 @@ +/** + * Format contract errors into user-friendly messages + */ +export function formatContractError(error: any): string { + if (!error) return 'Unknown error occurred'; + + if (error.name === 'ContractFunctionExecutionError') { + const functionMatch = error.message.match(/The contract function "([^"]+)" reverted/); + const functionName = functionMatch ? functionMatch[1] : 'contract function'; + + const contractErrors: Record = { + 'publishInput': 'Failed to submit encrypted inputs. The computation may not be ready or inputs are invalid.', + 'activate': 'Failed to activate the computation environment. Please ensure the committee has been published.', + 'request': 'Failed to request computation. Please check your parameters and try again.', + 'addCiphernode': 'Failed to add ciphernode. You may not have permission or the node is already registered.', + 'removeCiphernode': 'Failed to remove ciphernode. You may not have permission or invalid parameters.' + }; + + return contractErrors[functionName] || `The ${functionName} operation failed. Please check your inputs and try again.`; + } + + if (error.message) { + if (error.message.includes('User rejected')) { + return 'Transaction was cancelled by user.'; + } + if (error.message.includes('insufficient funds')) { + return 'Insufficient funds to complete the transaction.'; + } + if (error.message.includes('nonce too low')) { + return 'Transaction nonce error. Please refresh and try again.'; + } + if (error.message.includes('gas')) { + return 'Transaction failed due to gas issues. Please try again with higher gas.'; + } + if (error.message.includes('network')) { + return 'Network error occurred. Please check your connection and try again.'; + } + } + + if (error.code && error.message) { + return error.message; + } + + return 'An unexpected error occurred. Please try again.'; +} + +/** + * Extract a simple error message for display + */ +export function getDisplayErrorMessage(error: any): string { + const formatted = formatContractError(error); + return formatted; +} \ No newline at end of file diff --git a/examples/basic/client/tailwind.config.js b/examples/basic/client/tailwind.config.js index 57948ae0c7..7c5edad7fa 100644 --- a/examples/basic/client/tailwind.config.js +++ b/examples/basic/client/tailwind.config.js @@ -13,11 +13,25 @@ const config = { extend: { fontFamily: { jakarta: ['Plus Jakarta Sans', 'sans-serif'], + sans: ['Inter', 'ui-sans-serif', 'system-ui'], }, colors: { slate: { 200: '#E3E9F5', }, + 'enclave': { + 50: '#eff9ff', + 100: '#def2ff', + 200: '#b6e8ff', + 300: '#75d8ff', + 400: '#2cc4ff', + 500: '#60c2ff', + 600: '#0ea5e9', + 700: '#0284c7', + 800: '#0369a1', + 900: '#0c4a6e', + 950: '#082f49', + } }, letterSpacing: { custom: '0.03em', diff --git a/examples/basic/client/vite.config.ts b/examples/basic/client/vite.config.ts index 53a2e75be1..3d87036415 100644 --- a/examples/basic/client/vite.config.ts +++ b/examples/basic/client/vite.config.ts @@ -15,15 +15,31 @@ export default defineConfig({ }, optimizeDeps: { exclude: ['@rollup/browser'], + include: [ + '@gnosis-guild/enclave/sdk', + '@gnosis-guild/enclave-react', + ], + force: true, + }, + build: { + commonjsOptions: { + include: [/node_modules/, /packages\/evm/], + }, }, resolve: { alias: { + react: path.resolve(__dirname, 'node_modules/react'), + 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'), + wagmi: path.resolve(__dirname, 'node_modules/wagmi'), + '@gnosis-guild/enclave-react': path.resolve( + __dirname, + 'node_modules/@gnosis-guild/enclave-react' + ), '@': path.resolve(__dirname, './src'), libs: path.resolve(__dirname, './libs'), }, }, plugins: [ - // here is the main update wasm(), topLevelAwait(), react(), @@ -31,7 +47,6 @@ export default defineConfig({ ], server: { open: true, - // this sets a default port to 3000 port: 3000, }, preview: { diff --git a/packages/enclave-react/.gitignore b/packages/enclave-react/.gitignore new file mode 100644 index 0000000000..2b59089360 --- /dev/null +++ b/packages/enclave-react/.gitignore @@ -0,0 +1,21 @@ +# directories +.coverage_artifacts +.coverage_cache +.coverage_contracts +artifacts +build +cache +coverage +dist +node_modules +types +deployments/localhost + +# files +*.env +*.log +.DS_Store +.pnp.* +coverage.json +package-lock.json +pnpm-lock.yaml \ No newline at end of file diff --git a/packages/enclave-react/README.md b/packages/enclave-react/README.md new file mode 100644 index 0000000000..8d39021a61 --- /dev/null +++ b/packages/enclave-react/README.md @@ -0,0 +1,136 @@ +# @gnosis-guild/enclave-react + +React hooks and utilities for Enclave SDK. + +## Installation + +```bash +npm install @gnosis-guild/enclave-react @gnosis-guild/enclave +# or +yarn add @gnosis-guild/enclave-react @gnosis-guild/enclave +# or +pnpm add @gnosis-guild/enclave-react @gnosis-guild/enclave +``` + +## Usage + +### useEnclaveSDK + +A React hook for interacting with the Enclave SDK. This hook provides a clean interface for managing SDK state, handling contract interactions, and listening to events. + +```tsx +import { useEnclaveSDK } from '@gnosis-guild/enclave-react'; + +function MyComponent() { + const { + sdk, + isInitialized, + error, + requestE3, + activateE3, + publishInput, + onEnclaveEvent, + off, + EnclaveEventType, + RegistryEventType + } = useEnclaveSDK({ + autoConnect: true, + contracts: { + enclave: '0x...', + ciphernodeRegistry: '0x...' + }, + chainId: 1 + }); + + // Listen to events + React.useEffect(() => { + if (!isInitialized) return; + + const handleE3Requested = (event) => { + console.log('E3 requested:', event.data); + }; + + onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested); + + return () => { + off(EnclaveEventType.E3_REQUESTED, handleE3Requested); + }; + }, [isInitialized, onEnclaveEvent, off, EnclaveEventType]); + + // Request computation + const handleRequest = async () => { + try { + const hash = await requestE3({ + filter: '0x...', + threshold: [2, 3], + startWindow: [BigInt(Date.now()), BigInt(Date.now() + 300000)], + duration: BigInt(1800), + e3Program: '0x...', + e3ProgramParams: '0x...', + computeProviderParams: '0x...', + value: BigInt('1000000000000000') // 0.001 ETH + }); + console.log('E3 requested with hash:', hash); + } catch (error) { + console.error('Failed to request E3:', error); + } + }; + + if (error) { + return
Error: {error}
; + } + + if (!isInitialized) { + return
Initializing SDK...
; + } + + return ( +
+ +
+ ); +} +``` + +## Features + +- **Automatic Wallet Integration**: Seamlessly integrates with wagmi for wallet management +- **Event Handling**: Simple event subscription and cleanup +- **Error Handling**: Comprehensive error states and messages +- **TypeScript Support**: Full type safety with TypeScript +- **Optimized**: Automatic cleanup and efficient re-renders + +## Requirements + +- React 18+ +- wagmi 2.0+ +- viem 2.0+ + +## API + +### useEnclaveSDK(config) + +#### Parameters + +- `config.autoConnect` (boolean, optional): Automatically initialize SDK when wallet is connected +- `config.contracts` (object, optional): Contract addresses for Enclave and CiphernodeRegistry +- `config.chainId` (number, optional): Chain ID for the network + +#### Returns + +- `sdk`: The raw SDK instance +- `isInitialized`: Boolean indicating if SDK is ready +- `error`: Error message if initialization failed +- `requestE3`: Function to request E3 computation +- `activateE3`: Function to activate E3 environment +- `publishInput`: Function to publish encrypted inputs +- `onEnclaveEvent`: Function to subscribe to events +- `off`: Function to unsubscribe from events +- `EnclaveEventType`: Event type constants +- `RegistryEventType`: Registry event type constants + +## License + +MIT \ No newline at end of file diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json new file mode 100644 index 0000000000..d83f6a470e --- /dev/null +++ b/packages/enclave-react/package.json @@ -0,0 +1,48 @@ +{ + "name": "@gnosis-guild/enclave-react", + "version": "0.1.0", + "description": "React hooks and utilities for Enclave SDK", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "sideEffects": false, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist", + "prepublishOnly": "npm run clean && npm run build" + }, + "keywords": [ + "react", + "hooks", + "enclave", + "encryption", + "fhe", + "e3" + ], + "author": { + "name": "gnosisguild", + "url": "https://github.com/gnosisguild" + }, + "license": "LGPL-3.0-only", + "peerDependencies": { + "react": "^18.2.0", + "wagmi": "^2.14.16", + "viem": "^2.30.6" + }, + "dependencies": { + "@gnosis-guild/enclave": "workspace:*" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "typescript": "^5.8.3" + }, + "repository": { + "type": "git", + "url": "https://github.com/gnosisguild/enclave.git", + "directory": "packages/enclave-react" + } +} \ No newline at end of file diff --git a/packages/enclave-react/src/index.ts b/packages/enclave-react/src/index.ts new file mode 100644 index 0000000000..6fd0f2548c --- /dev/null +++ b/packages/enclave-react/src/index.ts @@ -0,0 +1,26 @@ +/** + * @gnosis-guild/enclave-react + * + * React hooks and utilities for Enclave SDK + */ + +export { useEnclaveSDK } from './useEnclaveSDK'; +export type { UseEnclaveSDKConfig, UseEnclaveSDKReturn } from './useEnclaveSDK'; + +// Re-export commonly used types from the main SDK for convenience +export type { + AllEventTypes, + EventCallback, + EnclaveEvent, + E3RequestedData, + E3ActivatedData, + InputPublishedData, + CiphertextOutputPublishedData, + PlaintextOutputPublishedData, + CiphernodeAddedData, + CiphernodeRemovedData, + CommitteeRequestedData, + CommitteePublishedData +} from '@gnosis-guild/enclave/sdk'; + +export { EnclaveEventType, RegistryEventType } from '@gnosis-guild/enclave/sdk'; \ No newline at end of file diff --git a/packages/enclave-react/src/useEnclaveSDK.ts b/packages/enclave-react/src/useEnclaveSDK.ts new file mode 100644 index 0000000000..c4a9cc5f1f --- /dev/null +++ b/packages/enclave-react/src/useEnclaveSDK.ts @@ -0,0 +1,177 @@ +import { useState, useEffect, useCallback, useRef } from 'react'; +import { useWalletClient, usePublicClient } from 'wagmi'; +import { + EnclaveSDK, + type SDKConfig, + type AllEventTypes, + type EventCallback, + EnclaveEventType, + RegistryEventType, + SDKError +} from '@gnosis-guild/enclave/sdk'; + +export interface UseEnclaveSDKConfig { + contracts?: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + }; + chainId?: number; + autoConnect?: boolean; +} + +export interface UseEnclaveSDKReturn { + sdk: EnclaveSDK | null; + isInitialized: boolean; + error: string | null; + // Contract interaction methods (only the ones commonly used) + requestE3: typeof EnclaveSDK.prototype.requestE3; + activateE3: typeof EnclaveSDK.prototype.activateE3; + publishInput: typeof EnclaveSDK.prototype.publishInput; + // Event handling + onEnclaveEvent: (eventType: T, callback: EventCallback) => void; + off: (eventType: T, callback: EventCallback) => void; + // Event types for convenience + EnclaveEventType: typeof EnclaveEventType; + RegistryEventType: typeof RegistryEventType; +} + +/** + * React hook for interacting with Enclave SDK + * + * @param config Configuration for the SDK initialization + * @returns Object containing SDK instance and helper methods + * + * @example + * ```tsx + * import { useEnclaveSDK } from '@gnosis-guild/enclave-react'; + * + * function MyComponent() { + * const { + * sdk, + * isInitialized, + * error, + * requestE3, + * onEnclaveEvent + * } = useEnclaveSDK({ + * autoConnect: true, + * contracts: { + * enclave: '0x...', + * ciphernodeRegistry: '0x...' + * } + * }); + * + * // Use the SDK... + * } + * ``` + */ +export const useEnclaveSDK = (config: UseEnclaveSDKConfig): UseEnclaveSDKReturn => { + const [sdk, setSdk] = useState(null); + const [isInitialized, setIsInitialized] = useState(false); + const [error, setError] = useState(null); + const sdkRef = useRef(null); + + const publicClient = usePublicClient(); + const { data: walletClient } = useWalletClient(); + + const initializeSDK = useCallback(async () => { + try { + setError(null); + + if (!publicClient) { + throw new Error('Public client not available'); + } + + const sdkConfig: SDKConfig = { + publicClient, + walletClient: walletClient || undefined, + contracts: config.contracts || { + enclave: '0x0000000000000000000000000000000000000000', + ciphernodeRegistry: '0x0000000000000000000000000000000000000000' + }, + chainId: config.chainId + }; + + const newSdk = new EnclaveSDK(sdkConfig); + await newSdk.initialize(); + + setSdk(newSdk); + sdkRef.current = newSdk; + setIsInitialized(true); + } catch (err: unknown) { + const errorMessage = err instanceof SDKError + ? `SDK Error (${err.code}): ${err.message}` + : `Failed to initialize SDK: ${err}`; + setError(errorMessage); + console.error('SDK initialization failed:', err); + } + }, [publicClient, walletClient, config.contracts, config.chainId]); + + // Initialize SDK when wagmi clients are available + useEffect(() => { + if (config.autoConnect && publicClient && !isInitialized) { + initializeSDK(); + } + }, [config.autoConnect, publicClient, isInitialized, initializeSDK]); + + // Re-initialize when wallet client changes (connect/disconnect) + useEffect(() => { + if (isInitialized && publicClient && walletClient) { + initializeSDK(); + } + }, [walletClient, initializeSDK]); + + // Cleanup on unmount + useEffect(() => { + return () => { + if (sdkRef.current) { + sdkRef.current.cleanup(); + } + }; + }, []); + + // Contract interaction methods + const requestE3 = useCallback((...args: Parameters) => { + if (!sdk) throw new Error('SDK not initialized'); + return sdk.requestE3(...args); + }, [sdk]); + + const activateE3 = useCallback((...args: Parameters) => { + if (!sdk) throw new Error('SDK not initialized'); + return sdk.activateE3(...args); + }, [sdk]); + + const publishInput = useCallback((...args: Parameters) => { + if (!sdk) throw new Error('SDK not initialized'); + return sdk.publishInput(...args); + }, [sdk]); + + // Event handling methods + const onEnclaveEvent = useCallback(( + eventType: T, + callback: EventCallback + ) => { + if (!sdk) throw new Error('SDK not initialized'); + return sdk.onEnclaveEvent(eventType, callback); + }, [sdk]); + + const off = useCallback(( + eventType: T, + callback: EventCallback + ) => { + if (!sdk) throw new Error('SDK not initialized'); + return sdk.off(eventType, callback); + }, [sdk]); + + return { + sdk, + isInitialized, + error, + requestE3, + activateE3, + publishInput, + onEnclaveEvent, + off, + EnclaveEventType, + RegistryEventType + }; +}; \ No newline at end of file diff --git a/packages/enclave-react/tsconfig.json b/packages/enclave-react/tsconfig.json new file mode 100644 index 0000000000..f121560a34 --- /dev/null +++ b/packages/enclave-react/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": false, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "declaration": true, + "declarationMap": true, + "outDir": "dist", + "rootDir": "src", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src" + ], + "exclude": [ + "dist", + "node_modules" + ] +} \ No newline at end of file diff --git a/packages/evm/package.json b/packages/evm/package.json index f45fb9aacd..02fb55b5c0 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -10,7 +10,9 @@ "exports": { "./deploy/enclave": "./dist/deploy/enclave.js", "./contracts/*": "./contracts/*", - "./artifacts/*": "./artifacts/*" + "./artifacts/*": "./artifacts/*", + "./sdk": "./dist/src/sdk/index.js", + "./sdk/*": "./dist/src/sdk/*" }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", @@ -100,7 +102,8 @@ }, "dependencies": { "@excubiae/contracts": "^0.4.0", - "solady": "^0.1.13" + "solady": "^0.1.13", + "viem": "^2.30.6" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" } diff --git a/packages/evm/src/sdk/README.md b/packages/evm/src/sdk/README.md new file mode 100644 index 0000000000..1d4a0da4a0 --- /dev/null +++ b/packages/evm/src/sdk/README.md @@ -0,0 +1,315 @@ +# Enclave TypeScript SDK + +A powerful, type-safe TypeScript SDK for interacting with Enclave smart +contracts. This SDK provides real-time event listening, contract interaction +methods, and comprehensive error handling. + +## Features + +- **Event-driven architecture**: Listen to smart contract events in real-time +- **Type-safe**: Built with TypeScript and uses generated types from contracts +- **Easy contract interactions**: Simple methods for reading from and writing to + contracts +- **React integration**: Includes React hooks for easy frontend integration +- **Error handling**: Comprehensive error handling with custom error types +- **Gas estimation**: Built-in gas estimation for transactions +- **Event polling**: Support for both WebSocket and polling-based event + listening + +## Installation + +```bash +pnpm add @gnosis-guild/enclave +``` + +## Quick Start + +```typescript +import { + EnclaveSDK, + EnclaveEventType, + RegistryEventType, +} from "@gnosis-guild/enclave/sdk"; +import { createPublicClient, createWalletClient, http, custom } from "viem"; + +// Initialize clients +const publicClient = createPublicClient({ + transport: http("YOUR_RPC_URL"), +}); + +const walletClient = createWalletClient({ + transport: custom(window.ethereum), +}); + +// Create SDK instance +const sdk = new EnclaveSDK({ + publicClient, + walletClient, + contracts: { + enclave: "0x...", // Your Enclave contract address + ciphernodeRegistry: "0x...", // Your CiphernodeRegistry contract address + }, + chainId: 1, // Optional +}); + +// Initialize the SDK +await sdk.initialize(); + +// Listen to events with the unified event system +sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, (event) => { + console.log("E3 Requested:", event.data); +}); + +sdk.onEnclaveEvent(RegistryEventType.CIPHERNODE_ADDED, (event) => { + console.log("Ciphernode Added:", event.data); +}); + +// Interact with contracts +const hash = await sdk.requestE3({ + filter: "0x...", + threshold: [1, 3], + startWindow: [BigInt(0), BigInt(100)], + duration: BigInt(3600), + e3Program: "0x...", + e3ProgramParams: "0x...", + computeProviderParams: "0x...", +}); +``` + +## Event System + +The SDK uses a unified event system with TypeScript enums for type safety: + +### Enclave Events + +```typescript +enum EnclaveEventType { + // E3 Lifecycle + E3_REQUESTED = "E3Requested", + E3_ACTIVATED = "E3Activated", + INPUT_PUBLISHED = "InputPublished", + CIPHERTEXT_OUTPUT_PUBLISHED = "CiphertextOutputPublished", + PLAINTEXT_OUTPUT_PUBLISHED = "PlaintextOutputPublished", + + // E3 Program Management + E3_PROGRAM_ENABLED = "E3ProgramEnabled", + E3_PROGRAM_DISABLED = "E3ProgramDisabled", + + // Configuration + CIPHERNODE_REGISTRY_SET = "CiphernodeRegistrySet", + MAX_DURATION_SET = "MaxDurationSet", + // ... more events +} +``` + +### Registry Events + +```typescript +enum RegistryEventType { + CIPHERNODE_ADDED = "CiphernodeAdded", + CIPHERNODE_REMOVED = "CiphernodeRemoved", + COMMITTEE_REQUESTED = "CommitteeRequested", + COMMITTEE_PUBLISHED = "CommitteePublished", + ENCLAVE_SET = "EnclaveSet", + // ... more events +} +``` + +### Event Data Structure + +Each event follows a consistent structure: + +```typescript +interface EnclaveEvent { + type: T; + data: EventData[T]; // Typed based on event type + log: Log; // Raw viem log + timestamp: Date; + blockNumber: bigint; + transactionHash: string; +} +``` + +## React Integration + +The SDK includes a React hook for easy integration: + +```typescript +import { useEnclaveSDK } from '@gnosis-guild/enclave/sdk'; + +function MyComponent() { + const { + sdk, + isInitialized, + isConnecting, + error, + connectWallet, + requestE3, + onEnclaveEvent, + EnclaveEventType + } = useEnclaveSDK({ + contracts: { + enclave: '0x...', + ciphernodeRegistry: '0x...' + }, + rpcUrl: 'YOUR_RPC_URL', + autoConnect: true + }); + + useEffect(() => { + if (isInitialized) { + onEnclaveEvent(EnclaveEventType.E3_REQUESTED, (event) => { + console.log('New E3 request:', event); + }); + } + }, [isInitialized]); + + return ( +
+ {!isInitialized && ( + + )} + {/* Your UI */} +
+ ); +} +``` + +## API Reference + +### Core Methods + +#### Contract Interactions + +```typescript +// Request a new E3 computation +await sdk.requestE3({ + filter: `0x${string}`, + threshold: [number, number], + startWindow: [bigint, bigint], + duration: bigint, + e3Program: `0x${string}`, + e3ProgramParams: `0x${string}`, + computeProviderParams: `0x${string}`, + value?: bigint, + gasLimit?: bigint +}); + +// Activate an E3 computation +await sdk.activateE3(e3Id: bigint, publicKey: `0x${string}`, gasLimit?: bigint); + +// Publish input data +await sdk.publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint); + +// Read operations +const e3Data = await sdk.getE3(e3Id: bigint); +``` + +#### Event Handling + +```typescript +sdk.onEnclaveEvent(eventType: AllEventTypes, callback: EventCallback); + +sdk.off(eventType: AllEventTypes, callback: EventCallback); + +const logs = await sdk.getHistoricalEvents( + eventType: AllEventTypes, + fromBlock?: bigint, + toBlock?: bigint +); + +// Event polling (if websockets unavailable) +await sdk.startEventPolling(); +sdk.stopEventPolling(); +``` + +#### Utilities + +```typescript +// Gas estimation +const gas = await sdk.estimateGas(functionName, args, contractAddress, abi, value?); + +// Transaction waiting +const receipt = await sdk.waitForTransaction(hash); + +// Configuration updates +sdk.updateConfig(newConfig: Partial); + +// Cleanup +sdk.cleanup(); +``` + +## Configuration + +```typescript +interface SDKConfig { + publicClient: PublicClient; + walletClient?: WalletClient; + contracts: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + }; + chainId?: number; +} +``` + +## Error Handling + +The SDK includes comprehensive error handling: + +```typescript +import { SDKError } from "@gnosis-guild/enclave/sdk"; + +try { + await sdk.requestE3(params); +} catch (error) { + if (error instanceof SDKError) { + console.error(`SDK Error (${error.code}): ${error.message}`); + } else { + console.error("Unexpected error:", error); + } +} +``` + +## Development + +### Building the SDK + +```bash +cd packages/evm +pnpm compile +``` + +### Running the Demo + +```bash +cd examples/basic/client +pnpm install +pnpm dev +``` + +The demo showcases all SDK features including real-time event listening and +contract interactions. + +### Testing + +```bash +cd packages/evm +pnpm test +``` + +## Architecture + +The SDK consists of several key components: + +- **EnclaveSDK**: Main orchestrator class +- **ContractClient**: Handles contract read/write operations +- **EventListener**: Manages real-time event listening +- **Types**: TypeScript definitions with full type safety +- **Utils**: Helper functions and error classes + +## License + +This project is licensed under the MIT License. diff --git a/packages/evm/src/sdk/contract-client.ts b/packages/evm/src/sdk/contract-client.ts new file mode 100644 index 0000000000..ead58990d7 --- /dev/null +++ b/packages/evm/src/sdk/contract-client.ts @@ -0,0 +1,302 @@ +import { + Abi, + Hash, + PublicClient, + TransactionReceipt, + WalletClient, +} from "viem"; + +import { + CiphernodeRegistryOwnable__factory, + Enclave__factory, +} from "../../types"; +import { SDKError, isValidAddress } from "./utils"; + +export class ContractClient { + private contractInfo: { + enclave: { address: `0x${string}`; abi: Abi }; + ciphernodeRegistry: { address: `0x${string}`; abi: Abi }; + } | null = null; + + constructor( + private publicClient: PublicClient, + private walletClient?: WalletClient, + private addresses: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + } = { + enclave: "0x0000000000000000000000000000000000000000", + ciphernodeRegistry: "0x0000000000000000000000000000000000000000", + }, + ) { + if (!isValidAddress(addresses.enclave)) { + throw new SDKError("Invalid Enclave contract address", "INVALID_ADDRESS"); + } + if (!isValidAddress(addresses.ciphernodeRegistry)) { + throw new SDKError( + "Invalid CiphernodeRegistry contract address", + "INVALID_ADDRESS", + ); + } + } + + /** + * Initialize contract instances + */ + public async initialize(): Promise { + try { + this.contractInfo = { + enclave: { + address: this.addresses.enclave, + abi: Enclave__factory.abi, + }, + ciphernodeRegistry: { + address: this.addresses.ciphernodeRegistry, + abi: CiphernodeRegistryOwnable__factory.abi, + }, + }; + } catch (error) { + throw new SDKError( + `Failed to initialize contracts: ${error}`, + "INITIALIZATION_FAILED", + ); + } + } + + /** + * Request a new E3 computation + * request(address filter, uint32[2] threshold, uint256[2] startWindow, uint256 duration, IE3Program e3Program, bytes e3ProgramParams, bytes computeProviderParams) + */ + public async requestE3( + filter: `0x${string}`, + threshold: [number, number], + startWindow: [bigint, bigint], + duration: bigint, + e3Program: `0x${string}`, + e3ProgramParams: `0x${string}`, + computeProviderParams: `0x${string}`, + value?: bigint, + gasLimit?: bigint, + ): Promise { + if (!this.walletClient) { + throw new SDKError( + "Wallet client required for write operations", + "NO_WALLET", + ); + } + + if (!this.contractInfo) { + await this.initialize(); + } + + try { + const account = this.walletClient.account; + if (!account) { + throw new SDKError("No account connected", "NO_ACCOUNT"); + } + + // Simulate transaction + const { request } = await this.publicClient.simulateContract({ + address: this.addresses.enclave, + abi: Enclave__factory.abi, + functionName: "request", + args: [ + filter, + threshold, + startWindow, + duration, + e3Program, + e3ProgramParams, + computeProviderParams, + ], + account, + value: value || BigInt(0), + gas: gasLimit, + }); + + // Execute transaction + const hash = await this.walletClient.writeContract(request); + + return hash; + } catch (error) { + throw new SDKError(`Failed to request E3: ${error}`, "REQUEST_E3_FAILED"); + } + } + + /** + * Activate an E3 computation + * activate(uint256 e3Id, bytes memory publicKey) + */ + public async activateE3( + e3Id: bigint, + publicKey: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.walletClient) { + throw new SDKError( + "Wallet client required for write operations", + "NO_WALLET", + ); + } + + if (!this.contractInfo) { + await this.initialize(); + } + + try { + const account = this.walletClient.account; + if (!account) { + throw new SDKError("No account connected", "NO_ACCOUNT"); + } + + const { request } = await this.publicClient.simulateContract({ + address: this.addresses.enclave, + abi: Enclave__factory.abi, + functionName: "activate", + args: [e3Id, publicKey], + account, + gas: gasLimit, + }); + + const hash = await this.walletClient.writeContract(request); + + return hash; + } catch (error) { + throw new SDKError( + `Failed to activate E3: ${error}`, + "ACTIVATE_E3_FAILED", + ); + } + } + + /** + * Publish input for an E3 computation + * publishInput(uint256 e3Id, bytes memory data) + */ + public async publishInput( + e3Id: bigint, + data: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.walletClient) { + throw new SDKError( + "Wallet client required for write operations", + "NO_WALLET", + ); + } + + if (!this.contractInfo) { + await this.initialize(); + } + + try { + const account = this.walletClient.account; + if (!account) { + throw new SDKError("No account connected", "NO_ACCOUNT"); + } + + const { request } = await this.publicClient.simulateContract({ + address: this.addresses.enclave, + abi: Enclave__factory.abi, + functionName: "publishInput", + args: [e3Id, data], + account, + gas: gasLimit, + }); + + const hash = await this.walletClient.writeContract(request); + + return hash; + } catch (error) { + throw new SDKError( + `Failed to publish input: ${error}`, + "PUBLISH_INPUT_FAILED", + ); + } + } + + /** + * Get E3 information + * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3) + */ + public async getE3(e3Id: bigint): Promise { + if (!this.contractInfo) { + await this.initialize(); + } + + try { + const result = await this.publicClient.readContract({ + address: this.addresses.enclave, + abi: Enclave__factory.abi, + functionName: "getE3", + args: [e3Id], + }); + + return result; + } catch (error) { + throw new SDKError(`Failed to get E3: ${error}`, "GET_E3_FAILED"); + } + } + + /** + * Estimate gas for a transaction + */ + public async estimateGas( + functionName: string, + args: readonly unknown[], + contractAddress: `0x${string}`, + abi: Abi, + value?: bigint, + ): Promise { + if (!this.walletClient) { + throw new SDKError( + "Wallet client required for gas estimation", + "NO_WALLET", + ); + } + + try { + const account = this.walletClient.account; + if (!account) { + throw new SDKError("No account connected", "NO_ACCOUNT"); + } + + const estimateParams = { + address: contractAddress, + abi, + functionName, + args, + account, + ...(value !== undefined && { value }), + }; + + const gas = await this.publicClient.estimateContractGas(estimateParams); + + return gas; + } catch (error) { + throw new SDKError( + `Failed to estimate gas: ${error}`, + "GAS_ESTIMATION_FAILED", + ); + } + } + + /** + * Wait for transaction confirmation + */ + public async waitForTransaction(hash: Hash): Promise { + try { + const receipt = await this.publicClient.waitForTransactionReceipt({ + hash, + confirmations: 1, + }); + + return receipt; + } catch (error) { + throw new SDKError( + `Failed to wait for transaction: ${error}`, + "TRANSACTION_WAIT_FAILED", + ); + } + } +} diff --git a/packages/evm/src/sdk/enclave-sdk.ts b/packages/evm/src/sdk/enclave-sdk.ts new file mode 100644 index 0000000000..b5da1f00a9 --- /dev/null +++ b/packages/evm/src/sdk/enclave-sdk.ts @@ -0,0 +1,282 @@ +import { type Abi, type Hash, type Log } from "viem"; + +import { + CiphernodeRegistryOwnable__factory, + Enclave__factory, +} from "../../types"; +import { ContractClient } from "./contract-client"; +import { EventListener } from "./event-listener"; +import { + type AllEventTypes, + EnclaveEventType, + type EventCallback, + type SDKConfig, +} from "./types"; +import { SDKError, isValidAddress } from "./utils"; + +export class EnclaveSDK { + private eventListener: EventListener; + private contractClient: ContractClient; + private initialized = false; + + constructor(private config: SDKConfig) { + if (!config.publicClient) { + throw new SDKError("Public client is required", "MISSING_PUBLIC_CLIENT"); + } + + if (!isValidAddress(config.contracts.enclave)) { + throw new SDKError("Invalid Enclave contract address", "INVALID_ADDRESS"); + } + + if (!isValidAddress(config.contracts.ciphernodeRegistry)) { + throw new SDKError( + "Invalid CiphernodeRegistry contract address", + "INVALID_ADDRESS", + ); + } + + this.eventListener = new EventListener(config.publicClient); + this.contractClient = new ContractClient( + config.publicClient, + config.walletClient, + config.contracts, + ); + } + + /** + * Initialize the SDK + */ + public async initialize(): Promise { + if (this.initialized) return; + + try { + await this.contractClient.initialize(); + this.initialized = true; + } catch (error) { + throw new SDKError( + `Failed to initialize SDK: ${error}`, + "SDK_INITIALIZATION_FAILED", + ); + } + } + + /** + * Request a new E3 computation + */ + public async requestE3(params: { + filter: `0x${string}`; + threshold: [number, number]; + startWindow: [bigint, bigint]; + duration: bigint; + e3Program: `0x${string}`; + e3ProgramParams: `0x${string}`; + computeProviderParams: `0x${string}`; + value?: bigint; + gasLimit?: bigint; + }): Promise { + if (!this.initialized) { + await this.initialize(); + } + + return this.contractClient.requestE3( + params.filter, + params.threshold, + params.startWindow, + params.duration, + params.e3Program, + params.e3ProgramParams, + params.computeProviderParams, + params.value, + params.gasLimit, + ); + } + + /** + * Activate an E3 computation + */ + public async activateE3( + e3Id: bigint, + publicKey: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.initialized) { + await this.initialize(); + } + + return this.contractClient.activateE3(e3Id, publicKey, gasLimit); + } + + /** + * Publish input for an E3 computation + */ + public async publishInput( + e3Id: bigint, + data: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.initialized) { + await this.initialize(); + } + + return this.contractClient.publishInput(e3Id, data, gasLimit); + } + + /** + * Get E3 information + */ + public async getE3(e3Id: bigint): Promise { + if (!this.initialized) { + await this.initialize(); + } + + return this.contractClient.getE3(e3Id); + } + + /** + * Unified Event Listening - Listen to any Enclave or Registry event + */ + public onEnclaveEvent( + eventType: T, + callback: EventCallback, + ): void { + // Determine which contract to listen to based on event type + const isEnclaveEvent = Object.values(EnclaveEventType).includes( + eventType as EnclaveEventType, + ); + const contractAddress = isEnclaveEvent + ? this.config.contracts.enclave + : this.config.contracts.ciphernodeRegistry; + const abi = isEnclaveEvent + ? Enclave__factory.abi + : CiphernodeRegistryOwnable__factory.abi; + + void this.eventListener.watchContractEvent( + contractAddress, + eventType, + abi, + callback, + ); + } + + /** + * Remove event listener + */ + public off( + eventType: T, + callback: EventCallback, + ): void { + this.eventListener.off(eventType, callback); + } + + /** + * Get historical events + */ + public async getHistoricalEvents( + eventType: AllEventTypes, + fromBlock?: bigint, + toBlock?: bigint, + ): Promise { + const isEnclaveEvent = Object.values(EnclaveEventType).includes( + eventType as EnclaveEventType, + ); + const contractAddress = isEnclaveEvent + ? this.config.contracts.enclave + : this.config.contracts.ciphernodeRegistry; + const abi = isEnclaveEvent + ? Enclave__factory.abi + : CiphernodeRegistryOwnable__factory.abi; + + return this.eventListener.getHistoricalEvents( + contractAddress, + eventType, + abi, + fromBlock, + toBlock, + ); + } + + /** + * Start polling for events + */ + public async startEventPolling(): Promise { + void this.eventListener.startPolling(); + } + + /** + * Stop polling for events + */ + public stopEventPolling(): void { + this.eventListener.stopPolling(); + } + + /** + * Utility methods + */ + + /** + * Estimate gas for a transaction + */ + public async estimateGas( + functionName: string, + args: readonly unknown[], + contractAddress: `0x${string}`, + abi: Abi, + value?: bigint, + ): Promise { + return this.contractClient.estimateGas( + functionName, + args, + contractAddress, + abi, + value, + ); + } + + /** + * Wait for transaction confirmation + */ + public async waitForTransaction(hash: Hash): Promise { + return this.contractClient.waitForTransaction(hash); + } + + /** + * Clean up resources + */ + public cleanup(): void { + this.eventListener.cleanup(); + } + + /** + * Update SDK configuration + */ + public updateConfig(newConfig: Partial): void { + if (newConfig.publicClient) { + this.config.publicClient = newConfig.publicClient; + this.eventListener = new EventListener(newConfig.publicClient); + } + + if (newConfig.walletClient) { + this.config.walletClient = newConfig.walletClient; + } + + if (newConfig.contracts) { + this.config.contracts = { + ...this.config.contracts, + ...newConfig.contracts, + }; + } + + if (newConfig.chainId) { + this.config.chainId = newConfig.chainId; + } + + // Reinitialize contract client with new config + this.contractClient = new ContractClient( + this.config.publicClient, + this.config.walletClient, + this.config.contracts, + ); + + this.initialized = false; + } +} diff --git a/packages/evm/src/sdk/event-listener.ts b/packages/evm/src/sdk/event-listener.ts new file mode 100644 index 0000000000..2de1215a73 --- /dev/null +++ b/packages/evm/src/sdk/event-listener.ts @@ -0,0 +1,256 @@ +import { type Abi, type Log, type PublicClient } from "viem"; + +import { + type AllEventTypes, + type EnclaveEvent, + type EnclaveEventData, + type EnclaveEventType, + type EventCallback, + type EventListenerConfig, + type RegistryEventData, + type RegistryEventType, + type SDKEventEmitter, +} from "./types"; +import { SDKError, sleep } from "./utils"; + +export class EventListener implements SDKEventEmitter { + private listeners: Map> = new Map(); + private activeWatchers: Map void> = new Map(); + private isPolling = false; + private lastBlockNumber: bigint = BigInt(0); + + constructor( + private publicClient: PublicClient, + private config: EventListenerConfig = {}, + ) {} + + /** + * Listen to specific contract events + */ + public async watchContractEvent( + address: `0x${string}`, + eventType: T, + abi: Abi, + callback: EventCallback, + ): Promise { + const watcherKey = `${address}:${eventType}`; + + if (!this.listeners.has(eventType)) { + this.listeners.set(eventType, new Set()); + } + + this.listeners.get(eventType)!.add(callback as EventCallback); + + // If we don't have an active watcher for this event, create one + if (!this.activeWatchers.has(watcherKey)) { + try { + const unwatch = this.publicClient.watchContractEvent({ + address, + abi, + eventName: eventType as string, + fromBlock: this.config.fromBlock, + onLogs: (logs: Log[]) => { + logs.forEach((log: Log) => { + const event: EnclaveEvent = { + type: eventType, + data: (log as unknown as { args: unknown }) + .args as T extends EnclaveEventType + ? EnclaveEventData[T] + : T extends RegistryEventType + ? RegistryEventData[T] + : unknown, + log, + timestamp: new Date(), + blockNumber: log.blockNumber ?? BigInt(0), + transactionHash: log.transactionHash ?? "0x", + }; + this.emit(event); + }); + }, + }); + + this.activeWatchers.set(watcherKey, unwatch); + } catch (error) { + throw new SDKError( + `Failed to watch contract event ${eventType} on ${address}: ${error}`, + "WATCH_EVENT_FAILED", + ); + } + } + } + + /** + * Listen to all logs from a specific address + */ + public async watchLogs( + address: `0x${string}`, + callback: (log: Log) => void, + ): Promise { + const watcherKey = `logs:${address}`; + + if (!this.activeWatchers.has(watcherKey)) { + try { + const unwatch = this.publicClient.watchEvent({ + address, + onLogs: (logs: Log[]) => { + logs.forEach((log: Log) => { + callback(log); + }); + }, + }); + + this.activeWatchers.set(watcherKey, unwatch); + } catch (error) { + throw new SDKError( + `Failed to watch logs for address ${address}: ${error}`, + "WATCH_LOGS_FAILED", + ); + } + } + } + + /** + * Start polling for historical events + */ + public async startPolling(): Promise { + if (this.isPolling) return; + + this.isPolling = true; + + try { + this.lastBlockNumber = await this.publicClient.getBlockNumber(); + + void this.pollForEvents(); + } catch (error) { + this.isPolling = false; + throw new SDKError( + `Failed to start polling: ${error}`, + "POLLING_START_FAILED", + ); + } + } + + /** + * Stop polling for events + */ + public stopPolling(): void { + this.isPolling = false; + } + + /** + * Get historical events + */ + public async getHistoricalEvents( + address: `0x${string}`, + eventType: AllEventTypes, + abi: Abi, + fromBlock?: bigint, + toBlock?: bigint, + ): Promise { + try { + const logs = await this.publicClient.getContractEvents({ + address, + abi, + eventName: eventType as string, + fromBlock: fromBlock || this.config.fromBlock, + toBlock: toBlock || this.config.toBlock, + }); + + return logs; + } catch (error) { + throw new SDKError( + `Failed to get historical events: ${error}`, + "HISTORICAL_EVENTS_FAILED", + ); + } + } + + /** + * SDKEventEmitter implementation + */ + public on( + eventType: T, + callback: EventCallback, + ): void { + if (!this.listeners.has(eventType)) { + this.listeners.set(eventType, new Set()); + } + this.listeners.get(eventType)!.add(callback as EventCallback); + } + + public off( + eventType: T, + callback: EventCallback, + ): void { + const callbacks = this.listeners.get(eventType); + if (callbacks) { + callbacks.delete(callback as EventCallback); + if (callbacks.size === 0) { + this.listeners.delete(eventType); + // Find and stop corresponding watchers + const watchersToRemove: string[] = []; + this.activeWatchers.forEach((unwatch, key) => { + if (key.endsWith(`:${eventType}`)) { + try { + unwatch(); + } catch (error) { + console.error(`Error unwatching event ${eventType}:`, error); + } + watchersToRemove.push(key); + } + }); + watchersToRemove.forEach((key) => this.activeWatchers.delete(key)); + } + } + } + + public emit(event: EnclaveEvent): void { + const callbacks = this.listeners.get(event.type); + if (callbacks) { + callbacks.forEach((callback) => { + try { + void (callback as EventCallback)(event); + } catch (error) { + console.error(`Error in event callback for ${event.type}:`, error); + } + }); + } + } + + /** + * Clean up all listeners and watchers + */ + public cleanup(): void { + this.stopPolling(); + + // Stop all active watchers + this.activeWatchers.forEach((unwatch) => { + try { + unwatch(); + } catch (error) { + console.error("Error unwatching during cleanup:", error); + } + }); + this.activeWatchers.clear(); + + // Clear all listeners + this.listeners.clear(); + } + + private async pollForEvents(): Promise { + while (this.isPolling) { + try { + const currentBlock = await this.publicClient.getBlockNumber(); + + if (currentBlock > this.lastBlockNumber) { + this.lastBlockNumber = currentBlock; + } + + await sleep(this.config.pollingInterval || 5000); + } catch (error) { + console.error("Error during polling:", error); + await sleep(this.config.pollingInterval || 5000); + } + } + } +} diff --git a/packages/evm/src/sdk/index.ts b/packages/evm/src/sdk/index.ts new file mode 100644 index 0000000000..082676e890 --- /dev/null +++ b/packages/evm/src/sdk/index.ts @@ -0,0 +1,56 @@ +// Main SDK class +export { EnclaveSDK } from "./enclave-sdk"; + +// Core classes +export { EventListener } from "./event-listener"; +export { ContractClient } from "./contract-client"; + +// Types and interfaces +export type { + SDKConfig, + EventListenerConfig, + ContractInstances, + EventFilter, + EventCallback, + SDKEventEmitter, + AllEventTypes, + EnclaveEvent, + // Event data types + E3RequestedData, + E3ActivatedData, + InputPublishedData, + CiphertextOutputPublishedData, + PlaintextOutputPublishedData, + CiphernodeAddedData, + CiphernodeRemovedData, + CommitteeRequestedData, + CommitteePublishedData, + EnclaveEventData, + RegistryEventData, +} from "./types"; + +// Event enums +export { EnclaveEventType, RegistryEventType } from "./types"; + +// Export utilities +export { + SDKError, + isValidAddress, + isValidHash, + formatEventName, + parseEventData, + formatBigInt, + parseBigInt, + generateEventId, + sleep, + getCurrentTimestamp, + // BFV and E3 utilities + BFV_PARAMS_SET, + DEFAULT_COMPUTE_PROVIDER_PARAMS, + DEFAULT_E3_CONFIG, + encodeBfvParams, + encodeComputeProviderParams, + calculateStartWindow, + decodePlaintextOutput, + type ComputeProviderParams, +} from "./utils"; diff --git a/packages/evm/src/sdk/types.ts b/packages/evm/src/sdk/types.ts new file mode 100644 index 0000000000..6cac260a61 --- /dev/null +++ b/packages/evm/src/sdk/types.ts @@ -0,0 +1,209 @@ +import { type Log } from "viem"; +import { type PublicClient, type WalletClient } from "viem"; + +import { + type CiphernodeRegistryOwnable, + type Enclave, + type MockCiphernodeRegistry, +} from "../../types"; + +export interface SDKConfig { + publicClient: PublicClient; + walletClient?: WalletClient; + contracts: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + }; + chainId?: number; +} + +export interface EventListenerConfig { + fromBlock?: bigint; + toBlock?: bigint; + polling?: boolean; + pollingInterval?: number; +} + +export interface ContractInstances { + enclave: Enclave; + ciphernodeRegistry: CiphernodeRegistryOwnable | MockCiphernodeRegistry; +} + +// Unified Event System +export enum EnclaveEventType { + // E3 Lifecycle Events + E3_REQUESTED = "E3Requested", + E3_ACTIVATED = "E3Activated", + INPUT_PUBLISHED = "InputPublished", + CIPHERTEXT_OUTPUT_PUBLISHED = "CiphertextOutputPublished", + PLAINTEXT_OUTPUT_PUBLISHED = "PlaintextOutputPublished", + + // E3 Program Management + E3_PROGRAM_ENABLED = "E3ProgramEnabled", + E3_PROGRAM_DISABLED = "E3ProgramDisabled", + + // Encryption Scheme Management + ENCRYPTION_SCHEME_ENABLED = "EncryptionSchemeEnabled", + ENCRYPTION_SCHEME_DISABLED = "EncryptionSchemeDisabled", + + // Configuration + CIPHERNODE_REGISTRY_SET = "CiphernodeRegistrySet", + MAX_DURATION_SET = "MaxDurationSet", + ALLOWED_E3_PROGRAMS_PARAMS_SET = "AllowedE3ProgramsParamsSet", + + // Ownership + OWNERSHIP_TRANSFERRED = "OwnershipTransferred", + INITIALIZED = "Initialized", +} + +export enum RegistryEventType { + // Committee Management + COMMITTEE_REQUESTED = "CommitteeRequested", + COMMITTEE_PUBLISHED = "CommitteePublished", + + // Configuration + ENCLAVE_SET = "EnclaveSet", + + // Ownership + OWNERSHIP_TRANSFERRED = "OwnershipTransferred", + INITIALIZED = "Initialized", +} + +// Union type for all events +export type AllEventTypes = EnclaveEventType | RegistryEventType; + +// Event data interfaces based on TypeChain types +export interface E3RequestedData { + e3Id: bigint; + e3: { + seed: bigint; + threshold: [bigint, bigint]; + requestBlock: bigint; + startWindow: [bigint, bigint]; + duration: bigint; + expiration: bigint; + encryptionSchemeId: string; + e3Program: string; + e3ProgramParams: string; + inputValidator: string; + decryptionVerifier: string; + committeePublicKey: string; + ciphertextOutput: string; + plaintextOutput: string; + }; + filter: string; + e3Program: string; +} + +export interface E3ActivatedData { + e3Id: bigint; + expiration: bigint; + committeePublicKey: string; +} + +export interface InputPublishedData { + e3Id: bigint; + data: string; + inputHash: bigint; + index: bigint; +} + +export interface CiphertextOutputPublishedData { + e3Id: bigint; + ciphertextOutput: string; +} + +export interface PlaintextOutputPublishedData { + e3Id: bigint; + plaintextOutput: string; +} + +export interface CiphernodeAddedData { + node: string; + index: bigint; + numNodes: bigint; + size: bigint; +} + +export interface CiphernodeRemovedData { + node: string; + index: bigint; + numNodes: bigint; + size: bigint; +} + +export interface CommitteeRequestedData { + e3Id: bigint; + filter: string; + threshold: [bigint, bigint]; +} + +export interface CommitteePublishedData { + e3Id: bigint; + publicKey: string; +} + +// Event data mapping +export interface EnclaveEventData { + [EnclaveEventType.E3_REQUESTED]: E3RequestedData; + [EnclaveEventType.E3_ACTIVATED]: E3ActivatedData; + [EnclaveEventType.INPUT_PUBLISHED]: InputPublishedData; + [EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData; + [EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData; + [EnclaveEventType.E3_PROGRAM_ENABLED]: { e3Program: string }; + [EnclaveEventType.E3_PROGRAM_DISABLED]: { e3Program: string }; + [EnclaveEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }; + [EnclaveEventType.ENCRYPTION_SCHEME_DISABLED]: { encryptionSchemeId: string }; + [EnclaveEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }; + [EnclaveEventType.MAX_DURATION_SET]: { maxDuration: bigint }; + [EnclaveEventType.ALLOWED_E3_PROGRAMS_PARAMS_SET]: { + e3ProgramParams: string[]; + }; + [EnclaveEventType.OWNERSHIP_TRANSFERRED]: { + previousOwner: string; + newOwner: string; + }; + [EnclaveEventType.INITIALIZED]: { version: bigint }; +} + +export interface RegistryEventData { + [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData; + [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData; + [RegistryEventType.ENCLAVE_SET]: { enclave: string }; + [RegistryEventType.OWNERSHIP_TRANSFERRED]: { + previousOwner: string; + newOwner: string; + }; + [RegistryEventType.INITIALIZED]: { version: bigint }; +} + +// Generic event structure +export interface EnclaveEvent { + type: T; + data: T extends EnclaveEventType + ? EnclaveEventData[T] + : T extends RegistryEventType + ? RegistryEventData[T] + : unknown; + log: Log; + timestamp: Date; + blockNumber: bigint; + transactionHash: string; +} + +export type EventCallback = ( + event: EnclaveEvent, +) => void | Promise; + +export interface EventFilter { + address?: `0x${string}`; + fromBlock?: bigint; + toBlock?: bigint; + args?: Partial; +} + +export interface SDKEventEmitter { + on(eventType: T, callback: EventCallback): void; + off(eventType: T, callback: EventCallback): void; + emit(event: EnclaveEvent): void; +} diff --git a/packages/evm/src/sdk/utils.ts b/packages/evm/src/sdk/utils.ts new file mode 100644 index 0000000000..02edbbf25a --- /dev/null +++ b/packages/evm/src/sdk/utils.ts @@ -0,0 +1,171 @@ +import { type Address, type Hash, type Log, encodeAbiParameters } from "viem"; + +export class SDKError extends Error { + constructor( + message: string, + public readonly code?: string, + ) { + super(message); + this.name = "SDKError"; + } +} + +export function isValidAddress(address: string): address is Address { + return /^0x[a-fA-F0-9]{40}$/.test(address); +} + +export function isValidHash(hash: string): hash is Hash { + return /^0x[a-fA-F0-9]{64}$/.test(hash); +} + +export function formatEventName( + contractName: string, + eventName: string, +): string { + return `${contractName}.${eventName}`; +} + +export function parseEventData(log: Log): T { + return log.data as unknown as T; +} + +/** + * Sleep for a specified number of milliseconds + */ +export const sleep = (ms: number): Promise => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; + +export function formatBigInt(value: bigint): string { + return value.toString(); +} + +export function parseBigInt(value: string): bigint { + return BigInt(value); +} + +export function generateEventId(log: Log): string { + return `${log.blockHash}-${log.logIndex}`; +} + +/** + * Get the current timestamp in seconds + */ +export function getCurrentTimestamp(): number { + return Math.floor(Date.now() / 1000); +} + +// BFV parameter set matching the Rust SET_2048_1032193_1 configuration +export const BFV_PARAMS_SET = { + degree: 2048, + plaintext_modulus: 1032193, + moduli: [0x3fffffff000001n], // BigInt for the modulus +} as const; + +// Compute provider parameters structure +export interface ComputeProviderParams { + name: string; + parallel: boolean; + batch_size: number; +} + +// Default compute provider configuration +export const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = { + name: "risc0", + parallel: false, + batch_size: 2, +}; + +// Default E3 configuration +export const DEFAULT_E3_CONFIG = { + threshold_min: 2, + threshold_max: 3, + window_size: 120, // 2 minutes in seconds + duration: 1800, // 30 minutes in seconds + payment_amount: "0", // 0 ETH in wei +} as const; + +/** + * Encode BFV parameters for the smart contract + * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption + */ +export function encodeBfvParams( + degree: number = BFV_PARAMS_SET.degree, + plaintext_modulus: number = BFV_PARAMS_SET.plaintext_modulus, + moduli: readonly bigint[] = BFV_PARAMS_SET.moduli, +): `0x${string}` { + return encodeAbiParameters( + [ + { + name: "bfvParams", + type: "tuple", + components: [ + { name: "degree", type: "uint256" }, + { name: "plaintext_modulus", type: "uint256" }, + { name: "moduli", type: "uint256[]" }, + ], + }, + ], + [ + { + degree: BigInt(degree), + plaintext_modulus: BigInt(plaintext_modulus), + moduli: [...moduli], + }, + ], + ); +} + +/** + * Encode compute provider parameters for the smart contract + */ +export function encodeComputeProviderParams( + params: ComputeProviderParams, +): `0x${string}` { + const jsonString = JSON.stringify(params); + const encoder = new TextEncoder(); + const bytes = encoder.encode(jsonString); + + return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("")}`; +} + +/** + * Calculate start window for E3 request + */ +export function calculateStartWindow( + windowSize: number = DEFAULT_E3_CONFIG.window_size, +): [bigint, bigint] { + const now = getCurrentTimestamp(); + return [BigInt(now), BigInt(now + windowSize)]; +} + +/** + * Decode plaintextOutput bytes to get the actual result number + */ +export function decodePlaintextOutput(plaintextOutput: string): number | null { + try { + // Remove '0x' prefix if present + const hex = plaintextOutput.startsWith("0x") + ? plaintextOutput.slice(2) + : plaintextOutput; + + // Convert hex to bytes + const bytes = new Uint8Array( + hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [], + ); + + if (bytes.length < 8) { + console.warn("Plaintext output too short for u64 decoding"); + return null; + } + + // Decode first u64 (8 bytes) as little-endian + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + const result = view.getBigUint64(0, true); // true for little-endian + + return Number(result); + } catch (error) { + console.error("Failed to decode plaintext output:", error); + return null; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dc58d4118..2c6f5de8fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,28 +72,28 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 - version: 1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.5 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(bcfa0a3510ae60f54adff38812306c62) + version: 5.0.0(21c4d7a5429e39aca71bda0cc08815c6) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.5 version: 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -102,13 +102,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -120,22 +120,22 @@ importers: version: 9.1.2 hardhat: specifier: ^2.22.10 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.4 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) playwright: specifier: 1.52.0 version: 1.52.0 solidity-coverage: specifier: ^0.8.1 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) @@ -174,13 +174,13 @@ importers: version: 8.1.0(rollup@4.41.1)(typescript@5.8.3) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.80.3(react@18.3.1) + version: 5.80.5(react@18.3.1) axios: specifier: ^1.6.8 version: 1.9.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) ethers: specifier: ^6.12.0 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -213,11 +213,11 @@ importers: version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -262,7 +262,7 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) typescript: specifier: ^5.2.2 version: 5.8.3 @@ -280,25 +280,25 @@ importers: version: link:../../packages/evm '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(4447ac0103a459a797e604510b0e5af8) + version: 5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 @@ -307,7 +307,7 @@ importers: version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -334,19 +334,19 @@ importers: version: 5.1.0 hardhat: specifier: ^2.14.0 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) @@ -359,18 +359,24 @@ importers: examples/basic/client: dependencies: + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../../../packages/evm + '@gnosis-guild/enclave-react': + specifier: workspace:* + version: link:../../../packages/enclave-react '@phosphor-icons/react': specifier: ^2.1.4 version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.80.3(react@18.3.1) + version: 5.80.5(react@18.3.1) '@wagmi/core': specifier: ^2.14.16 - version: 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + version: 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) react: specifier: ^18.2.0 version: 18.3.1 @@ -382,11 +388,11 @@ importers: version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -422,7 +428,7 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) typescript: specifier: ^5.2.2 version: 5.8.3 @@ -439,6 +445,28 @@ importers: specifier: ^4.3.2 version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) + packages/enclave-react: + dependencies: + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../evm + react: + specifier: ^18.2.0 + version: 18.3.1 + viem: + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: + specifier: ^2.14.16 + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + devDependencies: + '@types/react': + specifier: ^18.2.0 + version: 18.3.23 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + packages/evm: dependencies: '@excubiae/contracts': @@ -447,22 +475,25 @@ importers: solady: specifier: ^0.1.13 version: 0.1.19 + viem: + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(c9628f5d47e1b74ed759ca13ebe35860) + version: 4.0.0(8fa82fbb3ce2b604cbb19f7a657031e8) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.3.0 @@ -477,7 +508,7 @@ importers: version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -525,13 +556,13 @@ importers: version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -561,13 +592,13 @@ importers: version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3) solidity-coverage: specifier: ^0.8.5 - version: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.3) @@ -713,8 +744,8 @@ packages: resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.4': - resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} '@babel/parser@7.27.5': @@ -1159,8 +1190,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.4': - resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': @@ -1179,8 +1210,8 @@ packages: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.3': - resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -2914,68 +2945,68 @@ packages: resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==} engines: {node: '>=14'} - '@swc/core-darwin-arm64@1.11.29': - resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} + '@swc/core-darwin-arm64@1.11.31': + resolution: {integrity: sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.29': - resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} + '@swc/core-darwin-x64@1.11.31': + resolution: {integrity: sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.29': - resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} + '@swc/core-linux-arm-gnueabihf@1.11.31': + resolution: {integrity: sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.29': - resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} + '@swc/core-linux-arm64-gnu@1.11.31': + resolution: {integrity: sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.29': - resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} + '@swc/core-linux-arm64-musl@1.11.31': + resolution: {integrity: sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.29': - resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} + '@swc/core-linux-x64-gnu@1.11.31': + resolution: {integrity: sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.29': - resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} + '@swc/core-linux-x64-musl@1.11.31': + resolution: {integrity: sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.29': - resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} + '@swc/core-win32-arm64-msvc@1.11.31': + resolution: {integrity: sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.29': - resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} + '@swc/core-win32-ia32-msvc@1.11.31': + resolution: {integrity: sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.29': - resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} + '@swc/core-win32-x64-msvc@1.11.31': + resolution: {integrity: sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.29': - resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} + '@swc/core@1.11.31': + resolution: {integrity: sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -3033,11 +3064,11 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.80.2': - resolution: {integrity: sha512-g2Es97uwFk7omkWiH9JmtLWSA8lTUFVseIyzqbjqJEEx7qN+Hg6jbBdDvelqtakamppaJtGORQ64hEJ5S6ojSg==} + '@tanstack/query-core@5.80.5': + resolution: {integrity: sha512-kFWXdQOUcjL/Ugk3GrI9eMuG3DsKBGaLIgyOLekR2UOrRrJgkLgPUNzZ10i8FCkfi4SgLABhOtQhx1HjoB9EZQ==} - '@tanstack/react-query@5.80.3': - resolution: {integrity: sha512-psqr/QRzYfqJvgD8F2teMO6mL4hN4gzkOra9BlPplNhwByviZIhHUrWTXQEMmUdPWHNkGjA1SP6xG2+brhmIoQ==} + '@tanstack/react-query@5.80.5': + resolution: {integrity: sha512-C0d+pvIahk6fJK5bXxyf36r9Ft6R9O0mwl781CjBrYGRJc76XRJcKhkVpxIo68cjMy3i47gd4O1EGooAke/OCQ==} peerDependencies: react: ^18 || ^19 @@ -4676,8 +4707,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.164: - resolution: {integrity: sha512-TXBrF2aZenRjY3wbj5Yc0mZn43lMiSHNkzwPkIxx+vWUB35Kf8Gm/uOYmOJFNQ7SUwWAinbfxX73ANIud65wSA==} + electron-to-chromium@1.5.165: + resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4994,8 +5025,8 @@ packages: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} - family@0.1.1: - resolution: {integrity: sha512-X9gxkV4fm7U6ftSWcrHmNLfIhwwsvyn2uKEtLVgAGXbm+b+IAxXS1YdBC0HqQfooCZSUnw0vtVQg+eXN+kJAlw==} + family@0.1.2: + resolution: {integrity: sha512-d+GeTctSPP50aHyNgkIXKXwTrQs7OmBlTaeYWXtPReBCX8iassx4oV6nq9bA1uN4zw0KSATdOdFdGUEH0KF5bA==} engines: {node: '>=12.4'} peerDependencies: react: 17.x || 18.x || 19.x @@ -5391,8 +5422,8 @@ packages: peerDependencies: hardhat: ^2.16.0 - hardhat@2.24.1: - resolution: {integrity: sha512-3iwrO2liEGCw1rz/l/mlB1rSNexCc4CFcMj0DlvjXGChzmD3sGUgLwWDOZPf+ya8MEm5ZhO1oprRVmb/wVi0YA==} + hardhat@2.24.2: + resolution: {integrity: sha512-oYt+tcN2379Z3kqIhvVw6IFgWqTm/ixcrTvyAuQdE2RbD+kknwF7hDfUeggy0akrw6xdgCtXvnw9DFrxAB70hA==} hasBin: true peerDependencies: ts-node: '*' @@ -8819,7 +8850,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -8841,13 +8872,13 @@ snapshots: '@babel/generator': 7.27.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.4 + '@babel/helpers': 7.27.6 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8863,14 +8894,14 @@ snapshots: '@babel/generator@7.27.5': dependencies: '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -8888,7 +8919,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -8905,7 +8936,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -8913,50 +8944,43 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': dependencies: '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-plugin-utils@7.27.1': {} @@ -8965,7 +8989,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8974,20 +8998,20 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/helper-string-parser@7.27.1': {} @@ -8998,25 +9022,25 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.4': + '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9043,7 +9067,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9087,14 +9111,14 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: @@ -9133,7 +9157,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9194,7 +9218,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9240,7 +9264,7 @@ snapshots: '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9360,10 +9384,10 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9530,7 +9554,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.27.4)': @@ -9556,13 +9580,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.4': {} + '@babel/runtime@7.27.6': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@babel/traverse@7.23.2': dependencies: @@ -9573,20 +9597,8 @@ snapshots: '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 - debug: 4.4.1(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.27.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.3 - debug: 4.4.1(supports-color@8.1.1) + '@babel/types': 7.27.6 + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9597,7 +9609,7 @@ snapshots: '@babel/generator': 7.27.5 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -9608,7 +9620,7 @@ snapshots: '@babel/helper-validator-identifier': 7.27.1 to-fast-properties: 2.0.0 - '@babel/types@7.27.3': + '@babel/types@7.27.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -9649,10 +9661,11 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -9682,8 +9695,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.27.4 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -9722,7 +9735,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -9977,7 +9990,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10304,7 +10317,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10541,7 +10554,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -10557,7 +10570,7 @@ snapshots: '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.15)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -10565,7 +10578,7 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -10588,7 +10601,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -10601,7 +10614,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10615,7 +10628,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10839,73 +10852,76 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.0 '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10913,15 +10929,15 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -10929,84 +10945,85 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(c9628f5d47e1b74ed759ca13ebe35860)': + '@nomicfoundation/hardhat-toolbox@4.0.0(8fa82fbb3ce2b604cbb19f7a657031e8)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(4447ac0103a459a797e604510b0e5af8)': + '@nomicfoundation/hardhat-toolbox@5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(bcfa0a3510ae60f54adff38812306c62)': + '@nomicfoundation/hardhat-toolbox@5.0.0(21c4d7a5429e39aca71bda0cc08815c6)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -11015,13 +11032,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -11035,7 +11052,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -11721,7 +11738,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': @@ -11759,51 +11776,51 @@ snapshots: - supports-color - typescript - '@swc/core-darwin-arm64@1.11.29': + '@swc/core-darwin-arm64@1.11.31': optional: true - '@swc/core-darwin-x64@1.11.29': + '@swc/core-darwin-x64@1.11.31': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.29': + '@swc/core-linux-arm-gnueabihf@1.11.31': optional: true - '@swc/core-linux-arm64-gnu@1.11.29': + '@swc/core-linux-arm64-gnu@1.11.31': optional: true - '@swc/core-linux-arm64-musl@1.11.29': + '@swc/core-linux-arm64-musl@1.11.31': optional: true - '@swc/core-linux-x64-gnu@1.11.29': + '@swc/core-linux-x64-gnu@1.11.31': optional: true - '@swc/core-linux-x64-musl@1.11.29': + '@swc/core-linux-x64-musl@1.11.31': optional: true - '@swc/core-win32-arm64-msvc@1.11.29': + '@swc/core-win32-arm64-msvc@1.11.31': optional: true - '@swc/core-win32-ia32-msvc@1.11.29': + '@swc/core-win32-ia32-msvc@1.11.31': optional: true - '@swc/core-win32-x64-msvc@1.11.29': + '@swc/core-win32-x64-msvc@1.11.31': optional: true - '@swc/core@1.11.29': + '@swc/core@1.11.31': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.29 - '@swc/core-darwin-x64': 1.11.29 - '@swc/core-linux-arm-gnueabihf': 1.11.29 - '@swc/core-linux-arm64-gnu': 1.11.29 - '@swc/core-linux-arm64-musl': 1.11.29 - '@swc/core-linux-x64-gnu': 1.11.29 - '@swc/core-linux-x64-musl': 1.11.29 - '@swc/core-win32-arm64-msvc': 1.11.29 - '@swc/core-win32-ia32-msvc': 1.11.29 - '@swc/core-win32-x64-msvc': 1.11.29 + '@swc/core-darwin-arm64': 1.11.31 + '@swc/core-darwin-x64': 1.11.31 + '@swc/core-linux-arm-gnueabihf': 1.11.31 + '@swc/core-linux-arm64-gnu': 1.11.31 + '@swc/core-linux-arm64-musl': 1.11.31 + '@swc/core-linux-x64-gnu': 1.11.31 + '@swc/core-linux-x64-musl': 1.11.31 + '@swc/core-win32-arm64-msvc': 1.11.31 + '@swc/core-win32-ia32-msvc': 1.11.31 + '@swc/core-win32-x64-msvc': 1.11.31 '@swc/counter@0.1.3': {} @@ -11816,9 +11833,9 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 @@ -11833,7 +11850,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)': + '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -11844,7 +11861,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + tsup: 8.0.2(@swc/core@1.11.31)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -11861,10 +11878,10 @@ snapshots: dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11881,10 +11898,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -11901,14 +11918,14 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.29)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.29)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -11929,19 +11946,19 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) - '@tanstack/query-core@5.80.2': {} + '@tanstack/query-core@5.80.5': {} - '@tanstack/react-query@5.80.3(react@18.3.1)': + '@tanstack/react-query@5.80.5(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.80.2 + '@tanstack/query-core': 5.80.5 react: 18.3.1 '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -11987,6 +12004,14 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + dependencies: + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11995,19 +12020,20 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': @@ -12017,23 +12043,23 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.6 '@types/bn.js@5.1.6': dependencies: @@ -12237,7 +12263,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12253,7 +12279,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12267,7 +12293,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12319,13 +12345,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': + '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) @@ -12358,13 +12384,13 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': + '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) @@ -12397,14 +12423,14 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.80.2 + '@tanstack/query-core': 5.80.5 typescript: 5.8.3 transitivePeerDependencies: - '@types/react' @@ -12412,14 +12438,14 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.80.2 + '@tanstack/query-core': 5.80.5 typescript: 5.8.3 transitivePeerDependencies: - '@types/react' @@ -13027,7 +13053,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -13200,7 +13226,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -13296,7 +13322,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -13392,7 +13418,7 @@ snapshots: browserslist@4.25.0: dependencies: caniuse-lite: 1.0.30001721 - electron-to-chromium: 1.5.164 + electron-to-chromium: 1.5.165 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) @@ -13729,12 +13755,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): dependencies: - '@tanstack/react-query': 5.80.3(react@18.3.1) + '@tanstack/react-query': 5.80.5(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -13744,17 +13770,17 @@ snapshots: resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) transitivePeerDependencies: - '@babel/core' - react-is - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): dependencies: - '@tanstack/react-query': 5.80.3(react@18.3.1) + '@tanstack/react-query': 5.80.5(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -13764,7 +13790,7 @@ snapshots: resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) transitivePeerDependencies: - '@babel/core' - react-is @@ -14110,7 +14136,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 dayjs@1.11.13: {} @@ -14290,7 +14316,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.164: {} + electron-to-chromium@1.5.165: {} elkjs@0.9.3: {} @@ -14502,7 +14528,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14810,7 +14836,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -14845,19 +14871,19 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - family@0.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) fast-deep-equal@3.1.3: {} @@ -14927,7 +14953,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -14978,7 +15004,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -15316,7 +15342,7 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -15330,11 +15356,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15342,11 +15368,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15354,7 +15380,7 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 @@ -15366,12 +15392,12 @@ snapshots: cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.4.5 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) transitivePeerDependencies: - bufferutil - debug @@ -15379,7 +15405,7 @@ snapshots: - utf-8-validate - zod - hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -15394,7 +15420,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15423,14 +15449,14 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -15445,7 +15471,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15474,7 +15500,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil @@ -15728,7 +15754,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16191,7 +16217,7 @@ snapshots: match-sorter@6.3.4: dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 remove-accents: 0.5.0 math-intrinsics@1.1.0: {} @@ -16866,7 +16892,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -16888,7 +16914,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -17317,21 +17343,6 @@ snapshots: transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.3): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - ox@0.7.1(typescript@5.8.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -17581,13 +17592,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.4 - postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.0 optionalDependencies: postcss: 8.5.4 - ts-node: 10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) postcss-nested@6.2.0(postcss@8.5.4): dependencies: @@ -17821,7 +17832,7 @@ snapshots: react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.27.6 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -18103,7 +18114,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -18185,7 +18196,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -18424,7 +18435,7 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -18435,7 +18446,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18447,7 +18458,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -18458,7 +18469,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.1(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18721,7 +18732,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -18740,7 +18751,7 @@ snapshots: postcss: 8.5.4 postcss-import: 15.1.0(postcss@8.5.4) postcss-js: 4.0.1(postcss@8.5.4) - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.4) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -18870,7 +18881,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@20.10.4)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -18888,9 +18899,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.31 - ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -18908,7 +18919,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.31 tsconfck@3.1.6(typescript@5.8.3): optionalDependencies: @@ -18922,24 +18933,24 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.11.29)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3): + tsup@8.0.2(@swc/core@1.11.31)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3): dependencies: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.29)(@types/node@22.7.5)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) resolve-from: 5.0.0 rollup: 4.41.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.29 + '@swc/core': 1.11.31 postcss: 8.5.4 typescript: 5.8.3 transitivePeerDependencies: @@ -18975,7 +18986,7 @@ snapshots: typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19306,23 +19317,6 @@ snapshots: - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10): - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.3) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 @@ -19385,7 +19379,7 @@ snapshots: vite-plugin-top-level-await@1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.41.1) - '@swc/core': 1.11.29 + '@swc/core': 1.11.31 uuid: 10.0.0 vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: @@ -19398,7 +19392,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: @@ -19422,11 +19416,11 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): + wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): dependencies: - '@tanstack/react-query': 5.80.3(react@18.3.1) - '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@tanstack/react-query': 5.80.5(react@18.3.1) + '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) @@ -19460,11 +19454,11 @@ snapshots: - utf-8-validate - zod - wagmi@2.15.5(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.3(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): + wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): dependencies: - '@tanstack/react-query': 5.80.3(react@18.3.1) - '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@tanstack/react-query': 5.80.5(react@18.3.1) + '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c4e7f70bd9..15efbb06cd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - packages/evm + - packages/enclave-react - examples/CRISP - examples/basic - examples/basic/client From 08214b45bf89e8ff9a58c45d4276dc1807ae3a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 5 Jun 2025 13:47:33 +0000 Subject: [PATCH 045/106] Fix up Support Scripts (#477) * Update tsconfig issues in template * Checkin template for better way to work * Update template * Update scripts * Update scripts and gitignore * Update inner script * Update support scripts * update templates/default * Remove examples/basic in favor of templates/default --- Cargo.toml | 2 + crates/init/src/lib.rs | 2 +- crates/support-scripts/ctl/compile | 2 +- crates/support-scripts/ctl/container | 14 + crates/support-scripts/ctl/run | 2 +- crates/support-scripts/ctl/shell | 2 +- crates/support-scripts/src/lib.rs | 32 +- crates/support/scripts/container/run.sh | 2 +- examples/basic/deploy/main.ts | 16 - packages/evm/package.json | 6 +- templates/default/.enclave/support/ctl | 1 + .../basic => templates/default}/.gitignore | 6 +- templates/default/.gitignore.bak | 19 + templates/default/.gitmodules.bak | 3 + .../basic => templates/default}/README.md | 0 .../default}/client/.env.example | 0 .../default}/client/.eslintrc.cjs | 0 .../default}/client/.gitignore | 0 .../default}/client/.prettierignore | 0 .../default}/client/.prettierrc | 0 .../default}/client/index.html | 0 .../default}/client/package.json | 4 +- .../default}/client/postcss.config.cjs | 0 .../default}/client/public/favicon.ico | Bin .../default}/client/public/favicon.png | Bin .../default}/client/public/manifest.json | 0 .../default}/client/src/App.tsx | 0 .../default}/client/src/globals.css | 0 .../client/src/hooks/useWebAssembly.tsx | 0 .../default}/client/src/main.tsx | 0 .../default}/client/src/pages/WizardSDK.tsx | 0 .../src/pages/components/CardContent.tsx | 0 .../src/pages/components/EnvironmentError.tsx | 0 .../client/src/pages/components/Spinner.tsx | 0 .../default}/client/src/utils/env-config.ts | 0 .../client/src/utils/error-formatting.ts | 0 .../default}/client/src/vite-env.d.ts | 0 .../default}/client/tailwind.config.js | 0 .../default}/client/tsconfig.json | 0 .../default}/client/tsconfig.node.json | 0 .../default}/client/vite.config.ts | 0 .../default}/client/wasm/Cargo.lock | 0 .../default}/client/wasm/Cargo.toml | 0 .../default}/client/wasm/README.md | 0 .../default}/client/wasm/src/lib.rs | 0 .../default}/contracts/.keep | 0 .../default}/contracts/MyProgram.sol | 0 .../default}/deploy/enclave.ts | 0 .../default}/enclave.config.yaml | 0 .../default}/hardhat.config.ts | 0 .../default}/ignition/modules/Lock.ts | 0 .../basic => templates/default}/package.json | 27 +- templates/default/pnpm-lock.yaml | 5207 +++++++++++++++++ .../default}/program/Cargo.toml | 0 .../default}/program/src/lib.rs | 0 .../default}/scripts/deploy-local.ts | 0 .../default}/scripts/interact.ts | 0 .../default}/server/index.ts | 0 .../basic => templates/default}/tests/.keep | 0 .../basic => templates/default}/tsconfig.json | 7 +- 60 files changed, 5299 insertions(+), 55 deletions(-) delete mode 100644 examples/basic/deploy/main.ts create mode 120000 templates/default/.enclave/support/ctl rename {examples/basic => templates/default}/.gitignore (81%) create mode 100644 templates/default/.gitignore.bak create mode 100644 templates/default/.gitmodules.bak rename {examples/basic => templates/default}/README.md (100%) rename {examples/basic => templates/default}/client/.env.example (100%) rename {examples/basic => templates/default}/client/.eslintrc.cjs (100%) rename {examples/basic => templates/default}/client/.gitignore (100%) rename {examples/basic => templates/default}/client/.prettierignore (100%) rename {examples/basic => templates/default}/client/.prettierrc (100%) rename {examples/basic => templates/default}/client/index.html (100%) rename {examples/basic => templates/default}/client/package.json (95%) rename {examples/basic => templates/default}/client/postcss.config.cjs (100%) rename {examples/basic => templates/default}/client/public/favicon.ico (100%) rename {examples/basic => templates/default}/client/public/favicon.png (100%) rename {examples/basic => templates/default}/client/public/manifest.json (100%) rename {examples/basic => templates/default}/client/src/App.tsx (100%) rename {examples/basic => templates/default}/client/src/globals.css (100%) rename {examples/basic => templates/default}/client/src/hooks/useWebAssembly.tsx (100%) rename {examples/basic => templates/default}/client/src/main.tsx (100%) rename {examples/basic => templates/default}/client/src/pages/WizardSDK.tsx (100%) rename {examples/basic => templates/default}/client/src/pages/components/CardContent.tsx (100%) rename {examples/basic => templates/default}/client/src/pages/components/EnvironmentError.tsx (100%) rename {examples/basic => templates/default}/client/src/pages/components/Spinner.tsx (100%) rename {examples/basic => templates/default}/client/src/utils/env-config.ts (100%) rename {examples/basic => templates/default}/client/src/utils/error-formatting.ts (100%) rename {examples/basic => templates/default}/client/src/vite-env.d.ts (100%) rename {examples/basic => templates/default}/client/tailwind.config.js (100%) rename {examples/basic => templates/default}/client/tsconfig.json (100%) rename {examples/basic => templates/default}/client/tsconfig.node.json (100%) rename {examples/basic => templates/default}/client/vite.config.ts (100%) rename {examples/basic => templates/default}/client/wasm/Cargo.lock (100%) rename {examples/basic => templates/default}/client/wasm/Cargo.toml (100%) rename {examples/basic => templates/default}/client/wasm/README.md (100%) rename {examples/basic => templates/default}/client/wasm/src/lib.rs (100%) rename {examples/basic => templates/default}/contracts/.keep (100%) mode change 100644 => 100755 rename {examples/basic => templates/default}/contracts/MyProgram.sol (100%) mode change 100644 => 100755 rename {examples/basic => templates/default}/deploy/enclave.ts (100%) rename {examples/basic => templates/default}/enclave.config.yaml (100%) rename {examples/basic => templates/default}/hardhat.config.ts (100%) rename {examples/basic => templates/default}/ignition/modules/Lock.ts (100%) rename {examples/basic => templates/default}/package.json (87%) create mode 100644 templates/default/pnpm-lock.yaml rename {examples/basic => templates/default}/program/Cargo.toml (100%) rename {examples/basic => templates/default}/program/src/lib.rs (100%) rename {examples/basic => templates/default}/scripts/deploy-local.ts (100%) rename {examples/basic => templates/default}/scripts/interact.ts (100%) rename {examples/basic => templates/default}/server/index.ts (100%) rename {examples/basic => templates/default}/tests/.keep (100%) mode change 100644 => 100755 rename {examples/basic => templates/default}/tsconfig.json (61%) diff --git a/Cargo.toml b/Cargo.toml index 4791b357d8..aec06dfc3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,8 @@ exclude = [ "examples/CRISP/apps/program", "examples/CRISP/apps/wasm-crypto", "examples/basic/client/wasm", + "examples/default/client/wasm", + "examples/default", "crates/support" # client needs to be able to build this independently ] resolver = "2" diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index a88bbd92c6..273d91110d 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -17,7 +17,7 @@ use std::str::FromStr; use tokio::fs; const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; -const TEMPLATE_FOLDER: &str = "examples/basic"; +const TEMPLATE_FOLDER: &str = "templates/default"; const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; // Updated execute function to include workspace dependency substitution diff --git a/crates/support-scripts/ctl/compile b/crates/support-scripts/ctl/compile index 90114dc71f..748542f656 100755 --- a/crates/support-scripts/ctl/compile +++ b/crates/support-scripts/ctl/compile @@ -1,4 +1,4 @@ #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/container.sh" ./scripts/container/build.sh +"$SCRIPT_DIR/container" ./scripts/container/build.sh diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 4dab490330..fc680da147 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -3,6 +3,20 @@ CONTAINER_NAME="e3-support.1" IMAGE="ghcr.io/gnosisguild/e3-support:next" CACHE_PREFIX="e3-support" +# Function to cleanup +cleanup() { + echo "Stopping container and processes..." + # Try to gracefully stop the container first + docker exec "$CONTAINER_NAME" pkill -SIGTERM e3-support-app 2>/dev/null || true + sleep 2 + # Force stop if still running + docker exec "$CONTAINER_NAME" pkill -SIGKILL e3-support-app 2>/dev/null || true + docker stop "$CONTAINER_NAME" 2>/dev/null || true +} + +# Set trap for signals +trap cleanup EXIT INT TERM + if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then docker exec -it "$CONTAINER_NAME" bash -c "$*" else diff --git a/crates/support-scripts/ctl/run b/crates/support-scripts/ctl/run index 8e4a451dfa..a6f991db37 100755 --- a/crates/support-scripts/ctl/run +++ b/crates/support-scripts/ctl/run @@ -1,4 +1,4 @@ #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/container.sh" ./scripts/container/run.sh +"$SCRIPT_DIR/container" ./scripts/container/run.sh diff --git a/crates/support-scripts/ctl/shell b/crates/support-scripts/ctl/shell index 4c76826753..42a16f0922 100755 --- a/crates/support-scripts/ctl/shell +++ b/crates/support-scripts/ctl/shell @@ -1,4 +1,4 @@ #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/container.sh" bash +"$SCRIPT_DIR/container" bash diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 8ecdffcfa5..34bf083fd2 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -1,26 +1,32 @@ -use std::{env, path::PathBuf}; - use anyhow::{bail, Result}; +use std::{env, path::PathBuf}; +use tokio::signal; use tokio::{fs, process::Command}; async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { + println!("run_bash_script: {:?} {:?} {:?}", cwd, script, args); let mut cmd = Command::new("bash"); - cmd.current_dir(cwd).arg(script); + cmd.current_dir(cwd).arg(script).kill_on_drop(true); for arg in args { cmd.arg(arg); } - let status = cmd.status().await?; - - if status.success() { - Ok(()) - } else { - bail!( - "{} failed with exit code: {:?}", - script.display(), - status.code() - ); + let mut child = cmd.spawn()?; + + tokio::select! { + result = child.wait() => { + let status = result?; + if status.success() { + Ok(()) + } else { + bail!("{} failed with exit code: {:?}", script.display(), status.code()); + } + } + _ = signal::ctrl_c() => { + let _ = child.kill().await; + bail!("Script interrupted by user"); + } } } diff --git a/crates/support/scripts/container/run.sh b/crates/support/scripts/container/run.sh index 80061ffa4b..a755f9e60c 100755 --- a/crates/support/scripts/container/run.sh +++ b/crates/support/scripts/container/run.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -cargo run --bin e3-support-app "$@" +exec cargo run --bin e3-support-app "$@" diff --git a/examples/basic/deploy/main.ts b/examples/basic/deploy/main.ts deleted file mode 100644 index 862b2a6d4b..0000000000 --- a/examples/basic/deploy/main.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { DeployFunction } from "hardhat-deploy/types"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; - -const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy } = hre.deployments; - - const program = await deploy("MyProgram", { - from: deployer, - args: [], // verifier, imageId - log: true, - }); -}; - -export default func; -func.tags = ["main"]; diff --git a/packages/evm/package.json b/packages/evm/package.json index 02fb55b5c0..c377a0d6ce 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -8,7 +8,11 @@ "url": "https://github.com/gnosisguild" }, "exports": { - "./deploy/enclave": "./dist/deploy/enclave.js", + "./deploy/enclave": { + "types": "./dist/deploy/enclave.d.ts", + "import": "./dist/deploy/enclave.js", + "require": "./dist/deploy/enclave.js" + }, "./contracts/*": "./contracts/*", "./artifacts/*": "./artifacts/*", "./sdk": "./dist/src/sdk/index.js", diff --git a/templates/default/.enclave/support/ctl b/templates/default/.enclave/support/ctl new file mode 120000 index 0000000000..e8e450169d --- /dev/null +++ b/templates/default/.enclave/support/ctl @@ -0,0 +1 @@ +../../../../crates/support-scripts/ctl \ No newline at end of file diff --git a/examples/basic/.gitignore b/templates/default/.gitignore similarity index 81% rename from examples/basic/.gitignore rename to templates/default/.gitignore index 84943ad254..cf1fbc3a6a 100644 --- a/examples/basic/.gitignore +++ b/templates/default/.gitignore @@ -1,7 +1,7 @@ node_modules .env -/.enclave +/lib # Hardhat files /cache @@ -15,6 +15,10 @@ node_modules /coverage /coverage.json +# Ignore risc0 files +contracts/ImageID.sol +tests/Elf.sol + /deployments # Hardhat Ignition default folder for deployments against a local node diff --git a/templates/default/.gitignore.bak b/templates/default/.gitignore.bak new file mode 100644 index 0000000000..e3dc803341 --- /dev/null +++ b/templates/default/.gitignore.bak @@ -0,0 +1,19 @@ +node_modules +.env + +/.enclave + +# Hardhat files +/cache +/artifacts + +# TypeChain files +/typechain +/typechain-types + +# solidity-coverage files +/coverage +/coverage.json + +# Hardhat Ignition default folder for deployments against a local node +ignition/deployments/chain-31337 diff --git a/templates/default/.gitmodules.bak b/templates/default/.gitmodules.bak new file mode 100644 index 0000000000..e056661b1d --- /dev/null +++ b/templates/default/.gitmodules.bak @@ -0,0 +1,3 @@ +[submodule "lib/risc0-ethereum"] + path = lib/risc0-ethereum + url = https://github.com/gnosisguild/risc0-ethereum diff --git a/examples/basic/README.md b/templates/default/README.md similarity index 100% rename from examples/basic/README.md rename to templates/default/README.md diff --git a/examples/basic/client/.env.example b/templates/default/client/.env.example similarity index 100% rename from examples/basic/client/.env.example rename to templates/default/client/.env.example diff --git a/examples/basic/client/.eslintrc.cjs b/templates/default/client/.eslintrc.cjs similarity index 100% rename from examples/basic/client/.eslintrc.cjs rename to templates/default/client/.eslintrc.cjs diff --git a/examples/basic/client/.gitignore b/templates/default/client/.gitignore similarity index 100% rename from examples/basic/client/.gitignore rename to templates/default/client/.gitignore diff --git a/examples/basic/client/.prettierignore b/templates/default/client/.prettierignore similarity index 100% rename from examples/basic/client/.prettierignore rename to templates/default/client/.prettierignore diff --git a/examples/basic/client/.prettierrc b/templates/default/client/.prettierrc similarity index 100% rename from examples/basic/client/.prettierrc rename to templates/default/client/.prettierrc diff --git a/examples/basic/client/index.html b/templates/default/client/index.html similarity index 100% rename from examples/basic/client/index.html rename to templates/default/client/index.html diff --git a/examples/basic/client/package.json b/templates/default/client/package.json similarity index 95% rename from examples/basic/client/package.json rename to templates/default/client/package.json index 153c31f28a..d8bd53e68e 100644 --- a/examples/basic/client/package.json +++ b/templates/default/client/package.json @@ -16,8 +16,8 @@ "preview": "vite preview" }, "dependencies": { - "@gnosis-guild/enclave": "workspace:*", - "@gnosis-guild/enclave-react": "workspace:*", + "@gnosis-guild/enclave": "0.0.5-test.8*", + "@gnosis-guild/enclave-react": "0.0.5-test.8*", "@phosphor-icons/react": "^2.1.4", "@tanstack/react-query": "^5.74.3", "@wagmi/core": "^2.14.16", diff --git a/examples/basic/client/postcss.config.cjs b/templates/default/client/postcss.config.cjs similarity index 100% rename from examples/basic/client/postcss.config.cjs rename to templates/default/client/postcss.config.cjs diff --git a/examples/basic/client/public/favicon.ico b/templates/default/client/public/favicon.ico similarity index 100% rename from examples/basic/client/public/favicon.ico rename to templates/default/client/public/favicon.ico diff --git a/examples/basic/client/public/favicon.png b/templates/default/client/public/favicon.png similarity index 100% rename from examples/basic/client/public/favicon.png rename to templates/default/client/public/favicon.png diff --git a/examples/basic/client/public/manifest.json b/templates/default/client/public/manifest.json similarity index 100% rename from examples/basic/client/public/manifest.json rename to templates/default/client/public/manifest.json diff --git a/examples/basic/client/src/App.tsx b/templates/default/client/src/App.tsx similarity index 100% rename from examples/basic/client/src/App.tsx rename to templates/default/client/src/App.tsx diff --git a/examples/basic/client/src/globals.css b/templates/default/client/src/globals.css similarity index 100% rename from examples/basic/client/src/globals.css rename to templates/default/client/src/globals.css diff --git a/examples/basic/client/src/hooks/useWebAssembly.tsx b/templates/default/client/src/hooks/useWebAssembly.tsx similarity index 100% rename from examples/basic/client/src/hooks/useWebAssembly.tsx rename to templates/default/client/src/hooks/useWebAssembly.tsx diff --git a/examples/basic/client/src/main.tsx b/templates/default/client/src/main.tsx similarity index 100% rename from examples/basic/client/src/main.tsx rename to templates/default/client/src/main.tsx diff --git a/examples/basic/client/src/pages/WizardSDK.tsx b/templates/default/client/src/pages/WizardSDK.tsx similarity index 100% rename from examples/basic/client/src/pages/WizardSDK.tsx rename to templates/default/client/src/pages/WizardSDK.tsx diff --git a/examples/basic/client/src/pages/components/CardContent.tsx b/templates/default/client/src/pages/components/CardContent.tsx similarity index 100% rename from examples/basic/client/src/pages/components/CardContent.tsx rename to templates/default/client/src/pages/components/CardContent.tsx diff --git a/examples/basic/client/src/pages/components/EnvironmentError.tsx b/templates/default/client/src/pages/components/EnvironmentError.tsx similarity index 100% rename from examples/basic/client/src/pages/components/EnvironmentError.tsx rename to templates/default/client/src/pages/components/EnvironmentError.tsx diff --git a/examples/basic/client/src/pages/components/Spinner.tsx b/templates/default/client/src/pages/components/Spinner.tsx similarity index 100% rename from examples/basic/client/src/pages/components/Spinner.tsx rename to templates/default/client/src/pages/components/Spinner.tsx diff --git a/examples/basic/client/src/utils/env-config.ts b/templates/default/client/src/utils/env-config.ts similarity index 100% rename from examples/basic/client/src/utils/env-config.ts rename to templates/default/client/src/utils/env-config.ts diff --git a/examples/basic/client/src/utils/error-formatting.ts b/templates/default/client/src/utils/error-formatting.ts similarity index 100% rename from examples/basic/client/src/utils/error-formatting.ts rename to templates/default/client/src/utils/error-formatting.ts diff --git a/examples/basic/client/src/vite-env.d.ts b/templates/default/client/src/vite-env.d.ts similarity index 100% rename from examples/basic/client/src/vite-env.d.ts rename to templates/default/client/src/vite-env.d.ts diff --git a/examples/basic/client/tailwind.config.js b/templates/default/client/tailwind.config.js similarity index 100% rename from examples/basic/client/tailwind.config.js rename to templates/default/client/tailwind.config.js diff --git a/examples/basic/client/tsconfig.json b/templates/default/client/tsconfig.json similarity index 100% rename from examples/basic/client/tsconfig.json rename to templates/default/client/tsconfig.json diff --git a/examples/basic/client/tsconfig.node.json b/templates/default/client/tsconfig.node.json similarity index 100% rename from examples/basic/client/tsconfig.node.json rename to templates/default/client/tsconfig.node.json diff --git a/examples/basic/client/vite.config.ts b/templates/default/client/vite.config.ts similarity index 100% rename from examples/basic/client/vite.config.ts rename to templates/default/client/vite.config.ts diff --git a/examples/basic/client/wasm/Cargo.lock b/templates/default/client/wasm/Cargo.lock similarity index 100% rename from examples/basic/client/wasm/Cargo.lock rename to templates/default/client/wasm/Cargo.lock diff --git a/examples/basic/client/wasm/Cargo.toml b/templates/default/client/wasm/Cargo.toml similarity index 100% rename from examples/basic/client/wasm/Cargo.toml rename to templates/default/client/wasm/Cargo.toml diff --git a/examples/basic/client/wasm/README.md b/templates/default/client/wasm/README.md similarity index 100% rename from examples/basic/client/wasm/README.md rename to templates/default/client/wasm/README.md diff --git a/examples/basic/client/wasm/src/lib.rs b/templates/default/client/wasm/src/lib.rs similarity index 100% rename from examples/basic/client/wasm/src/lib.rs rename to templates/default/client/wasm/src/lib.rs diff --git a/examples/basic/contracts/.keep b/templates/default/contracts/.keep old mode 100644 new mode 100755 similarity index 100% rename from examples/basic/contracts/.keep rename to templates/default/contracts/.keep diff --git a/examples/basic/contracts/MyProgram.sol b/templates/default/contracts/MyProgram.sol old mode 100644 new mode 100755 similarity index 100% rename from examples/basic/contracts/MyProgram.sol rename to templates/default/contracts/MyProgram.sol diff --git a/examples/basic/deploy/enclave.ts b/templates/default/deploy/enclave.ts similarity index 100% rename from examples/basic/deploy/enclave.ts rename to templates/default/deploy/enclave.ts diff --git a/examples/basic/enclave.config.yaml b/templates/default/enclave.config.yaml similarity index 100% rename from examples/basic/enclave.config.yaml rename to templates/default/enclave.config.yaml diff --git a/examples/basic/hardhat.config.ts b/templates/default/hardhat.config.ts similarity index 100% rename from examples/basic/hardhat.config.ts rename to templates/default/hardhat.config.ts diff --git a/examples/basic/ignition/modules/Lock.ts b/templates/default/ignition/modules/Lock.ts similarity index 100% rename from examples/basic/ignition/modules/Lock.ts rename to templates/default/ignition/modules/Lock.ts diff --git a/examples/basic/package.json b/templates/default/package.json similarity index 87% rename from examples/basic/package.json rename to templates/default/package.json index 47ea85c0dd..93c7429965 100644 --- a/examples/basic/package.json +++ b/templates/default/package.json @@ -1,18 +1,6 @@ { - "name": "hardhat-project", - "scripts": { - "node": "hardhat node", - "deploy": "hardhat run scripts/deploy-local.ts --network localhost", - "deploy:dev": "hardhat run scripts/deploy-local.ts", - "add-ciphernode": "hardhat run scripts/interact.ts -- add-ciphernode", - "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", - "compile": "hardhat compile", - "test": "hardhat test", - "rpc": "ts-node ./server", - "program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"" - }, "devDependencies": { - "@gnosis-guild/enclave": "workspace:*", + "@gnosis-guild/enclave": "0.0.5-test.8*", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-ignition": "^0.15.0", @@ -21,6 +9,7 @@ "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.0", "@openzeppelin/contracts": "5.3.0", + "@risc0/ethereum": "file:lib/risc0-ethereum", "@typechain/ethers-v6": "^0.5.0", "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", @@ -39,5 +28,17 @@ "typechain": "^8.3.0", "typed-rpc": "^6.1.1", "typescript": ">=4.5.0" + }, + "name": "enclave-example", + "scripts": { + "add-ciphernode": "hardhat run scripts/interact.ts -- add-ciphernode", + "compile": "hardhat compile", + "deploy": "hardhat run scripts/deploy-local.ts --network localhost", + "deploy:dev": "hardhat run scripts/deploy-local.ts", + "node": "hardhat node", + "program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", + "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", + "rpc": "ts-node ./server", + "test": "hardhat test" } } diff --git a/templates/default/pnpm-lock.yaml b/templates/default/pnpm-lock.yaml new file mode 100644 index 0000000000..39c88fd7c3 --- /dev/null +++ b/templates/default/pnpm-lock.yaml @@ -0,0 +1,5207 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@gnosis-guild/enclave': + specifier: 0.0.5-test.8* + version: 0.0.5-test.8(typescript@5.8.3) + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.0 + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.0 + version: 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ignition': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ignition-ethers': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^5.0.0 + version: 5.0.0(f32a611d4f5c894495d781d8153f6317) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.0 + version: 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@openzeppelin/contracts': + specifier: 5.3.0 + version: 5.3.0 + '@risc0/ethereum': + specifier: file:lib/risc0-ethereum + version: file:lib/risc0-ethereum + '@typechain/ethers-v6': + specifier: ^0.5.0 + version: 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3)) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.20 + '@types/express': + specifier: ^5.0.2 + version: 5.0.2 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.10 + '@types/node': + specifier: '>=18.0.0' + version: 22.15.29 + chai: + specifier: ^4.2.0 + version: 4.5.0 + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + ethers: + specifier: ^6.4.0 + version: 6.14.3 + express: + specifier: ^5.1.0 + version: 5.1.0 + hardhat: + specifier: ^2.14.0 + version: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + hardhat-deploy: + specifier: ^0.12.1 + version: 0.12.4 + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) + typechain: + specifier: ^8.3.0 + version: 8.3.2(typescript@5.8.3) + typed-rpc: + specifier: ^6.1.1 + version: 6.1.1 + typescript: + specifier: '>=4.5.0' + version: 5.8.3 + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.6.1': + resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + + '@excubiae/contracts@0.4.0': + resolution: {integrity: sha512-jrR+IpelmoRW9adg6Dq+KlPMJfBr0dWPKjjuAIeZae883twnfk5+MWHGBBxFL7Rykx7URuQHpMvhYYamExL3Ow==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@gnosis-guild/enclave@0.0.5-test.8': + resolution: {integrity: sha512-zkqBY9KX28tGWwDQEh91VNMbMKZXI7uMir40G9b8eS4K11BY6c3saukUi8PDD7UwWcOIErGXU4QtcOSDeMKjxw==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nomicfoundation/edr-darwin-arm64@0.11.0': + resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.11.0': + resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': + resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': + resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': + resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.11.0': + resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': + resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.11.0': + resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} + engines: {node: '>= 18'} + + '@nomicfoundation/hardhat-chai-matchers@2.0.8': + resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.0 + chai: ^4.2.0 + ethers: ^6.1.0 + hardhat: ^2.9.4 + + '@nomicfoundation/hardhat-ethers@3.0.8': + resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.0.0 + + '@nomicfoundation/hardhat-ignition-ethers@0.15.11': + resolution: {integrity: sha512-srXzvf7qCDHLrnvQWtpVA9gWpcbp4BcnsOqJt6ISet9OlUnxk4GgRMbdFq4YpM48bHQTX397jS9yk1AtJCjt/g==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.4 + '@nomicfoundation/hardhat-ignition': ^0.15.11 + '@nomicfoundation/ignition-core': ^0.15.11 + ethers: ^6.7.0 + hardhat: ^2.18.0 + + '@nomicfoundation/hardhat-ignition@0.15.11': + resolution: {integrity: sha512-OXebmK9FCMwwbb4mIeHBbVFFicAGgyGKJT2zrONrpixrROxrVs6KEi1gzsiN25qtQhCQePt8BTjjYrgy86Dfxg==} + peerDependencies: + '@nomicfoundation/hardhat-verify': ^2.0.1 + hardhat: ^2.18.0 + + '@nomicfoundation/hardhat-network-helpers@1.0.12': + resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} + peerDependencies: + hardhat: ^2.9.5 + + '@nomicfoundation/hardhat-toolbox@5.0.0': + resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} + peerDependencies: + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-ignition-ethers': ^0.15.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': '>=18.0.0' + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.3.0 + typescript: '>=4.5.0' + + '@nomicfoundation/hardhat-verify@2.0.14': + resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} + peerDependencies: + hardhat: ^2.24.1 + + '@nomicfoundation/ignition-core@0.15.11': + resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} + + '@nomicfoundation/ignition-ui@0.15.11': + resolution: {integrity: sha512-VPOVl5xqCKhYCyPOQlposx+stjCwqXQ+BCs5lnw/f2YUfgII+G5Ye0JfHiJOfCJGmqyS03WertBslcj9zQg50A==} + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + + '@openzeppelin/contracts@5.3.0': + resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} + + '@risc0/ethereum@file:lib/risc0-ethereum': + resolution: {directory: lib/risc0-ethereum, type: directory} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@semaphore-protocol/contracts@4.11.1': + resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@solidity-parser/parser@0.14.5': + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + + '@solidity-parser/parser@0.20.1': + resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: '>=4.7.0' + + '@typechain/hardhat@9.1.0': + resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} + peerDependencies: + '@typechain/ethers-v6': ^0.5.1 + ethers: ^6.1.0 + hardhat: ^2.9.9 + typechain: ^8.3.2 + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/chai-as-promised@7.1.8': + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/concat-stream@1.6.1': + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@5.0.2': + resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} + + '@types/form-data@0.0.33': + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + + '@types/node@22.15.29': + resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/node@8.10.66': + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@zk-kit/lean-imt.sol@2.0.1': + resolution: {integrity: sha512-2dy/wfzch2vy5QtDCFmQwN7E4GZP0xBcucTb2mfZoJP5V69cjPRdy6KcbS0YOcBMH/Lb7BgXLsekRYjh9JNKEw==} + + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} + peerDependencies: + chai: '>= 2.1.2 < 6' + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + + ethers@6.14.3: + resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} + engines: {node: '>=14.0.0'} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hardhat-deploy@0.12.4: + resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} + + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + + hardhat@2.24.2: + resolution: {integrity: sha512-oYt+tcN2379Z3kqIhvVw6IFgWqTm/ixcrTvyAuQdE2RbD+kknwF7hDfUeggy0akrw6xdgCtXvnw9DFrxAB70hA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonschema@1.5.0: + resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + + match-all@1.2.7: + resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + ox@0.7.1: + resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + poseidon-solidity@0.0.5: + resolution: {integrity: sha512-NzrvSwHzvZgT4hvg2GyGqeR+UOU/eLSEt4wAoXEua+VaR7NTKKwx1X9bPlh1VMBEVEno+IWvkRBbidFGzTeAqQ==} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + + req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + solady@0.1.19: + resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} + + solady@0.1.4: + resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + solidity-coverage@0.8.16: + resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + + sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-rpc@6.1.1: + resolution: {integrity: sha512-PZCwvDWNyXHp5ZuHJqixU59jw+61JIL95jkW71VUXPJagYRJtpmRdFdIF3EL5tEz6XHLaBtrqgJEBysHIu4vOw==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + viem@2.30.6: + resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zksync-ethers@5.10.0: + resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ~5.7.0 + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/rlp@5.0.2': {} + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.6.1': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/basex@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.2 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/contracts@5.8.0': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/hdnode@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/json-wallets@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/pbkdf2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/providers@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/sha2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.2 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/units@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/wallet@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/wordlists@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@excubiae/contracts@0.4.0': + dependencies: + '@openzeppelin/contracts': 5.3.0 + '@semaphore-protocol/contracts': 4.11.1 + solady: 0.1.4 + + '@fastify/busboy@2.1.1': {} + + '@gnosis-guild/enclave@0.0.5-test.8(typescript@5.8.3)': + dependencies: + '@excubiae/contracts': 0.4.0 + solady: 0.1.19 + viem: 2.30.6(typescript@5.8.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.2': {} + + '@noble/hashes@1.8.0': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@nomicfoundation/edr-darwin-arm64@0.11.0': {} + + '@nomicfoundation/edr-darwin-x64@0.11.0': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} + + '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} + + '@nomicfoundation/edr@0.11.0': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.11.0 + '@nomicfoundation/edr-darwin-x64': 0.11.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 + '@nomicfoundation/edr-linux-x64-musl': 0.11.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 + + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@types/chai-as-promised': 7.1.8 + chai: 4.5.0 + chai-as-promised: 7.1.2(chai@4.5.0) + deep-eql: 4.1.4 + ethers: 6.14.3 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + ordinal: 1.0.3 + + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + debug: 4.4.1(supports-color@8.1.1) + ethers: 6.14.3 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/ignition-core': 0.15.11 + ethers: 6.14.3 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + + '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/ignition-core': 0.15.11 + '@nomicfoundation/ignition-ui': 0.15.11 + chalk: 4.1.2 + debug: 4.4.1(supports-color@8.1.1) + fs-extra: 10.1.0 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + json5: 2.2.3 + prompts: 2.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + + '@nomicfoundation/hardhat-toolbox@5.0.0(f32a611d4f5c894495d781d8153f6317)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 22.15.29 + chai: 4.5.0 + ethers: 6.14.3 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + hardhat-gas-reporter: 1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + solidity-coverage: 0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) + ts-node: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + cbor: 8.1.0 + debug: 4.4.1(supports-color@8.1.1) + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + lodash.clonedeep: 4.5.0 + picocolors: 1.1.1 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/ignition-core@0.15.11': + dependencies: + '@ethersproject/address': 5.6.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 + cbor: 9.0.2 + debug: 4.4.1(supports-color@8.1.1) + ethers: 6.14.3 + fs-extra: 10.1.0 + immer: 10.0.2 + lodash: 4.17.21 + ndjson: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@nomicfoundation/ignition-ui@0.15.11': {} + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@openzeppelin/contracts@5.3.0': {} + + '@risc0/ethereum@file:lib/risc0-ethereum': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@semaphore-protocol/contracts@4.11.1': + dependencies: + '@zk-kit/lean-imt.sol': 2.0.1 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@solidity-parser/parser@0.14.5': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.20.1': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + dependencies: + ethers: 6.14.3 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3))': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3 + fs-extra: 9.1.0 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 22.15.29 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.15.29 + + '@types/chai-as-promised@7.1.8': + dependencies: + '@types/chai': 4.3.20 + + '@types/chai@4.3.20': {} + + '@types/concat-stream@1.6.1': + dependencies: + '@types/node': 22.15.29 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.15.29 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.15.29 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.2': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.7 + + '@types/form-data@0.0.33': + dependencies: + '@types/node': 22.15.29 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.15.29 + + '@types/http-errors@2.0.4': {} + + '@types/lru-cache@5.1.1': {} + + '@types/mime@1.3.5': {} + + '@types/minimatch@5.1.2': {} + + '@types/mocha@10.0.10': {} + + '@types/node@10.17.60': {} + + '@types/node@22.15.29': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/node@8.10.66': {} + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 22.15.29 + + '@types/prettier@2.7.3': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 22.15.29 + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.15.29 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.15.29 + '@types/send': 0.17.4 + + '@zk-kit/lean-imt.sol@2.0.1': + dependencies: + poseidon-solidity: 0.0.5 + + abbrev@1.0.9: {} + + abitype@1.0.8(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + adm-zip@0.4.16: {} + + aes-js@3.0.0: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + amdefine@1.0.1: + optional: true + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@3.0.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antlr4ts@0.5.0-alpha.4: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-back@3.1.0: {} + + array-back@4.0.2: {} + + array-union@2.1.0: {} + + array-uniq@1.0.3: {} + + asap@2.0.6: {} + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: {} + + async@1.5.2: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + axios@0.21.4(debug@4.4.1): + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + transitivePeerDependencies: + - debug + + axios@1.9.0: + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + bech32@1.1.4: {} + + binary-extensions@2.3.0: {} + + blakejs@1.2.1: {} + + bn.js@4.11.6: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1(supports-color@8.1.1) + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.6 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camelcase@6.3.0: {} + + caseless@0.12.0: {} + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + + chai-as-promised@7.1.2(chai@4.5.0): + dependencies: + chai: 4.5.0 + check-error: 1.0.3 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + charenc@0.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@2.0.0: {} + + cipher-base@1.0.6: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cli-table3@0.5.1: + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@8.3.0: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + concurrently@9.1.2: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.4.2: {} + + cookie@0.7.2: {} + + core-util-is@1.0.3: {} + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.6 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + crypt@0.0.2: {} + + death@1.1.0: {} + + debug@4.4.1(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + difflib@0.2.4: + dependencies: + heap: 0.2.7 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + encode-utf8@1.0.3: {} + + encodeurl@2.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escodegen@1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + + esprima@2.7.3: {} + + esprima@4.0.1: {} + + estraverse@1.9.3: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eth-gas-reporter@0.2.27: + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.9.0 + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.8.0 + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.8.2 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + ethereum-bloom-filters@1.2.0: + dependencies: + '@noble/hashes': 1.8.0 + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.4 + setimmediate: 1.0.5 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.1.6 + bn.js: 5.2.2 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethers@5.8.0: + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethers@6.14.3: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + + eventemitter3@5.0.1: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.5(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + fmix@0.1.0: + dependencies: + imul: 1.0.1 + + follow-redirects@1.15.9(debug@4.4.1): + optionalDependencies: + debug: 4.4.1(supports-color@8.1.1) + + form-data@2.5.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fp-ts@1.19.3: {} + + fresh@2.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-readdir-recursive@1.1.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@3.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + ghost-testrpc@0.0.2: + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@5.0.15: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.1.7: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + glob: 7.2.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hardhat-deploy@0.12.4: + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@types/qs': 6.14.0 + axios: 0.21.4(debug@4.4.1) + chalk: 4.1.2 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + enquirer: 2.4.1 + ethers: 5.8.0 + form-data: 4.0.2 + fs-extra: 10.1.0 + match-all: 1.2.7 + murmur-128: 0.2.1 + qs: 6.14.0 + zksync-ethers: 5.10.0(ethers@5.8.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + hardhat-gas-reporter@1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + + hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3): + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.6 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + micro-eth-signer: 0.14.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.1) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.14 + tsort: 0.0.1 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10 + optionalDependencies: + ts-node: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + has-flag@1.0.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + heap@0.2.7: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + http-basic@8.1.3: + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-response-object@3.0.2: + dependencies: + '@types/node': 10.17.60 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + immer@10.0.2: {} + + immutable@4.3.7: {} + + imul@1.0.1: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + interpret@1.4.0: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + ipaddr.js@1.9.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hex-prefixed@1.0.0: {} + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-promise@4.0.0: {} + + is-unicode-supported@0.1.0: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isows@1.0.7(ws@8.18.2): + dependencies: + ws: 8.18.2 + + js-sha3@0.8.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + + json-stream-stringify@3.1.6: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonschema@1.5.0: {} + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.isequal@4.5.0: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru_map@0.3.3: {} + + make-error@1.3.6: {} + + markdown-table@1.1.3: {} + + match-all@1.2.7: {} + + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + media-typer@1.1.0: {} + + memorystream@0.3.1: {} + + merge-descriptors@2.0.0: {} + + merge2@1.4.1: {} + + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + + micro-ftch@0.3.1: {} + + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.5 + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + murmur-128@0.2.1: + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + + ndjson@2.0.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.8 + readable-stream: 3.6.2 + split2: 3.2.2 + through2: 4.0.2 + + negotiator@1.0.0: {} + + neo-async@2.6.2: {} + + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-gyp-build@4.8.4: {} + + nofilter@3.1.0: {} + + nopt@3.0.6: + dependencies: + abbrev: 1.0.9 + + normalize-path@3.0.0: {} + + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + obliterator@2.0.5: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + ordinal@1.0.3: {} + + os-tmpdir@1.0.2: {} + + ox@0.7.1(typescript@5.8.3): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + parse-cache-control@1.0.1: {} + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@8.2.0: {} + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + poseidon-solidity@0.0.5: {} + + prelude-ls@1.1.2: {} + + prettier@2.8.8: {} + + process-nextick-args@2.0.1: {} + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.10 + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + + reduce-flatten@2.0.0: {} + + req-cwd@2.0.0: + dependencies: + req-from: 2.0.0 + + req-from@2.0.0: + dependencies: + resolve-from: 3.0.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@3.0.0: {} + + resolve@1.1.7: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.2 + + router@2.2.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sc-istanbul@0.4.6: + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + + scrypt-js@3.0.1: {} + + secp256k1@4.0.4: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + sha1@1.1.1: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + + shell-quote@1.8.3: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + solady@0.1.19: {} + + solady@0.1.4: {} + + solc@0.8.26(debug@4.4.1): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.1) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + solidity-coverage@0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)): + dependencies: + '@ethersproject/abi': 5.8.0 + '@solidity-parser/parser': 0.20.1 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) + jsonschema: 1.5.0 + lodash: 4.17.21 + mocha: 10.8.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.7.2 + shelljs: 0.8.5 + web3-utils: 1.10.4 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.2.0: + dependencies: + amdefine: 1.0.1 + optional: true + + source-map@0.6.1: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + sprintf-js@1.0.3: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.1: {} + + string-format@2.0.0: {} + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + + strip-json-comments@3.1.1: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + sync-request@6.1.0: + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + + sync-rpc@1.3.6: + dependencies: + get-port: 3.2.0 + + table-layout@1.0.2: + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + then-request@6.0.2: + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.14.0 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.3 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.14.0 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.5(picomatch@4.0.2) + picomatch: 4.0.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + ts-command-line-args@2.5.1: + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + + ts-essentials@7.0.3(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.15.29 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.7.0: {} + + tslib@2.8.1: {} + + tsort@0.0.1: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typechain@8.3.2(typescript@5.8.3): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.4.1(supports-color@8.1.1) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typed-rpc@6.1.1: {} + + typedarray@0.0.6: {} + + typescript@5.8.3: {} + + typical@4.0.0: {} + + typical@5.2.0: {} + + uglify-js@3.19.3: + optional: true + + undici-types@6.19.8: {} + + undici-types@6.21.0: {} + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + utf8@3.0.0: {} + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + viem@2.30.6(typescript@5.8.3): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.3) + isows: 1.0.7(ws@8.18.2) + ox: 0.7.1(typescript@5.8.3) + ws: 8.18.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + web3-utils@1.10.4: + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.2 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + ws@8.17.1: {} + + ws@8.18.0: {} + + ws@8.18.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zksync-ethers@5.10.0(ethers@5.8.0): + dependencies: + ethers: 5.8.0 diff --git a/examples/basic/program/Cargo.toml b/templates/default/program/Cargo.toml similarity index 100% rename from examples/basic/program/Cargo.toml rename to templates/default/program/Cargo.toml diff --git a/examples/basic/program/src/lib.rs b/templates/default/program/src/lib.rs similarity index 100% rename from examples/basic/program/src/lib.rs rename to templates/default/program/src/lib.rs diff --git a/examples/basic/scripts/deploy-local.ts b/templates/default/scripts/deploy-local.ts similarity index 100% rename from examples/basic/scripts/deploy-local.ts rename to templates/default/scripts/deploy-local.ts diff --git a/examples/basic/scripts/interact.ts b/templates/default/scripts/interact.ts similarity index 100% rename from examples/basic/scripts/interact.ts rename to templates/default/scripts/interact.ts diff --git a/examples/basic/server/index.ts b/templates/default/server/index.ts similarity index 100% rename from examples/basic/server/index.ts rename to templates/default/server/index.ts diff --git a/examples/basic/tests/.keep b/templates/default/tests/.keep old mode 100644 new mode 100755 similarity index 100% rename from examples/basic/tests/.keep rename to templates/default/tests/.keep diff --git a/examples/basic/tsconfig.json b/templates/default/tsconfig.json similarity index 61% rename from examples/basic/tsconfig.json rename to templates/default/tsconfig.json index 76bd0bf91e..83eae42960 100644 --- a/examples/basic/tsconfig.json +++ b/templates/default/tsconfig.json @@ -1,14 +1,13 @@ { "compilerOptions": { "target": "ES2020", - "module": "commonjs", + "module": "nodenext", "esModuleInterop": true, - - "moduleResolution": "bundler", + "moduleResolution": "nodenext", "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "resolveJsonModule": true }, - "include": ["server", "hardhat.config.ts"] + "include": ["./deploy/**/*", "./server/**/*", "hardhat.config.ts"] } From eb47e7cbe57f0f5d0234829f9c1762eda12acf91 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Thu, 5 Jun 2025 16:33:36 +0200 Subject: [PATCH 046/106] add releases workflows (#476) --- .changeset/README.md | 8 + .changeset/config.json | 11 + .github/workflows/releases.yml | 87 ++++++++ package.json | 9 +- pnpm-lock.yaml | 354 +++++++++++++++++++++++++++++++++ 5 files changed, 467 insertions(+), 2 deletions(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json create mode 100644 .github/workflows/releases.yml diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000000..e5b6d8d6a6 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000000..d88011f613 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml new file mode 100644 index 0000000000..f1e897775a --- /dev/null +++ b/.github/workflows/releases.yml @@ -0,0 +1,87 @@ +name: Releases Workflow + +permissions: + pull-requests: write + contents: write + +on: + push: + branches: [main] + paths: + - "Cargo.toml" + - "package.json" + - "crates/**" + - "packages/**" + - ".github/workflows/releases.yml" + +jobs: + release-rust: + name: Release Rust Crates + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Run release-plz + id: release-plz + uses: MarcoIeni/release-plz-action@v0.5.64 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + with: + version: "0.3.83" + + - uses: fregante/setup-git-user@v2.0.1 + if: steps.release-plz.outputs.prs_created == 'true' + + - name: Install dprint + if: steps.release-plz.outputs.prs_created == 'true' + run: curl -fsSL https://dprint.dev/install.sh | sh -s 0.47.2 > /dev/null 2>&1 + + - name: Format Rust code + if: steps.release-plz.outputs.prs_created == 'true' + run: | + pr_branch="${{ fromJSON(steps.release-plz.outputs.pr).head_branch }}" + git pull + git checkout "$pr_branch" + $HOME/.dprint/bin/dprint fmt + git commit -am 'chore: format files' + git push origin "$pr_branch" + + release-npm: + name: Release NPM Packages + runs-on: ubuntu-latest + needs: release-rust + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 10.7.1 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build packages + run: pnpm build + + - name: Create Release PR or Publish + uses: changesets/action@v1 + with: + publish: pnpm release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package.json b/package.json index eaa03f35f5..5ab5ab6cfd 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,11 @@ "evm:typechain": "cd packages/evm && pnpm typechain", "evm:test": "cd packages/evm && pnpm test", "evm:coverage": "cd packages/evm && pnpm coverage", - "evm:release": "cd packages/evm && pnpm release" + "evm:release": "cd packages/evm && pnpm release", + "build": "pnpm -r build", + "changeset": "changeset", + "version": "changeset version", + "release": "pnpm build && changeset publish" }, "workspaces": [ "packages/evm", @@ -46,6 +50,7 @@ ], "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", "devDependencies": { - "husky": "^9.1.7" + "husky": "^9.1.7", + "@changesets/cli": "^2.27.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c6f5de8fb..07ef4f8ec8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.29.4 husky: specifier: ^9.1.7 version: 9.1.7 @@ -1217,6 +1220,61 @@ packages: '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + + '@changesets/assemble-release-plan@6.0.8': + resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.4': + resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.12': + resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -2055,6 +2113,12 @@ packages: '@lit/reactive-element@2.1.0': resolution: {integrity: sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -3246,6 +3310,9 @@ packages: '@types/node@10.17.60': resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} @@ -3786,6 +3853,10 @@ packages: bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -4048,6 +4119,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -4068,6 +4142,10 @@ packages: ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + cipher-base@1.0.6: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} @@ -4617,6 +4695,10 @@ packages: detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -5021,10 +5103,17 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + family@0.1.2: resolution: {integrity: sha512-d+GeTctSPP50aHyNgkIXKXwTrQs7OmBlTaeYWXtPReBCX8iassx4oV6nq9bA1uN4zw0KSATdOdFdGUEH0KF5bA==} engines: {node: '>=12.4'} @@ -5589,6 +5678,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -5812,6 +5905,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -5820,6 +5917,10 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -6062,6 +6163,9 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -6765,6 +6869,9 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + ox@0.6.7: resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} peerDependencies: @@ -6785,6 +6892,10 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -6805,6 +6916,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -6820,6 +6935,9 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -7211,6 +7329,9 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -7315,6 +7436,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -7762,6 +7887,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -7844,6 +7972,10 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -7972,6 +8104,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -9627,6 +9763,148 @@ snapshots: '@braintree/sanitize-url@6.0.4': {} + '@changesets/apply-release-plan@7.0.12': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.2 + + '@changesets/assemble-release-plan@6.0.8': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.2 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.4': + dependencies: + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.12 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.2 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.2 + + '@changesets/get-release-plan@4.0.12': + dependencies: + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 + '@coinbase/wallet-sdk@3.9.3': dependencies: bn.js: 5.2.2 @@ -10451,6 +10729,22 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.3.0 + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.27.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.27.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -12175,6 +12469,8 @@ snapshots: '@types/node@10.17.60': {} + '@types/node@12.20.55': {} + '@types/node@20.10.4': dependencies: undici-types: 5.26.5 @@ -13282,6 +13578,10 @@ snapshots: bech32@1.1.4: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -13582,6 +13882,8 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} + charenc@0.0.2: {} check-error@1.0.3: @@ -13608,6 +13910,8 @@ snapshots: ci-info@2.0.0: {} + ci-info@3.9.0: {} + cipher-base@1.0.6: dependencies: inherits: 2.0.4 @@ -14221,6 +14525,8 @@ snapshots: detect-browser@5.3.0: {} + detect-indent@6.1.0: {} + detect-libc@2.0.4: {} devlop@1.1.0: @@ -14866,11 +15172,19 @@ snapshots: extend@3.0.2: {} + extendable-error@0.1.7: {} + extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): optionalDependencies: react: 18.3.1 @@ -15758,6 +16072,8 @@ snapshots: transitivePeerDependencies: - supports-color + human-id@4.1.1: {} + human-signals@2.1.0: {} human-signals@4.3.1: {} @@ -15926,12 +16242,18 @@ snapshots: is-stream@3.0.0: {} + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} + is-windows@1.0.2: {} + isarray@1.0.0: {} isexe@2.0.0: {} @@ -16148,6 +16470,8 @@ snapshots: lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} + lodash.truncate@4.4.2: {} lodash@4.17.21: {} @@ -17329,6 +17653,8 @@ snapshots: os-tmpdir@1.0.2: {} + outdent@0.5.0: {} + ox@0.6.7(typescript@5.8.3)(zod@3.25.51): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -17375,6 +17701,10 @@ snapshots: p-cancelable@3.0.0: {} + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + p-finally@1.0.0: {} p-limit@2.3.0: @@ -17393,6 +17723,8 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -17408,6 +17740,10 @@ snapshots: registry-url: 6.0.1 semver: 7.7.2 + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + pako@1.0.11: {} pako@2.1.0: {} @@ -17734,6 +18070,8 @@ snapshots: dependencies: side-channel: 1.1.0 + quansync@0.2.10: {} + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 @@ -17859,6 +18197,13 @@ snapshots: dependencies: pify: 2.3.0 + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -18515,6 +18860,11 @@ snapshots: space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + split-on-first@1.1.0: {} split2@3.2.2: @@ -18599,6 +18949,8 @@ snapshots: strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} + strip-eof@1.0.0: {} strip-final-newline@2.0.0: {} @@ -18759,6 +19111,8 @@ snapshots: transitivePeerDependencies: - ts-node + term-size@2.2.1: {} + text-table@0.2.0: {} then-request@6.0.2: From a618aca4cb39f6f4570fba37012576a8045abbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 5 Jun 2025 19:41:57 +0000 Subject: [PATCH 047/106] Fix issues (#479) * Checkin template for better way to work * Update template * Update scripts and gitignore * Update support scripts * Prepare init script * Add stdio attachments * Fix sdtio error by using duct * Add waiton * Update workspaces * Update submodules * Use workspace to test template * Add tracing * Update regex --- .gitmodules | 3 + Cargo.lock | 43 ++- Cargo.toml | 1 + crates/init/src/copy.rs | 29 +- crates/init/src/file_utils.rs | 20 +- crates/init/src/lib.rs | 54 +++- crates/init/src/package_json.rs | 1 + crates/support-scripts/Cargo.toml | 1 + crates/support-scripts/src/lib.rs | 33 ++- pnpm-lock.yaml | 408 +++++++------------------- pnpm-workspace.yaml | 9 +- templates/default/.gitignore | 2 - templates/default/client/package.json | 11 +- templates/default/lib/risc0-ethereum | 1 + templates/default/package.json | 8 +- 15 files changed, 269 insertions(+), 355 deletions(-) create mode 160000 templates/default/lib/risc0-ethereum diff --git a/.gitmodules b/.gitmodules index 648ceda5b9..b8ad5e5e47 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "examples/CRISP/lib/risc0-ethereum"] path = examples/CRISP/lib/risc0-ethereum url = https://github.com/risc0/risc0-ethereum +[submodule "templates/default/lib/risc0-ethereum"] + path = templates/default/lib/risc0-ethereum + url = https://github.com/gnosisguild/risc0-ethereum diff --git a/Cargo.lock b/Cargo.lock index 391e7f276a..880d8ba2de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2328,6 +2328,18 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" +[[package]] +name = "duct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ce170a0e8454fa0f9b0e5ca38a6ba17ed76a50916839d217eb5357e05cdfde" +dependencies = [ + "libc", + "os_pipe", + "shared_child", + "shared_thread", +] + [[package]] name = "dunce" version = "1.0.5" @@ -2718,6 +2730,7 @@ name = "e3-support-scripts" version = "0.1.0" dependencies = [ "anyhow", + "duct", "tokio", ] @@ -5332,6 +5345,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "os_pipe" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "overload" version = "0.1.1" @@ -6430,7 +6453,7 @@ dependencies = [ "security-framework 3.2.0", "security-framework-sys", "webpki-root-certs 0.26.11", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6718,6 +6741,22 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared_child" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e297bd52991bbe0686c086957bee142f13df85d1e79b0b21630a99d374ae9dc" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "shared_thread" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a6f98357c6bb0ebace19b22220e5543801d9de90ffe77f8abb27c056bac064" + [[package]] name = "shell-words" version = "1.1.0" @@ -7777,7 +7816,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index aec06dfc3f..1b25a3d2b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -105,6 +105,7 @@ clap = { version = "4.5.17", features = ["derive"] } compile-time = "0.2.0" dirs = "5.0.1" dialoguer = "0.11.0" +duct = "1.0.0" eyre = { version = "0.6.12" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/crates/init/src/copy.rs b/crates/init/src/copy.rs index 0749484fe0..3c885c4b08 100644 --- a/crates/init/src/copy.rs +++ b/crates/init/src/copy.rs @@ -80,10 +80,13 @@ async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> // Apply sed replacement to each matching file for file_path in files.lines().filter(|line| !line.is_empty()) { let sed_cmd = format!( - "s/{}/{}/g", + "s|{}|{}|g", escape_sed_pattern(&filter.search_pattern), escape_sed_replacement(&filter.replacement) ); + + println!("Running sed..."); + println!("> {}", sed_cmd); let sed_output = Command::new("sed") .arg("-i") .arg(sed_cmd) @@ -91,7 +94,7 @@ async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> .output() .await .context("Failed to execute sed command")?; - + println!("{:?}", sed_output); if !sed_output.status.success() { let stderr = String::from_utf8_lossy(&sed_output.stderr); bail!("sed command failed on {}: {}", file_path, stderr); @@ -102,17 +105,19 @@ async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> } fn escape_sed_pattern(pattern: &str) -> String { - // Escape special sed characters in the search pattern - pattern - .replace('\\', r"\\") - .replace('/', r"\/") - .replace('&', r"\&") + pattern.replace("|", "\\|") // Only escape the pipe delimiter } fn escape_sed_replacement(replacement: &str) -> String { - // Escape special sed characters in the replacement string - replacement - .replace('\\', r"\\") - .replace('/', r"\/") - .replace('&', r"\&") + // Don't escape backslashes that are followed by digits (backreferences like \1, \2, etc.) + let mut result = replacement.to_string(); + + // First escape literal backslashes (but not backreferences) + // This is tricky - we need to escape \ that aren't part of \1, \2, etc. + + // Simple approach: only escape the delimiter and ampersand + result = result.replace("|", "\\|"); // Escape pipe delimiter + result = result.replace("&", "\\&"); // Escape ampersand + + result } diff --git a/crates/init/src/file_utils.rs b/crates/init/src/file_utils.rs index e6afbfe00f..cf2ad3fa42 100644 --- a/crates/init/src/file_utils.rs +++ b/crates/init/src/file_utils.rs @@ -26,11 +26,12 @@ pub async fn ensure_empty_folder>(path: P) -> Result<()> { pub async fn delete_path>(path: P) -> Result<()> { let path = path.as_ref(); - - if path.is_dir() { - fs::remove_dir_all(path).await?; - } else { - fs::remove_file(path).await?; + if path.exists() { + if path.is_dir() { + fs::remove_dir_all(path).await?; + } else { + fs::remove_file(path).await?; + } } Ok(()) @@ -45,3 +46,12 @@ pub async fn chmod_recursive>(path: P, mode: &str) -> Result<()> .await?; Ok(()) } + +pub async fn move_file, Q: AsRef>(src: P, dst: Q) -> Result<()> { + Command::new("mv") + .arg(src.as_ref()) + .arg(dst.as_ref()) + .status() + .await?; + Ok(()) +} diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 273d91110d..fa6a4bebe6 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -7,7 +7,7 @@ mod pkgman; use anyhow::Result; use copy::Filter; -use file_utils::chmod_recursive; +use file_utils::{chmod_recursive, delete_path, move_file}; use git_url::GitUrl; use package_json::DependencyType; use pkgman::PkgMan; @@ -16,7 +16,8 @@ use std::path::PathBuf; use std::str::FromStr; use tokio::fs; -const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; +const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-1"; +// const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; const TEMPLATE_FOLDER: &str = "templates/default"; const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; @@ -28,27 +29,52 @@ pub async fn execute(location: Option) -> Result<()> { Some(loc) => loc, None => env::current_dir()?, }; + + println!("Ensuring tmp folder does not exist..."); if fs::try_exists(TEMP_DIR).await? { fs::remove_dir_all(TEMP_DIR).await?; } + println!("Ensuring cwd is empty..."); file_utils::ensure_empty_folder(&cwd).await?; + + println!("Start git clone..."); git::shallow_clone(&repo.repo_url, &repo.branch, TEMP_DIR).await?; - let version = package_json::get_version_from_package_json( + println!("Getting workspace version for enclave..."); + let evm_version = package_json::get_version_from_package_json( &PathBuf::from(TEMP_DIR).join("packages/evm/package.json"), ) .await?; + println!("Getting workspace version for enclave_react..."); + let react_version = package_json::get_version_from_package_json( + &PathBuf::from(TEMP_DIR).join("packages/enclave-react/package.json"), + ) + .await?; + + println!("Copy with filters..."); copy::copy_with_filters( &PathBuf::from(TEMP_DIR).join(TEMPLATE_FOLDER), &cwd, &vec![ - Filter::new(".gitignore", "/deployments$", ""), - Filter::new("package.json", "workspace:\\*", &version), + Filter::new( + "package.json", + "\"@gnosis-guild/enclave\":\\s*\"[^\"]*\"", + &format!("\"@gnosis-guild/enclave\": \"{}\"", evm_version), + ), + Filter::new( + "package.json", + "\"@gnosis-guild/enclave-react\":\\s*\"[^\"]*\"", + &format!("\"@gnosis-guild/enclave-react\": \"{}\"", react_version), + ), ], ) .await?; + println!("Resetting support folder..."); + delete_path(&cwd.join(".enclave")).await?; + + println!("Setting up support folders..."); copy::copy_with_filters( &PathBuf::from(TEMP_DIR).join("crates/support-scripts/ctl"), &cwd.join(".enclave/support/ctl"), @@ -56,14 +82,27 @@ pub async fn execute(location: Option) -> Result<()> { ) .await?; + println!("Removing template ignore files..."); + delete_path(&cwd.join(".gitignore")).await?; + + println!("Using bak files for ignores..."); + move_file(&cwd.join(".gitignore.bak"), &cwd.join(".gitignore")).await?; + + println!("Remove lib folder..."); + delete_path(&cwd.join("lib")).await?; + // We need to make these chmod 777 because the dockerfile needs to be able to successfully // write to them. There are better ways to do this but right now this is the most efficient. // PRs/Ideas welcome. + // + println!("Fixing permissions..."); chmod_recursive(&cwd.join("contracts"), "777").await?; chmod_recursive(&cwd.join("tests"), "777").await?; + println!("Initializing repository..."); git::init(&cwd).await?; + println!("Setting up submodule..."); git::add_submodule( &cwd, "https://github.com/gnosisguild/risc0-ethereum", @@ -71,6 +110,7 @@ pub async fn execute(location: Option) -> Result<()> { ) .await?; + println!("Ensuring package is in json..."); package_json::add_package_to_json( &cwd.join("package.json"), "@risc0/ethereum", @@ -79,10 +119,14 @@ pub async fn execute(location: Option) -> Result<()> { ) .await?; + println!("Running pnpm install..."); let npm = PkgMan::new(pkgman::PkgManKind::PNPM)?.with_cwd(&cwd); npm.run(&["install"]).await?; + println!("Adding everything to git..."); git::add_all(&cwd).await?; + + println!("Committing..."); git::commit(&cwd, "Initial Commit").await?; Ok(()) diff --git a/crates/init/src/package_json.rs b/crates/init/src/package_json.rs index 9b66f3bffc..e493564ecd 100644 --- a/crates/init/src/package_json.rs +++ b/crates/init/src/package_json.rs @@ -22,6 +22,7 @@ impl DependencyType { } pub async fn get_version_from_package_json(file_path: &PathBuf) -> Result { + println!("json path: {:?}", file_path); let content = fs::read_to_string(file_path).await?; let json: Value = serde_json::from_str(&content)?; diff --git a/crates/support-scripts/Cargo.toml b/crates/support-scripts/Cargo.toml index 114a278a72..f1bba03b34 100644 --- a/crates/support-scripts/Cargo.toml +++ b/crates/support-scripts/Cargo.toml @@ -9,3 +9,4 @@ repository.workspace = true [dependencies] anyhow.workspace = true tokio.workspace = true +duct.workspace = true diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 34bf083fd2..c32285efe4 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -1,30 +1,35 @@ use anyhow::{bail, Result}; +use duct::cmd; use std::{env, path::PathBuf}; +use tokio::fs; use tokio::signal; -use tokio::{fs, process::Command}; async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { println!("run_bash_script: {:?} {:?} {:?}", cwd, script, args); - let mut cmd = Command::new("bash"); - cmd.current_dir(cwd).arg(script).kill_on_drop(true); - for arg in args { - cmd.arg(arg); - } + // Build the command using cmd! macro for cleaner syntax + let mut cmd_args = vec!["bash".to_string(), script.to_string_lossy().to_string()]; + cmd_args.extend(args.iter().map(|s| s.to_string())); + + let expression = cmd("bash", &cmd_args[1..]).dir(cwd); - let mut child = cmd.spawn()?; + let handle = expression.start()?; tokio::select! { - result = child.wait() => { - let status = result?; - if status.success() { - Ok(()) - } else { - bail!("{} failed with exit code: {:?}", script.display(), status.code()); + result = async { handle.wait() } => { + match result { + Ok(output) => { + if output.status.success() { + Ok(()) + } else { + bail!("{} failed with exit code: {:?}", script.display(), output.status.code()); + } + } + Err(e) => Err(e.into()), } } _ = signal::ctrl_c() => { - let _ = child.kill().await; + let _ = handle.kill(); bail!("Script interrupted by user"); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07ef4f8ec8..ed9a1e8fd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,7 +183,7 @@ importers: version: 1.9.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) ethers: specifier: ^6.12.0 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -216,7 +216,7 @@ importers: version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -276,178 +276,6 @@ importers: specifier: ^3.3.0 version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) - examples/basic: - devDependencies: - '@gnosis-guild/enclave': - specifier: workspace:* - version: link:../../packages/evm - '@nomicfoundation/hardhat-chai-matchers': - specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.0 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-toolbox': - specifier: ^5.0.0 - version: 5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2) - '@nomicfoundation/hardhat-verify': - specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@openzeppelin/contracts': - specifier: 5.3.0 - version: 5.3.0 - '@typechain/ethers-v6': - specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': - specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) - '@types/chai': - specifier: ^4.2.0 - version: 4.3.20 - '@types/express': - specifier: ^5.0.2 - version: 5.0.2 - '@types/mocha': - specifier: '>=9.1.0' - version: 10.0.10 - '@types/node': - specifier: '>=18.0.0' - version: 20.10.4 - chai: - specifier: ^4.2.0 - version: 4.5.0 - concurrently: - specifier: ^9.1.2 - version: 9.1.2 - ethers: - specifier: ^6.4.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - express: - specifier: ^5.1.0 - version: 5.1.0 - hardhat: - specifier: ^2.14.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-deploy: - specifier: ^0.12.1 - version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat-gas-reporter: - specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: - specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) - typechain: - specifier: ^8.3.0 - version: 8.3.2(typescript@5.8.3) - typed-rpc: - specifier: ^6.1.1 - version: 6.1.1 - typescript: - specifier: '>=4.5.0' - version: 5.8.3 - - examples/basic/client: - dependencies: - '@gnosis-guild/enclave': - specifier: workspace:* - version: link:../../../packages/evm - '@gnosis-guild/enclave-react': - specifier: workspace:* - version: link:../../../packages/enclave-react - '@phosphor-icons/react': - specifier: ^2.1.4 - version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query': - specifier: ^5.74.3 - version: 5.80.5(react@18.3.1) - '@wagmi/core': - specifier: ^2.14.16 - version: 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) - connectkit: - specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - viem: - specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: - specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - devDependencies: - '@tailwindcss/typography': - specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) - '@types/react': - specifier: ^18.2.66 - version: 18.3.23 - '@types/react-dom': - specifier: ^18.2.22 - version: 18.3.7(@types/react@18.3.23) - '@typescript-eslint/eslint-plugin': - specifier: ^7.2.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^7.2.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) - '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) - autoprefixer: - specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.4) - eslint: - specifier: ^8.57.0 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.6 - version: 0.4.20(eslint@8.57.1) - prettier: - specifier: ^3.2.5 - version: 3.5.3 - prettier-plugin-tailwindcss: - specifier: ^0.5.13 - version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) - tailwindcss: - specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) - typescript: - specifier: ^5.2.2 - version: 5.8.3 - vite: - specifier: ^5.2.0 - version: 5.4.19(@types/node@22.7.5) - vite-plugin-top-level-await: - specifier: ^1.4.1 - version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) - vite-plugin-wasm: - specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) - packages/enclave-react: dependencies: '@gnosis-guild/enclave': @@ -461,7 +289,7 @@ importers: version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@types/react': specifier: ^18.2.0 @@ -609,6 +437,96 @@ importers: specifier: ^5.8.3 version: 5.8.3 + templates/default: + devDependencies: + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../../packages/evm + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.0 + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.0 + version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition-ethers': + specifier: ^0.15.0 + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^5.0.0 + version: 5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.0 + version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': + specifier: 5.3.0 + version: 5.3.0 + '@risc0/ethereum': + specifier: file:lib/risc0-ethereum + version: file:templates/default/lib/risc0-ethereum + '@typechain/ethers-v6': + specifier: ^0.5.0 + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.20 + '@types/express': + specifier: ^5.0.2 + version: 5.0.2 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.10 + '@types/node': + specifier: '>=18.0.0' + version: 20.10.4 + chai: + specifier: ^4.2.0 + version: 4.5.0 + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + ethers: + specifier: ^6.4.0 + version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + express: + specifier: ^5.1.0 + version: 5.1.0 + hardhat: + specifier: ^2.14.0 + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-deploy: + specifier: ^0.12.1 + version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + typechain: + specifier: ^8.3.0 + version: 8.3.2(typescript@5.8.3) + typed-rpc: + specifier: ^6.1.1 + version: 6.1.1 + typescript: + specifier: '>=4.5.0' + version: 5.8.3 + wait-on: + specifier: ^8.0.3 + version: 8.0.3 + packages: '@adraffy/ens-normalize@1.10.0': @@ -2681,6 +2599,9 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': + resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} + '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} @@ -9023,7 +8944,7 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.27.6 jsesc: 2.5.2 source-map: 0.5.7 @@ -11685,6 +11606,8 @@ snapshots: - utf-8-validate - zod + '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} + '@rolldown/pluginutils@1.0.0-beta.9': {} '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': @@ -11813,8 +11736,8 @@ snapshots: '@scure/bip32@1.6.2': dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 '@scure/base': 1.2.6 '@scure/bip32@1.7.0': @@ -11840,7 +11763,7 @@ snapshots: '@scure/bip39@1.5.4': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.7.2 '@scure/base': 1.2.6 '@scure/bip39@1.6.0': @@ -12680,45 +12603,6 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': - dependencies: - '@coinbase/wallet-sdk': 4.3.0 - '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - supports-color - - uploadthing - - utf-8-validate - - zod - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 @@ -12734,21 +12618,6 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.8.3) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - optionalDependencies: - '@tanstack/query-core': 5.80.5 - typescript: 5.8.3 - transitivePeerDependencies: - - '@types/react' - - immer - - react - - use-sync-external-store - '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -14079,26 +13948,6 @@ snapshots: - '@babel/core' - react-is - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): - dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) - buffer: 6.0.3 - detect-browser: 5.3.0 - family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) - framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - qrcode: 1.5.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - transitivePeerDependencies: - - '@babel/core' - - react-is - console-browserify@1.2.0: {} constants-browserify@1.0.0: {} @@ -15192,13 +15041,6 @@ snapshots: viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -17658,10 +17500,10 @@ snapshots: ox@0.6.7(typescript@5.8.3)(zod@3.25.51): dependencies: '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) eventemitter3: 5.0.1 optionalDependencies: @@ -19808,44 +19650,6 @@ snapshots: - utf-8-validate - zod - wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): - dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) - '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) - react: 18.3.1 - use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/query-core' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - immer - - ioredis - - supports-color - - uploadthing - - utf-8-validate - - zod - wait-on@8.0.3: dependencies: axios: 1.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 15efbb06cd..1610d390cc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,8 +1,7 @@ packages: - - packages/evm - - packages/enclave-react + - docs - examples/CRISP - - examples/basic - - examples/basic/client - examples/CRISP/apps/client - - docs + - packages/enclave-react + - packages/evm + - templates/default diff --git a/templates/default/.gitignore b/templates/default/.gitignore index cf1fbc3a6a..b3200196c6 100644 --- a/templates/default/.gitignore +++ b/templates/default/.gitignore @@ -1,8 +1,6 @@ node_modules .env -/lib - # Hardhat files /cache /artifacts diff --git a/templates/default/client/package.json b/templates/default/client/package.json index d8bd53e68e..c1aa7d0a1b 100644 --- a/templates/default/client/package.json +++ b/templates/default/client/package.json @@ -16,8 +16,8 @@ "preview": "vite preview" }, "dependencies": { - "@gnosis-guild/enclave": "0.0.5-test.8*", - "@gnosis-guild/enclave-react": "0.0.5-test.8*", + "@gnosis-guild/enclave": "workspace:*", + "@gnosis-guild/enclave-react": "workspace:*", "@phosphor-icons/react": "^2.1.4", "@tanstack/react-query": "^5.74.3", "@wagmi/core": "^2.14.16", @@ -43,9 +43,10 @@ "tailwindcss": "^3.4.2", "typescript": "^5.2.2", "vite": "^5.2.0", - "vite-plugin-wasm": "^3.3.0", "vite-plugin-top-level-await": "^1.4.1", - "vite-tsconfig-paths": "^4.3.2" + "vite-plugin-wasm": "^3.3.0", + "vite-tsconfig-paths": "^4.3.2", + "wasm-pack": "^0.13.1" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" -} \ No newline at end of file +} diff --git a/templates/default/lib/risc0-ethereum b/templates/default/lib/risc0-ethereum new file mode 160000 index 0000000000..63a5dbe2dd --- /dev/null +++ b/templates/default/lib/risc0-ethereum @@ -0,0 +1 @@ +Subproject commit 63a5dbe2dd168065c7cf1b803cb01eff16904ef4 diff --git a/templates/default/package.json b/templates/default/package.json index 93c7429965..0220c00932 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "@gnosis-guild/enclave": "0.0.5-test.8*", + "@gnosis-guild/enclave": "workspace:*", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-ignition": "^0.15.0", @@ -27,7 +27,8 @@ "ts-node": "^10.9.2", "typechain": "^8.3.0", "typed-rpc": "^6.1.1", - "typescript": ">=4.5.0" + "typescript": ">=4.5.0", + "wait-on": "^8.0.3" }, "name": "enclave-example", "scripts": { @@ -36,7 +37,8 @@ "deploy": "hardhat run scripts/deploy-local.ts --network localhost", "deploy:dev": "hardhat run scripts/deploy-local.ts", "node": "hardhat node", - "program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", + "dev:frontend": "cd client && pnpm dev", + "dev:program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", "rpc": "ts-node ./server", "test": "hardhat test" From e5eaa79586084b52e77276db810315ba0c73f1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 6 Jun 2025 10:04:53 +0000 Subject: [PATCH 048/106] Get frontend working (#480) * Update branch * Update publishing for react-enclave * Use a workspace * Update bash * Update bashebang * Fix issue with git dependency * Fix git vx path * Remove package section * Add nixflake for nix users * Update template * Pass address to contract deployment * Add getImageId function * Remove parsing because it was not working * Update env injection * Update envs into command * Add dev:all command * Update template scripts * Update template * Point to hacknet * Add nix flake comment --- Cargo.toml | 1 - crates/cli/src/cli.rs | 14 ++- crates/cli/src/main.rs | 1 + crates/cli/src/print_env.rs | 51 ++++++++++ crates/cli/src/program.rs | 4 + crates/config/src/contract.rs | 1 + crates/init/src/lib.rs | 11 ++- packages/enclave-react/package.json | 95 ++++++++++--------- templates/default/.env.example | 4 + templates/default/.envrc | 1 + templates/default/.gitignore | 1 + templates/default/.gitignore.bak | 2 + templates/default/Cargo.toml | 4 + templates/default/README.md | 39 ++++++-- templates/default/client/package.json | 2 +- templates/default/client/wasm/Cargo.toml | 2 +- templates/default/client/wasm/build.sh | 47 +++++++++ .../contracts/Mocks/MockRISC0Verifier.sol | 14 +++ templates/default/deploy/default.ts | 32 +++++++ templates/default/enclave.config.yaml | 7 +- templates/default/flake.nix | 35 +++++++ templates/default/ignition/modules/Lock.ts | 20 ---- templates/default/package.json | 6 +- templates/default/pnpm-workspace.yaml.bak | 2 + 24 files changed, 310 insertions(+), 86 deletions(-) create mode 100644 crates/cli/src/print_env.rs create mode 100644 templates/default/.env.example create mode 100644 templates/default/.envrc create mode 100644 templates/default/Cargo.toml create mode 100755 templates/default/client/wasm/build.sh create mode 100644 templates/default/contracts/Mocks/MockRISC0Verifier.sol create mode 100644 templates/default/deploy/default.ts create mode 100644 templates/default/flake.nix delete mode 100644 templates/default/ignition/modules/Lock.ts create mode 100644 templates/default/pnpm-workspace.yaml.bak diff --git a/Cargo.toml b/Cargo.toml index 1b25a3d2b0..5751a1072d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ exclude = [ "examples/CRISP/apps/server", "examples/CRISP/apps/program", "examples/CRISP/apps/wasm-crypto", - "examples/basic/client/wasm", "examples/default/client/wasm", "examples/default", "crates/support" # client needs to be able to build this independently diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index 156d92d321..f02c493c8b 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -5,9 +5,9 @@ use crate::net::NetCommands; use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::program::{self, ProgramCommands}; -use crate::start; use crate::wallet::WalletCommands; use crate::{init, net, password, wallet, wizard}; +use crate::{print_env, start}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; use e3_config::validation::ValidUrl; @@ -134,6 +134,7 @@ impl Cli { bail!("Cannot run `enclave init` when a configuration exists."); } Commands::Compile => e3_support_scripts::program_compile().await?, + Commands::PrintEnv { vite, chain } => print_env::execute(&config, &chain, vite).await?, Commands::Program { command } => program::execute(command, &config).await?, Commands::Wizard { .. } => { bail!("Cannot run `enclave wizard` when a configuration exists."); @@ -186,6 +187,17 @@ pub enum Commands { peers: Vec, }, + /// Print the config env + PrintEnv { + /// Display vite addresses + #[arg(long)] + vite: bool, + + /// Chain name + #[arg(long)] + chain: String, + }, + /// Initialize an enclave project Init { /// Path to the location where the project should be initialized diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 8f22675a81..773a47f7f7 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -21,6 +21,7 @@ mod nodes_up; mod password; mod password_delete; mod password_set; +mod print_env; mod program; mod start; mod wallet; diff --git a/crates/cli/src/print_env.rs b/crates/cli/src/print_env.rs new file mode 100644 index 0000000000..92e7929621 --- /dev/null +++ b/crates/cli/src/print_env.rs @@ -0,0 +1,51 @@ +use anyhow::Result; +use e3_config::AppConfig; + +pub fn extract_env_vars_vite(config: &AppConfig, chain: &str) -> String { + let mut env_vars = Vec::new(); + + // Extract from first enabled chain (or first chain if none specified) + if let Some(chain) = config.chains().iter().find(|c| c.name == chain.to_string()) { + let enclave_addr = &chain.contracts.enclave; + let registry_addr = &chain.contracts.ciphernode_registry; + let filter_addr = &chain.contracts.filter_registry; + env_vars.push(format!("VITE_ENCLAVE_ADDRESS={}", enclave_addr.address())); + env_vars.push(format!("VITE_REGISTRY_ADDRESS={}", registry_addr.address())); + env_vars.push(format!( + "VITE_FILTER_REGISTRY_ADDRESS={}", + filter_addr.address() + )); + if let Some(e3_program) = &chain.contracts.e3_program { + env_vars.push(format!("VITE_E3_PROGRAM_ADDRESS={}", e3_program.address())); + } + } + + env_vars.join(" ") +} + +pub fn extract_env_vars(config: &AppConfig, chain: &str) -> String { + let mut env_vars = Vec::new(); + + // Extract from first enabled chain (or first chain if none specified) + if let Some(chain) = config.chains().iter().find(|c| c.name == chain.to_string()) { + let enclave_addr = &chain.contracts.enclave; + let registry_addr = &chain.contracts.ciphernode_registry; + let filter_addr = &chain.contracts.filter_registry; + env_vars.push(format!("ENCLAVE_ADDRESS={}", enclave_addr.address())); + env_vars.push(format!("REGISTRY_ADDRESS={}", registry_addr.address())); + env_vars.push(format!("FILTER_REGISTRY_ADDRESS={}", filter_addr.address())); + if let Some(e3_program) = &chain.contracts.e3_program { + env_vars.push(format!("E3_PROGRAM_ADDRESS={}", e3_program.address())); + } + } + + env_vars.join(" ") +} +pub async fn execute(config: &AppConfig, chain: &str, as_vite: bool) -> Result<()> { + if as_vite { + println!("{}", extract_env_vars_vite(config, chain)); + } else { + println!("{}", extract_env_vars(config, chain)); + } + Ok(()) +} diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index 26ea91cec1..05c5562b4b 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -14,6 +14,9 @@ pub enum ProgramCommands { #[arg(long)] chain: String, }, + + /// Compile the program code + Compile, } pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { @@ -24,6 +27,7 @@ pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> } => { e3_program_listener::execute(config, &chain, &json_rpc_server).await?; } + ProgramCommands::Compile => e3_support_scripts::program_compile().await?, }; Ok(()) diff --git a/crates/config/src/contract.rs b/crates/config/src/contract.rs index b2f83529f6..a7bf2a25ce 100644 --- a/crates/config/src/contract.rs +++ b/crates/config/src/contract.rs @@ -33,4 +33,5 @@ pub struct ContractAddresses { pub enclave: Contract, pub ciphernode_registry: Contract, pub filter_registry: Contract, + pub e3_program: Option, } diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index fa6a4bebe6..9e6fb53151 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -16,8 +16,8 @@ use std::path::PathBuf; use std::str::FromStr; use tokio::fs; -const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-1"; -// const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; +// const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-2"; +const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; const TEMPLATE_FOLDER: &str = "templates/default"; const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; @@ -88,6 +88,13 @@ pub async fn execute(location: Option) -> Result<()> { println!("Using bak files for ignores..."); move_file(&cwd.join(".gitignore.bak"), &cwd.join(".gitignore")).await?; + println!("Move bak files for workspace..."); + move_file( + &cwd.join("pnpm-workspace.yaml.bak"), + &cwd.join("pnpm-workspace.yaml"), + ) + .await?; + println!("Remove lib folder..."); delete_path(&cwd.join("lib")).await?; diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index d83f6a470e..622311f883 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,48 +1,49 @@ { - "name": "@gnosis-guild/enclave-react", - "version": "0.1.0", - "description": "React hooks and utilities for Enclave SDK", - "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "sideEffects": false, - "files": [ - "dist" - ], - "scripts": { - "build": "tsc", - "dev": "tsc --watch", - "clean": "rm -rf dist", - "prepublishOnly": "npm run clean && npm run build" - }, - "keywords": [ - "react", - "hooks", - "enclave", - "encryption", - "fhe", - "e3" - ], - "author": { - "name": "gnosisguild", - "url": "https://github.com/gnosisguild" - }, - "license": "LGPL-3.0-only", - "peerDependencies": { - "react": "^18.2.0", - "wagmi": "^2.14.16", - "viem": "^2.30.6" - }, - "dependencies": { - "@gnosis-guild/enclave": "workspace:*" - }, - "devDependencies": { - "@types/react": "^18.2.0", - "typescript": "^5.8.3" - }, - "repository": { - "type": "git", - "url": "https://github.com/gnosisguild/enclave.git", - "directory": "packages/enclave-react" - } -} \ No newline at end of file + "name": "@gnosis-guild/enclave-react", + "version": "0.0.5-test.8", + "description": "React hooks and utilities for Enclave SDK", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "sideEffects": false, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist", + "prepublishOnly": "pnpm run clean && pnpm run build", + "release": "pnpm publish" + }, + "keywords": [ + "react", + "hooks", + "enclave", + "encryption", + "fhe", + "e3" + ], + "author": { + "name": "gnosisguild", + "url": "https://github.com/gnosisguild" + }, + "license": "LGPL-3.0-only", + "peerDependencies": { + "react": "^18.2.0", + "wagmi": "^2.14.16", + "viem": "^2.30.6" + }, + "dependencies": { + "@gnosis-guild/enclave": "workspace:*" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "typescript": "^5.8.3" + }, + "repository": { + "type": "git", + "url": "https://github.com/gnosisguild/enclave.git", + "directory": "packages/enclave-react" + } +} diff --git a/templates/default/.env.example b/templates/default/.env.example new file mode 100644 index 0000000000..2d1be41eef --- /dev/null +++ b/templates/default/.env.example @@ -0,0 +1,4 @@ +E3_PROGRAM_ADDRESS=0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 +ENCLAVE_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 +REGISTRY_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F +FILTER_REGISTRY_ADDRESS=0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 diff --git a/templates/default/.envrc b/templates/default/.envrc new file mode 100644 index 0000000000..3550a30f2d --- /dev/null +++ b/templates/default/.envrc @@ -0,0 +1 @@ +use flake diff --git a/templates/default/.gitignore b/templates/default/.gitignore index b3200196c6..48122db231 100644 --- a/templates/default/.gitignore +++ b/templates/default/.gitignore @@ -1,5 +1,6 @@ node_modules .env +.direnv # Hardhat files /cache diff --git a/templates/default/.gitignore.bak b/templates/default/.gitignore.bak index e3dc803341..14cac8c81b 100644 --- a/templates/default/.gitignore.bak +++ b/templates/default/.gitignore.bak @@ -1,6 +1,8 @@ node_modules .env +.direnv + /.enclave # Hardhat files diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml new file mode 100644 index 0000000000..8cd1b5f3c0 --- /dev/null +++ b/templates/default/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "client/wasm" +] diff --git a/templates/default/README.md b/templates/default/README.md index 704f9219e1..a14f5ac6e6 100644 --- a/templates/default/README.md +++ b/templates/default/README.md @@ -30,12 +30,20 @@ rustc 1.85.1 (4eb161250 2025-03-15) Linux/POSIX environment +Note for Nix users a Nix flake is included within the generated template. + ### Install Enclave ``` cargo install --git https://github.com/gnosisguild/enclave e3-cli ``` +### install wasm-pack + +``` +cargo install wasm-pack +``` + ### Generate Template ``` @@ -46,11 +54,18 @@ enclave init ./myproj cd ./myproj ``` -### Install Dependencies +### Run all services -```bash -pnpm install ``` +pnpm dev:all +``` + +This will run: + +- `pnpm node` - hardhat eth node +- `pnpm rpc` - Server to accept computation output and post on chain +- `enclave program listen` - Server to listen to onchain events and compute over encrypted inputs then send to the rpc server +- `pnpm dev:frontend` - Run the frontend for the template ### Start Local Hardhat Node @@ -60,6 +75,15 @@ pnpm node Enclave contracts should be automatically deployed. +### Compiling your program + +Use the following command to compile your program: + +``` +enclave program compile +``` + +This should create an `ImageID.sol` contract within the `./contracts` folder. ### Your FHE program @@ -82,10 +106,10 @@ Your RPC must provide the following methods: ```ts type Capabilities = "processOutput" | "shouldCompute"; -interface RpcServer{ - // Handle the FHE - processOutput(e3Id: number, proof: string, ciphertext: string) : number; - capabilities() : Capabilities +interface RpcServer { + // Handle the FHE + processOutput(e3Id: number, proof: string, ciphertext: string): number; + capabilities(): Capabilities; } ``` @@ -101,7 +125,6 @@ enclave program listen \ This will listen to your local hardhat node and trigger computations when the E3 round has expired. - ## Usage Commands ### Ciphernode Management diff --git a/templates/default/client/package.json b/templates/default/client/package.json index c1aa7d0a1b..2e8fc7e7f8 100644 --- a/templates/default/client/package.json +++ b/templates/default/client/package.json @@ -9,7 +9,7 @@ }, "homepage": "https://github.com/gnosisguild/enclave", "scripts": { - "build-wasm": "command -v wasm-pack >/dev/null 2>&1 || { echo 'Error: wasm-pack is not installed. Please install it by running: cargo install wasm-pack'; exit 1; }; [ ! -f libs/wasm/pkg/wasm_crypto.js ] && (cd wasm && wasm-pack build --target web --release --out-dir ../libs/wasm/pkg) || echo 'WASM package already exists'", + "build-wasm": "./wasm/build.sh", "dev": "npm run build-wasm && vite --no-open --host", "build": "npm run build-wasm && tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", diff --git a/templates/default/client/wasm/Cargo.toml b/templates/default/client/wasm/Cargo.toml index d0c26e5e3e..66cbe9237c 100644 --- a/templates/default/client/wasm/Cargo.toml +++ b/templates/default/client/wasm/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -e3-bfv-helpers = { path = "../../../../crates/bfv-helpers" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave.git", branch = "hacknet" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/templates/default/client/wasm/build.sh b/templates/default/client/wasm/build.sh new file mode 100755 index 0000000000..1dd8700df9 --- /dev/null +++ b/templates/default/client/wasm/build.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -e + +# Check if wasm-pack is installed +if ! command -v wasm-pack >/dev/null 2>&1; then + echo 'Error: wasm-pack is not installed. Please install it by running:' + echo 'cargo install wasm-pack' + exit 1 +fi + +# Function to check if wasm32 target is available +check_wasm_target() { + rustc --print target-list | grep -q wasm32-unknown-unknown +} + +# Function to try installing wasm32 target +install_wasm_target() { + if command -v rustup >/dev/null 2>&1; then + echo "Installing wasm32-unknown-unknown target..." + rustup target add wasm32-unknown-unknown + return 0 + else + echo "Rustup not found. Cannot install wasm32-unknown-unknown target automatically." + echo "For Nix users: Please ensure your development environment includes the wasm32 target." + echo "You may need to add it to your shell.nix or flake.nix configuration." + return 1 + fi +} + +# Check if wasm32 target is available +if ! check_wasm_target; then + echo "wasm32-unknown-unknown target not found" + + # Try to install it + if ! install_wasm_target; then + exit 1 + fi +fi + +# Build WASM package if it doesn't exist +if [ ! -f libs/wasm/pkg/wasm_crypto.js ]; then + echo 'Building WASM package...' + cd wasm && wasm-pack build --target web --release --out-dir ../libs/wasm/pkg +else + echo 'WASM package already exists' +fi diff --git a/templates/default/contracts/Mocks/MockRISC0Verifier.sol b/templates/default/contracts/Mocks/MockRISC0Verifier.sol new file mode 100644 index 0000000000..181ca8216c --- /dev/null +++ b/templates/default/contracts/Mocks/MockRISC0Verifier.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IRiscZeroVerifier, Receipt} from "@risc0/ethereum/contracts/src/IRiscZeroVerifier.sol"; + +contract MockRISC0Verifier is IRiscZeroVerifier { + function verify( + bytes calldata seal, + bytes32 imageId, + bytes32 journalDigest + ) public view override {} + + function verifyIntegrity(Receipt calldata receipt) external view override {} +} diff --git a/templates/default/deploy/default.ts b/templates/default/deploy/default.ts new file mode 100644 index 0000000000..4345a0a741 --- /dev/null +++ b/templates/default/deploy/default.ts @@ -0,0 +1,32 @@ +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { + const { deployer } = await hre.getNamedAccounts(); + const { deploy } = hre.deployments; + + const verifier = await deploy("MockRISC0Verifier", { + from: deployer, + args: [], + log: true, + }); + + const imageId = await deploy("ImageID", { + from: deployer, + args: [], + log: true, + }); + const imageIdContract = await hre.ethers.getContractAt( + "ImageID", + imageId.address, + ); + const programId = await imageIdContract.PROGRAM_ID(); + + const e3Program = await deploy("MyProgram", { + from: deployer, + args: [verifier.address, programId], + log: true, + }); +}; +export default func; +func.tags = ["default"]; diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml index 4825b41651..a2be7d04e3 100644 --- a/templates/default/enclave.config.yaml +++ b/templates/default/enclave.config.yaml @@ -2,9 +2,10 @@ chains: - name: "hardhat" rpc_url: "ws://localhost:8545" contracts: - enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" - ciphernode_registry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" - filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" + e3_program: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + enclave: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" + ciphernode_registry: "0x0165878A594ca255338adfa4d48449f69242Eb8F" + filter_registry: "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" nodes: cn1: diff --git a/templates/default/flake.nix b/templates/default/flake.nix new file mode 100644 index 0000000000..ae5a41dbb2 --- /dev/null +++ b/templates/default/flake.nix @@ -0,0 +1,35 @@ +{ + description = "Rust + WASM development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + rust-overlay.url = "github:oxalica/rust-overlay"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + nixpkgs, + rust-overlay, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem (system: let + overlays = [(import rust-overlay)]; + pkgs = import nixpkgs { + inherit system overlays; + }; + + rustToolchain = pkgs.rust-bin.stable."1.85.1".default.override { + targets = ["wasm32-unknown-unknown"]; + }; + in { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + rustToolchain + wasm-pack + nodejs + nodePackages.pnpm + ]; + }; + }); +} diff --git a/templates/default/ignition/modules/Lock.ts b/templates/default/ignition/modules/Lock.ts deleted file mode 100644 index 9ee4a2f1bb..0000000000 --- a/templates/default/ignition/modules/Lock.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This setup uses Hardhat Ignition to manage smart contract deployments. -// Learn more about it at https://hardhat.org/ignition - -import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; - -const JAN_1ST_2030 = 1893456000; -const ONE_GWEI: bigint = 1_000_000_000n; - -const LockModule = buildModule("LockModule", (m) => { - const unlockTime = m.getParameter("unlockTime", JAN_1ST_2030); - const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); - - const lock = m.contract("Lock", [unlockTime], { - value: lockedAmount, - }); - - return { lock }; -}); - -export default LockModule; diff --git a/templates/default/package.json b/templates/default/package.json index 0220c00932..4e05e968e6 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -37,8 +37,10 @@ "deploy": "hardhat run scripts/deploy-local.ts --network localhost", "deploy:dev": "hardhat run scripts/deploy-local.ts", "node": "hardhat node", - "dev:frontend": "cd client && pnpm dev", - "dev:program": "concurrently \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", + "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile", + "dev:all": "concurrently -r \"pnpm node\" \"wait-on http://localhost:8545 && pnpm dev:program\" \"pnpm dev:frontend\"", + "dev:frontend": "cd client && (export $(enclave print-env --vite --chain hardhat) && pnpm dev)", + "dev:program": "concurrently -r \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", "rpc": "ts-node ./server", "test": "hardhat test" diff --git a/templates/default/pnpm-workspace.yaml.bak b/templates/default/pnpm-workspace.yaml.bak new file mode 100644 index 0000000000..a9f19eb4e2 --- /dev/null +++ b/templates/default/pnpm-workspace.yaml.bak @@ -0,0 +1,2 @@ +packages: + - client From 306196542750dd9c0c9f8d1fe2ef76a32e00bd87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 6 Jun 2025 12:19:03 +0000 Subject: [PATCH 049/106] Add enclave nodes up (#481) * Update template * Add ciphernode script --- templates/default/flake.lock | 96 +++++++++++++++++++ templates/default/package.json | 5 +- .../default/scripts/run_local_ciphernodes.sh | 42 ++++++++ 3 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 templates/default/flake.lock create mode 100755 templates/default/scripts/run_local_ciphernodes.sh diff --git a/templates/default/flake.lock b/templates/default/flake.lock new file mode 100644 index 0000000000..6d5c2012d8 --- /dev/null +++ b/templates/default/flake.lock @@ -0,0 +1,96 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1748929857, + "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1744536153, + "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1749177458, + "narHash": "sha256-9HNq3EHZIvvxXQyEn0sYOywcESF1Xqw2Q8J1ZewcXuk=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "d58933b88cef7a05e9677e94352fd6fedba402cd", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/templates/default/package.json b/templates/default/package.json index 4e05e968e6..30b1da6ef3 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -36,9 +36,10 @@ "compile": "hardhat compile", "deploy": "hardhat run scripts/deploy-local.ts --network localhost", "deploy:dev": "hardhat run scripts/deploy-local.ts", - "node": "hardhat node", + "dev:evm": "hardhat node", "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile", - "dev:all": "concurrently -r \"pnpm node\" \"wait-on http://localhost:8545 && pnpm dev:program\" \"pnpm dev:frontend\"", + "dev:ciphernodes": "./scripts/run_local_ciphernodes.sh", + "dev:all": "concurrently -r \"pnpm node\" \"pnpm dev:ciphernodes\" \"wait-on http://localhost:8545 && pnpm dev:program\" \"pnpm dev:frontend\"", "dev:frontend": "cd client && (export $(enclave print-env --vite --chain hardhat) && pnpm dev)", "dev:program": "concurrently -r \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", diff --git a/templates/default/scripts/run_local_ciphernodes.sh b/templates/default/scripts/run_local_ciphernodes.sh new file mode 100755 index 0000000000..cfad60997f --- /dev/null +++ b/templates/default/scripts/run_local_ciphernodes.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cleanup() { + echo "Cleaning up processes..." + enclave nodes down + echo "Cleanup complete" + exit 0 +} + +trap cleanup INT TERM + +echo "Waiting for local evm node..." +pnpm wait-on http://localhost:8545 + +# nuke past installations as we are adding these nodes to the contract +rm -rf .enclave/data +rm -rf .enclave/config + +PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + +enclave wallet set --name ag --private-key "$PRIVATE_KEY" + +# using & instead of -d so that wait works below +enclave nodes up -v & + +sleep 2 + +CN1=$(cat enclave.config.yaml | yq '.nodes.cn1.address') +CN2=$(cat enclave.config.yaml | yq '.nodes.cn2.address') +CN3=$(cat enclave.config.yaml | yq '.nodes.cn3.address') + +cd /app + + +# Add ciphernodes using variables from config.sh +pnpm ciphernode:add --ciphernode-address "$CN1" --network "localhost" +pnpm ciphernode:add --ciphernode-address "$CN2" --network "localhost" +pnpm ciphernode:add --ciphernode-address "$CN3" --network "localhost" + +wait From 55619bee6aa2822d7bd66c2b8b17d39375ea3408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 6 Jun 2025 14:38:17 +0000 Subject: [PATCH 050/106] Add test to program (#483) * Add test to program * Tidy up scripts * Make git template configurable * Update git parsing --- Cargo.lock | 1 + crates/cli/src/cli.rs | 6 +- crates/cli/src/init.rs | 4 +- crates/init/Cargo.toml | 1 + crates/init/src/git.rs | 58 + crates/init/src/git_url.rs | 106 - crates/init/src/lib.rs | 21 +- templates/default/.gitignore | 2 + templates/default/.gitignore.bak | 2 + templates/default/Cargo.lock | 5884 +++++++++++++++++ templates/default/Cargo.toml | 9 +- templates/default/flake.nix | 1 + templates/default/package.json | 10 +- templates/default/program/Cargo.toml | 4 + templates/default/program/src/lib.rs | 52 +- ...ocal_ciphernodes.sh => dev_ciphernodes.sh} | 0 templates/default/scripts/dev_frontend.sh | 5 + templates/default/scripts/dev_program.sh | 8 + 18 files changed, 6049 insertions(+), 125 deletions(-) delete mode 100644 crates/init/src/git_url.rs create mode 100644 templates/default/Cargo.lock rename templates/default/scripts/{run_local_ciphernodes.sh => dev_ciphernodes.sh} (100%) create mode 100755 templates/default/scripts/dev_frontend.sh create mode 100755 templates/default/scripts/dev_program.sh diff --git a/Cargo.lock b/Cargo.lock index 880d8ba2de..6e23c86432 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2609,6 +2609,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "url", ] [[package]] diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index f02c493c8b..dcef361341 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -84,7 +84,7 @@ impl Cli { { // Existing init branch match self.command { - Commands::Init {path} => init::execute(path).await?, + Commands::Init {path, template} => init::execute(path, template).await?, Commands::Wizard { rpc_url, eth_address, @@ -202,6 +202,10 @@ pub enum Commands { Init { /// Path to the location where the project should be initialized path: Option, + + /// Template repository to use. Expecting the form `git+https://github.com/gnosisguild/enclave.git#hacknet:template/default` + #[arg(long)] + template: Option, }, /// Compile an Enclave project diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 3fd330b977..413f780a00 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -2,6 +2,6 @@ use std::path::PathBuf; use anyhow::Result; -pub async fn execute(location: Option) -> Result<()> { - e3_init::execute(location).await +pub async fn execute(location: Option, template: Option) -> Result<()> { + e3_init::execute(location, template).await } diff --git a/crates/init/Cargo.toml b/crates/init/Cargo.toml index d54176ac8b..b5f4e3c92b 100644 --- a/crates/init/Cargo.toml +++ b/crates/init/Cargo.toml @@ -14,3 +14,4 @@ async-recursion.workspace = true serde_json.workspace = true serde.workspace = true async-trait.workspace = true +url.workspace = true diff --git a/crates/init/src/git.rs b/crates/init/src/git.rs index 5007a4c819..1e3692a1ed 100644 --- a/crates/init/src/git.rs +++ b/crates/init/src/git.rs @@ -2,6 +2,7 @@ use std::path::Path; use anyhow::{Context, Result}; use tokio::process::Command; +use url::Url; pub async fn shallow_clone(git_repo: &str, branch: &str, target_folder: &str) -> Result<()> { Command::new("git") @@ -91,3 +92,60 @@ pub async fn add_submodule( })?; Ok(()) } + +#[derive(Debug)] +pub struct GitReference { + pub base_url: String, + pub branch: Option, + pub path: Option, +} + +pub fn parse_git_url(input: String) -> Result { + let url = Url::parse(&input)?; + + // Remove git+ prefix and fragment to get base URL + let base_url = { + let mut u = url.clone(); + u.set_fragment(None); + u.to_string().trim_start_matches("git+").to_string() + }; + + // Parse fragment for branch:path + let (branch, path) = if let Some(fragment) = url.fragment() { + let parts: Vec<&str> = fragment.splitn(2, ':').collect(); + ( + Some(parts[0].to_string()), + parts.get(1).map(|s| s.to_string()), + ) + } else { + (None, None) + }; + + Ok(GitReference { + base_url, + branch, + path, + }) +} + +#[cfg(test)] +mod tests { + use super::parse_git_url; + use anyhow::*; + #[test] + fn test_git_url() -> Result<()> { + let g = parse_git_url( + "git+https://github.com/gnosisguild/enclave.git#hacknet:template/default".to_string(), + )?; + + assert_eq!(g.branch, Some("hacknet".to_string())); + assert_eq!( + g.base_url, + "https://github.com/gnosisguild/enclave.git".to_string() + ); + + assert_eq!(g.path, Some("template/default".to_string())); + + Ok(()) + } +} diff --git a/crates/init/src/git_url.rs b/crates/init/src/git_url.rs deleted file mode 100644 index 776b0d33be..0000000000 --- a/crates/init/src/git_url.rs +++ /dev/null @@ -1,106 +0,0 @@ -use anyhow::{anyhow, Result}; -use std::str::FromStr; - -#[derive(Debug)] -pub struct GitUrl { - pub repo_url: String, - pub host: String, - pub owner: String, - pub repo: String, - pub branch: String, -} - -impl FromStr for GitUrl { - type Err = anyhow::Error; - - fn from_str(url: &str) -> Result { - let (base, branch) = url - .split_once('#') - .map(|(b, r)| (b, r.to_string())) - .unwrap_or((url, "master".to_string())); - - let path = if base.contains("://") { - base.split("://") - .nth(1) - .ok_or_else(|| anyhow!("invalid url"))? - } else if base.starts_with("git@") { - &base[4..] - } else { - return Err(anyhow!("unsupported format")); - }; - - let (host, repo_path) = if path.contains(':') && !path.contains('/') { - path.split_once(':') - .ok_or_else(|| anyhow!("invalid ssh format"))? - } else { - path.split_once('/') - .ok_or_else(|| anyhow!("missing path"))? - }; - - let parts: Vec<&str> = repo_path.trim_end_matches(".git").split('/').collect(); - if parts.len() < 2 { - return Err(anyhow!("invalid repo path")); - } - - Ok(GitUrl { - repo_url: base.to_string(), - host: host.split('@').last().unwrap_or(host).to_string(), - owner: parts[parts.len() - 2].to_string(), - repo: parts[parts.len() - 1].to_string(), - branch, - }) - } -} - -// #[cfg(test)] -// mod tests { -// use super::*; -// -// #[test] -// fn test_parse() { -// let cases = [ -// ( -// "https://github.com/user/repo.git#main", -// "https://github.com/user/repo.git", -// "github.com", -// "user", -// "repo", -// "main", -// ), -// ( -// "git@github.com:user/repo.git", -// "git@github.com:user/repo.git", -// "github.com", -// "user", -// "repo", -// "master", -// ), -// ( -// "ssh://git@gitlab.com/group/project.git#v1.0", -// "ssh://git@gitlab.com/group/project.git", -// "gitlab.com", -// "group", -// "project", -// "v1.0", -// ), -// ]; -// -// for (url, repo_url, host, owner, repo, branch) in cases { -// let parsed: GitUrl = url.parse().unwrap(); -// assert_eq!(parsed.repo_url, repo_url); -// assert_eq!(parsed.host, host); -// assert_eq!(parsed.owner, owner); -// assert_eq!(parsed.repo, repo); -// assert_eq!(parsed.branch, branch); -// } -// -// // Test the specific example -// let u: GitUrl = "https://github.com/foo/bar#v1.2.3".parse().unwrap(); -// assert_eq!(u.repo_url, "https://github.com/foo/bar"); -// assert_eq!(u.branch, "v1.2.3"); -// -// // Test default branch -// let u: GitUrl = "https://github.com/foo/bar".parse().unwrap(); -// assert_eq!(u.branch, "master"); -// } -// } diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 9e6fb53151..5d5db02c2c 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -1,29 +1,32 @@ mod copy; mod file_utils; mod git; -mod git_url; mod package_json; mod pkgman; use anyhow::Result; use copy::Filter; use file_utils::{chmod_recursive, delete_path, move_file}; -use git_url::GitUrl; +use git::parse_git_url; use package_json::DependencyType; use pkgman::PkgMan; use std::env; use std::path::PathBuf; -use std::str::FromStr; use tokio::fs; // const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-2"; -const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#hacknet"; -const TEMPLATE_FOLDER: &str = "templates/default"; +const DEFAULT_TEMPLATE_URL: &str = + "https://github.com/gnosisguild/enclave.git#hacknet:templates/default"; const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; +const DEFAULT_TEMPLATE_PATH: &str = "."; +const DEFAULT_BRANCH: &str = "main"; // Updated execute function to include workspace dependency substitution -pub async fn execute(location: Option) -> Result<()> { - let repo = GitUrl::from_str(GIT_URL)?; +pub async fn execute(location: Option, template: Option) -> Result<()> { + let repo = parse_git_url(template.unwrap_or(DEFAULT_TEMPLATE_URL.to_string()))?; + let base_url = repo.base_url; + let branch = repo.branch.unwrap_or(DEFAULT_BRANCH.to_string()); + let template_path = repo.path.unwrap_or(DEFAULT_TEMPLATE_PATH.to_string()); let cwd = match location { Some(loc) => loc, @@ -38,7 +41,7 @@ pub async fn execute(location: Option) -> Result<()> { file_utils::ensure_empty_folder(&cwd).await?; println!("Start git clone..."); - git::shallow_clone(&repo.repo_url, &repo.branch, TEMP_DIR).await?; + git::shallow_clone(&base_url, &branch, TEMP_DIR).await?; println!("Getting workspace version for enclave..."); let evm_version = package_json::get_version_from_package_json( @@ -54,7 +57,7 @@ pub async fn execute(location: Option) -> Result<()> { println!("Copy with filters..."); copy::copy_with_filters( - &PathBuf::from(TEMP_DIR).join(TEMPLATE_FOLDER), + &PathBuf::from(TEMP_DIR).join(template_path), &cwd, &vec![ Filter::new( diff --git a/templates/default/.gitignore b/templates/default/.gitignore index 48122db231..f9732d09f0 100644 --- a/templates/default/.gitignore +++ b/templates/default/.gitignore @@ -14,6 +14,8 @@ node_modules /coverage /coverage.json +/target + # Ignore risc0 files contracts/ImageID.sol tests/Elf.sol diff --git a/templates/default/.gitignore.bak b/templates/default/.gitignore.bak index 14cac8c81b..b02b5c1495 100644 --- a/templates/default/.gitignore.bak +++ b/templates/default/.gitignore.bak @@ -13,6 +13,8 @@ node_modules /typechain /typechain-types +/target + # solidity-coverage files /coverage /coverage.json diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock new file mode 100644 index 0000000000..a45b3102ff --- /dev/null +++ b/templates/default/Cargo.lock @@ -0,0 +1,5884 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-provider", + "alloy-rpc-client", + "alloy-serde", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest 0.12.19", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest 0.12.19", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.19", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[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 = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror 1.0.69", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "e3-bfv-helpers" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave.git?branch=hacknet#306196542750dd9c0c9f8d1fe2ef76a32e00bd87" +dependencies = [ + "alloy", + "fhe", + "fhe-traits", +] + +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave.git?branch=hacknet#306196542750dd9c0c9f8d1fe2ef76a32e00bd87" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + +[[package]] +name = "e3-user-program" +version = "0.1.0" +dependencies = [ + "anyhow", + "e3-bfv-helpers", + "e3-compute-provider", + "fhe", + "fhe-traits", + "rand 0.8.5", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror 1.0.69", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.27", + "serde", + "serde_json", + "syn 2.0.101", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum 0.26.3", + "syn 2.0.101", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.26", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror 1.0.69", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "ethnum" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fhe" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "doc-comment", + "fhe-math", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "thiserror 1.0.69", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "fhe-math" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "ethnum", + "fhe-traits", + "fhe-util", + "itertools 0.12.1", + "ndarray", + "num-bigint", + "num-bigint-dig", + "num-traits", + "prost", + "prost-build", + "rand 0.8.5", + "rand_chacha 0.3.1", + "sha2", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "fhe-traits" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "fhe-util" +version = "0.1.0-beta.7" +source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +dependencies = [ + "itertools 0.12.1", + "num-bigint-dig", + "num-traits", + "prime_factorization", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +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 = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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 = "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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +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 = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.6.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set 0.5.3", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] + +[[package]] +name = "lean-imt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.1", + "libc", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "num-bigint", + "thiserror 1.0.69", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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", + "serde", + "smallvec", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "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.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "prime_factorization" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" +dependencies = [ + "itertools 0.10.5", + "num", + "rand 0.8.5", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set 0.8.0", + "bit-vec 0.8.0", + "bitflags 2.9.1", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.11.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.101", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[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 = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[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 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[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 = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ruint" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki", + "sct", +] + +[[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 = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[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 = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "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 = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "url", + "zip", +] + +[[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.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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 = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[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 = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[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 = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.16", + "serde", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +dependencies = [ + "js-sys", + "minicov", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "wasm-crypto" +version = "0.1.0" +dependencies = [ + "bincode", + "console", + "console_log", + "e3-bfv-helpers", + "ethers", + "fhe", + "fhe-math", + "fhe-traits", + "fhe-util", + "getrandom 0.2.16", + "itertools 0.13.0", + "log", + "ndarray", + "num-bigint", + "num-traits", + "rand 0.8.5", + "rayon", + "serde", + "serde_json", + "wasm-bindgen", + "wasm-bindgen-test", + "web-sys", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml index 8cd1b5f3c0..f3c1453c02 100644 --- a/templates/default/Cargo.toml +++ b/templates/default/Cargo.toml @@ -1,4 +1,11 @@ [workspace] members = [ - "client/wasm" + "client/wasm", + "program" ] + +[workspace.dependencies] +fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } +rand = "0.8.5" +anyhow = "1.0.86" diff --git a/templates/default/flake.nix b/templates/default/flake.nix index ae5a41dbb2..33544c721e 100644 --- a/templates/default/flake.nix +++ b/templates/default/flake.nix @@ -29,6 +29,7 @@ wasm-pack nodejs nodePackages.pnpm + rust-analyzer ]; }; }); diff --git a/templates/default/package.json b/templates/default/package.json index 30b1da6ef3..27c44d1730 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -38,12 +38,12 @@ "deploy:dev": "hardhat run scripts/deploy-local.ts", "dev:evm": "hardhat node", "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile", - "dev:ciphernodes": "./scripts/run_local_ciphernodes.sh", - "dev:all": "concurrently -r \"pnpm node\" \"pnpm dev:ciphernodes\" \"wait-on http://localhost:8545 && pnpm dev:program\" \"pnpm dev:frontend\"", - "dev:frontend": "cd client && (export $(enclave print-env --vite --chain hardhat) && pnpm dev)", - "dev:program": "concurrently -r \"pnpm rpc\" \"enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat\"", + "dev:ciphernodes": "./scripts/dev_ciphernodes.sh", + "dev:all": "concurrently -r \"pnpm node\" \"pnpm dev:ciphernodes\" \"pnpm dev:program\" \"pnpm dev:frontend\"", + "dev:frontend": "./scripts/dev_frontend.sh", + "dev:program": "./scripts/dev_program.sh", "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", - "rpc": "ts-node ./server", + "server": "ts-node ./server", "test": "hardhat test" } } diff --git a/templates/default/program/Cargo.toml b/templates/default/program/Cargo.toml index a21d83d68d..2280186609 100644 --- a/templates/default/program/Cargo.toml +++ b/templates/default/program/Cargo.toml @@ -8,3 +8,7 @@ fhe_rs = { workspace = true } fhe-traits = { workspace = true } e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } + +[dev-dependencies] +rand = { workspace = true } +anyhow = { workspace = true } diff --git a/templates/default/program/src/lib.rs b/templates/default/program/src/lib.rs index 3ed45d3ac6..538b99d64f 100644 --- a/templates/default/program/src/lib.rs +++ b/templates/default/program/src/lib.rs @@ -3,7 +3,7 @@ use e3_compute_provider::FHEInputs; use fhe_rs::bfv::Ciphertext; use fhe_traits::{DeserializeParametrized, Serialize}; -/// CRISP Implementation of the CiphertextProcessor function +/// Implementation of the CiphertextProcessor function pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { let params = decode_bfv_params_arc(&fhe_inputs.params); @@ -15,3 +15,53 @@ pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { sum.to_bytes() } + +#[cfg(test)] +mod tests { + use super::*; + use anyhow::Result; + use e3_bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; + use fhe_rs::bfv::{Encoding, Plaintext, PublicKey, SecretKey}; + use fhe_traits::FheEncoder; + use fhe_traits::FheEncrypter; + use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; + use rand::{rngs::OsRng, thread_rng}; + + #[test] + fn test() -> Result<()> { + let mut rng = thread_rng(); + + let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + + let secret_key = SecretKey::random(¶ms, &mut OsRng); + let public_key = PublicKey::new(&secret_key, &mut rng); + + // 10 + let ten = public_key.try_encrypt( + &Plaintext::try_encode(&[10u64], Encoding::poly(), ¶ms)?, + &mut rng, + )?; + + // 2 + let two = public_key.try_encrypt( + &Plaintext::try_encode(&[2u64], Encoding::poly(), ¶ms)?, + &mut rng, + )?; + + // Prepare inputs + let fhe_inputs = FHEInputs { + params: encode_bfv_params(¶ms), + ciphertexts: vec![(ten.to_bytes(), 0), (two.to_bytes(), 1)], + }; + + // Run the processor + let result = fhe_processor(&fhe_inputs); + + // Decrypt result + let decrypted = secret_key.try_decrypt(&Ciphertext::from_bytes(&result, ¶ms)?)?; + + assert_eq!(decrypted.value[0], 12); + Ok(()) + } +} diff --git a/templates/default/scripts/run_local_ciphernodes.sh b/templates/default/scripts/dev_ciphernodes.sh similarity index 100% rename from templates/default/scripts/run_local_ciphernodes.sh rename to templates/default/scripts/dev_ciphernodes.sh diff --git a/templates/default/scripts/dev_frontend.sh b/templates/default/scripts/dev_frontend.sh new file mode 100755 index 0000000000..6166a99f99 --- /dev/null +++ b/templates/default/scripts/dev_frontend.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cd client && (export $(enclave print-env --vite --chain hardhat) && pnpm dev) diff --git a/templates/default/scripts/dev_program.sh b/templates/default/scripts/dev_program.sh new file mode 100755 index 0000000000..c2a27290e5 --- /dev/null +++ b/templates/default/scripts/dev_program.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail + +pnpm wait-on http://localhost:8545 && \ + concurrently -r \ + "pnpm server" \ + "enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat" From 4bd6115672617b88fdc1b6317adbd841d47b3bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 6 Jun 2025 23:21:16 +0000 Subject: [PATCH 051/106] Attempt to get frontend hooked up (#484) * Add publishCiphertextOutput method * Ensure server has the credentials it needs * Linty linty very very linty * Fix commands * update version for sdk * Add npm release script * Update scripts * update scripts * Remove comment * Add double dash at the end * Use script instead of raw ts-node * Fix hardhat deployer issue * Fix ciphernode deploy script * Enable E3Program * add dependencies * Attempt to run enclave contract function * Attempt to use altered contract addresses * Update lockfile --- crates/cli/src/print_env.rs | 2 + package.json | 2 + packages/enclave-react/package.json | 2 +- packages/evm/package.json | 3 +- packages/evm/src/sdk/contract-client.ts | 49 +++++ packages/evm/src/sdk/enclave-sdk.ts | 78 +++++++- pnpm-lock.yaml | 139 +++++++++----- templates/default/.env.example | 4 - templates/default/client/.env.example | 6 - templates/default/deploy/default.ts | 18 ++ templates/default/enclave.config.yaml | 8 +- templates/default/hardhat.config.ts | 24 +++ templates/default/package.json | 34 ++-- templates/default/scripts/deploy-local.ts | 11 +- templates/default/scripts/dev_ciphernodes.sh | 9 +- templates/default/scripts/dev_program.sh | 2 +- templates/default/scripts/dev_server.sh | 5 + templates/default/scripts/interact.ts | 183 ------------------- templates/default/server/index.ts | 110 +++++++++-- 19 files changed, 399 insertions(+), 290 deletions(-) delete mode 100644 templates/default/.env.example delete mode 100644 templates/default/client/.env.example create mode 100755 templates/default/scripts/dev_server.sh delete mode 100644 templates/default/scripts/interact.ts diff --git a/crates/cli/src/print_env.rs b/crates/cli/src/print_env.rs index 92e7929621..432f15bbf3 100644 --- a/crates/cli/src/print_env.rs +++ b/crates/cli/src/print_env.rs @@ -11,6 +11,7 @@ pub fn extract_env_vars_vite(config: &AppConfig, chain: &str) -> String { let filter_addr = &chain.contracts.filter_registry; env_vars.push(format!("VITE_ENCLAVE_ADDRESS={}", enclave_addr.address())); env_vars.push(format!("VITE_REGISTRY_ADDRESS={}", registry_addr.address())); + env_vars.push(format!("VITE_RPC_URL={}", chain.rpc_url)); env_vars.push(format!( "VITE_FILTER_REGISTRY_ADDRESS={}", filter_addr.address() @@ -32,6 +33,7 @@ pub fn extract_env_vars(config: &AppConfig, chain: &str) -> String { let registry_addr = &chain.contracts.ciphernode_registry; let filter_addr = &chain.contracts.filter_registry; env_vars.push(format!("ENCLAVE_ADDRESS={}", enclave_addr.address())); + env_vars.push(format!("RPC_URL={}", chain.rpc_url)); env_vars.push(format!("REGISTRY_ADDRESS={}", registry_addr.address())); env_vars.push(format!("FILTER_REGISTRY_ADDRESS={}", filter_addr.address())); if let Some(e3_program) = &chain.contracts.e3_program { diff --git a/package.json b/package.json index 5ab5ab6cfd..bd1f03aaa7 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,8 @@ "evm:test": "cd packages/evm && pnpm test", "evm:coverage": "cd packages/evm && pnpm coverage", "evm:release": "cd packages/evm && pnpm release", + "react:release": "cd packages/enclave-react && pnpm release", + "npm:release": "pnpm evm:release && pnpm react:release", "build": "pnpm -r build", "changeset": "changeset", "version": "changeset version", diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index 622311f883..d518b059f8 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.8", + "version": "0.0.5-test.9", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/evm/package.json b/packages/evm/package.json index c377a0d6ce..6b0674bd00 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.8", + "version": "0.0.5-test.9", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", @@ -83,6 +83,7 @@ }, "scripts": { "clean": "rimraf ./artifacts ./cache ./coverage ./types ./coverage.json && pnpm typechain", + "build": "pnpm compile", "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile && pnpm compile:scripts", "compile:scripts": "tsc --noEmitOnError false --noCheck", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && pnpm typechain", diff --git a/packages/evm/src/sdk/contract-client.ts b/packages/evm/src/sdk/contract-client.ts index ead58990d7..4c3e4d8775 100644 --- a/packages/evm/src/sdk/contract-client.ts +++ b/packages/evm/src/sdk/contract-client.ts @@ -215,6 +215,55 @@ export class ContractClient { } } + /** + * Publish ciphertext output for an E3 computation + * publishCiphertextOutput(uint256 e3Id, bytes memory ciphertextOutput, bytes memory proof) + */ + public async publishCiphertextOutput( + e3Id: bigint, + ciphertextOutput: `0x${string}`, + proof: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.walletClient) { + throw new SDKError( + "Wallet client required for write operations", + "NO_WALLET", + ); + } + + if (!this.contractInfo) { + await this.initialize(); + } + + try { + const account = this.walletClient.account; + if (!account) { + throw new SDKError("No account connected", "NO_ACCOUNT"); + } + + // Simulate transaction + const { request } = await this.publicClient.simulateContract({ + address: this.addresses.enclave, + abi: Enclave__factory.abi, + functionName: "publishCiphertextOutput", + args: [e3Id, ciphertextOutput, proof], + account, + gas: gasLimit, + }); + + // Execute transaction + const hash = await this.walletClient.writeContract(request); + + return hash; + } catch (error) { + throw new SDKError( + `Failed to publish ciphertext output: ${error}`, + "PUBLISH_CIPHERTEXT_OUTPUT_FAILED", + ); + } + } + /** * Get E3 information * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3) diff --git a/packages/evm/src/sdk/enclave-sdk.ts b/packages/evm/src/sdk/enclave-sdk.ts index b5da1f00a9..29136bc878 100644 --- a/packages/evm/src/sdk/enclave-sdk.ts +++ b/packages/evm/src/sdk/enclave-sdk.ts @@ -1,4 +1,14 @@ -import { type Abi, type Hash, type Log } from "viem"; +import { + type Abi, + type Hash, + type Log, + WalletClient, + createPublicClient, + createWalletClient, + http, +} from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { hardhat, mainnet, monadTestnet, sepolia } from "viem/chains"; import { CiphernodeRegistryOwnable__factory, @@ -15,9 +25,17 @@ import { import { SDKError, isValidAddress } from "./utils"; export class EnclaveSDK { + public static readonly chains = { + 1: mainnet, + 11155111: sepolia, + 41454: monadTestnet, + 31337: hardhat, + // Add new chains here + } as const; + private eventListener: EventListener; private contractClient: ContractClient; - private initialized = false; + private initialized = false; // This is redundant constructor(private config: SDKConfig) { if (!config.publicClient) { @@ -46,6 +64,7 @@ export class EnclaveSDK { /** * Initialize the SDK */ + // TODO: Delete this it is redundant public async initialize(): Promise { if (this.initialized) return; @@ -121,6 +140,27 @@ export class EnclaveSDK { return this.contractClient.publishInput(e3Id, data, gasLimit); } + /** + * Publish ciphertext output for an E3 computation + */ + public async publishCiphertextOutput( + e3Id: bigint, + ciphertextOutput: `0x${string}`, + proof: `0x${string}`, + gasLimit?: bigint, + ): Promise { + if (!this.initialized) { + await this.initialize(); + } + + return this.contractClient.publishCiphertextOutput( + e3Id, + ciphertextOutput, + proof, + gasLimit, + ); + } + /** * Get E3 information */ @@ -249,6 +289,7 @@ export class EnclaveSDK { /** * Update SDK configuration */ + // TODO: We should delete this as we don't want a stateful client. public updateConfig(newConfig: Partial): void { if (newConfig.publicClient) { this.config.publicClient = newConfig.publicClient; @@ -279,4 +320,37 @@ export class EnclaveSDK { this.initialized = false; } + + public static create(options: { + rpcUrl: string; + contracts: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + }; + privateKey?: `0x${string}`; + chainId: keyof typeof EnclaveSDK.chains; + }): EnclaveSDK { + const chain = EnclaveSDK.chains[options.chainId]; + + const publicClient = createPublicClient({ + chain, + transport: http(options.rpcUrl), + }) as SDKConfig["publicClient"]; + + let walletClient: WalletClient | undefined = undefined; + if (options.privateKey) { + const account = privateKeyToAccount(options.privateKey); + walletClient = createWalletClient({ + account, + chain: mainnet, + transport: http(options.rpcUrl), + }); + } + + return new EnclaveSDK({ + publicClient, + walletClient, + contracts: options.contracts, + }); + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed9a1e8fd4..3219d278d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -438,30 +438,31 @@ importers: version: 5.8.3 templates/default: - devDependencies: + dependencies: '@gnosis-guild/enclave': specifier: workspace:* version: link:../../packages/evm + '@types/yargs': + specifier: ^17.0.33 + version: 17.0.33 + yargs: + specifier: ^18.0.0 + version: 18.0.0 + devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.0 + specifier: ^3.0.5 version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.0 + specifier: ^1.0.10 version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': - specifier: ^5.0.0 - version: 5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2) + specifier: ^4.0.0 + version: 4.0.0(f71f0ab2085f15302dd226a52112005a) '@nomicfoundation/hardhat-verify': - specifier: ^2.0.0 + specifier: ^2.0.2 version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 @@ -473,7 +474,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': - specifier: ^9.0.0 + specifier: ^9.1.0 version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 @@ -487,6 +488,12 @@ importers: '@types/node': specifier: '>=18.0.0' version: 20.10.4 + '@zk-kit/lean-imt': + specifier: ^2.1.0 + version: 2.2.3 + '@zk-kit/lean-imt.sol': + specifier: 2.0.0 + version: 2.0.0 chai: specifier: ^4.2.0 version: 4.5.0 @@ -494,13 +501,13 @@ importers: specifier: ^9.1.2 version: 9.1.2 ethers: - specifier: ^6.4.0 + specifier: ^6.9.0 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) express: specifier: ^5.1.0 version: 5.1.0 hardhat: - specifier: ^2.14.0 + specifier: ^2.22.10 version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 @@ -508,6 +515,9 @@ importers: hardhat-gas-reporter: specifier: ^1.0.8 version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + poseidon-lite: + specifier: ^0.3.0 + version: 0.3.0 solidity-coverage: specifier: ^0.8.0 version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -3296,6 +3306,12 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -4108,6 +4124,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -4722,6 +4742,9 @@ packages: email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5280,6 +5303,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -7868,6 +7895,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -8723,6 +8754,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -8831,6 +8866,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} @@ -8847,6 +8886,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -11120,30 +11163,6 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': - dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-ui': 0.15.11 - chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) - fs-extra: 10.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - json5: 2.2.3 - prompts: 2.4.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -11190,11 +11209,10 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(0c4a0093b42d1acdf9a3fa1c609a65f2)': + '@nomicfoundation/hardhat-toolbox@4.0.0(f71f0ab2085f15302dd226a52112005a)': dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) @@ -12458,6 +12476,12 @@ snapshots: '@types/unist@3.0.3': {} + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -13832,6 +13856,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + clsx@1.2.1: {} clsx@2.1.1: {} @@ -14487,6 +14517,8 @@ snapshots: email-addresses@5.0.0: {} + emoji-regex@10.4.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -15275,6 +15307,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.3.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.3.0: @@ -18764,6 +18798,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -19753,6 +19793,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): @@ -19807,6 +19853,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 @@ -19848,6 +19896,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/templates/default/.env.example b/templates/default/.env.example deleted file mode 100644 index 2d1be41eef..0000000000 --- a/templates/default/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -E3_PROGRAM_ADDRESS=0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 -ENCLAVE_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 -REGISTRY_ADDRESS=0x0165878A594ca255338adfa4d48449f69242Eb8F -FILTER_REGISTRY_ADDRESS=0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 diff --git a/templates/default/client/.env.example b/templates/default/client/.env.example deleted file mode 100644 index 00ac09d8d6..0000000000 --- a/templates/default/client/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -VITE_WALLETCONNECT_PROJECT_ID= -VITE_ENCLAVE_ADDRESS=0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 # Default enclave address from anvil -VITE_REGISTRY_ADDRESS=0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 # Default filter registry address from anvil -VITE_FILTER_REGISTRY_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 # Default naive registry filter address from anvil -VITE_E3_PROGRAM_ADDRESS=0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1 # Default E3 program address from anvil - diff --git a/templates/default/deploy/default.ts b/templates/default/deploy/default.ts index 4345a0a741..e83d086950 100644 --- a/templates/default/deploy/default.ts +++ b/templates/default/deploy/default.ts @@ -27,6 +27,24 @@ const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { args: [verifier.address, programId], log: true, }); + + const [deployerAccount] = await hre.ethers.getSigners(); + const enclave = await hre.deployments.get("Enclave"); + + const contract = new hre.ethers.Contract( + enclave.address, + enclave.abi, + deployerAccount, + ); + const result = contract.interface.encodeFunctionData("enableE3Program", [ + e3Program.address, + ]); + const tx = await deployerAccount.sendTransaction({ + to: enclave.address, + data: result, + }); + await tx.wait(); }; export default func; func.tags = ["default"]; +func.dependencies = ["enclave"]; diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml index a2be7d04e3..8c76df8361 100644 --- a/templates/default/enclave.config.yaml +++ b/templates/default/enclave.config.yaml @@ -2,10 +2,10 @@ chains: - name: "hardhat" rpc_url: "ws://localhost:8545" contracts: - e3_program: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" - enclave: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" - ciphernode_registry: "0x0165878A594ca255338adfa4d48449f69242Eb8F" - filter_registry: "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" + e3_program: "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" + enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + ciphernode_registry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" + filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" nodes: cn1: diff --git a/templates/default/hardhat.config.ts b/templates/default/hardhat.config.ts index 4da5b0fdb7..6fa4d28d54 100644 --- a/templates/default/hardhat.config.ts +++ b/templates/default/hardhat.config.ts @@ -1,8 +1,32 @@ import "@nomicfoundation/hardhat-toolbox"; import "hardhat-deploy"; import "@gnosis-guild/enclave/deploy/enclave"; +import { task } from "hardhat/config"; +import type { TaskArguments } from "hardhat/types"; import type { HardhatUserConfig } from "hardhat/config"; +task("ciphernode:add", "Register a ciphernode to the registry") + .addParam("ciphernodeAddress", "address of ciphernode to register") + .setAction(async function(taskArguments: TaskArguments, hre) { + const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); + const [deployer] = await hre.ethers.getSigners(); + const registryContract = new hre.ethers.Contract( + registry.address, + registry.abi, + deployer, + ); + const result = registryContract.interface.encodeFunctionData( + "addCiphernode", + [taskArguments.ciphernodeAddress.replace(/"/g, "")], + ); + const tx = await deployer.sendTransaction({ + to: registryContract.target, + data: result, + }); + await tx.wait(); + console.log(`Ciphernode ${taskArguments.ciphernodeAddress} registered`); + }); + const config: HardhatUserConfig = { solidity: { version: "0.8.27", diff --git a/templates/default/package.json b/templates/default/package.json index 27c44d1730..234e6a244e 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -1,28 +1,28 @@ { "devDependencies": { - "@gnosis-guild/enclave": "workspace:*", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-ignition": "^0.15.0", - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.5", + "@nomicfoundation/hardhat-network-helpers": "^1.0.10", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.2", "@openzeppelin/contracts": "5.3.0", "@risc0/ethereum": "file:lib/risc0-ethereum", "@typechain/ethers-v6": "^0.5.0", - "@typechain/hardhat": "^9.0.0", + "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.2.0", "@types/express": "^5.0.2", "@types/mocha": ">=9.1.0", "@types/node": ">=18.0.0", + "@zk-kit/lean-imt": "^2.1.0", + "@zk-kit/lean-imt.sol": "2.0.0", "chai": "^4.2.0", "concurrently": "^9.1.2", - "ethers": "^6.4.0", + "ethers": "^6.9.0", "express": "^5.1.0", - "hardhat": "^2.14.0", + "hardhat": "^2.22.10", "hardhat-deploy": "^0.12.1", "hardhat-gas-reporter": "^1.0.8", + "poseidon-lite": "^0.3.0", "solidity-coverage": "^0.8.0", "ts-node": "^10.9.2", "typechain": "^8.3.0", @@ -30,20 +30,24 @@ "typescript": ">=4.5.0", "wait-on": "^8.0.3" }, + "dependencies": { + "@gnosis-guild/enclave": "workspace:*", + "@types/yargs": "^17.0.33", + "yargs": "^18.0.0" + }, "name": "enclave-example", "scripts": { - "add-ciphernode": "hardhat run scripts/interact.ts -- add-ciphernode", + "ciphernode:add": "hardhat run scripts/ciphernode-add.ts -- ", "compile": "hardhat compile", "deploy": "hardhat run scripts/deploy-local.ts --network localhost", "deploy:dev": "hardhat run scripts/deploy-local.ts", "dev:evm": "hardhat node", - "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile", + "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile || true", "dev:ciphernodes": "./scripts/dev_ciphernodes.sh", - "dev:all": "concurrently -r \"pnpm node\" \"pnpm dev:ciphernodes\" \"pnpm dev:program\" \"pnpm dev:frontend\"", + "dev:all": "concurrently -r \"pnpm dev:evm\" \"pnpm dev:ciphernodes\" \"pnpm dev:program\" \"pnpm dev:frontend\"", "dev:frontend": "./scripts/dev_frontend.sh", "dev:program": "./scripts/dev_program.sh", - "remove-ciphernode": "hardhat run scripts/interact.ts -- remove-ciphernode", - "server": "ts-node ./server", + "dev:server": "./scripts/dev_server.sh", "test": "hardhat test" } } diff --git a/templates/default/scripts/deploy-local.ts b/templates/default/scripts/deploy-local.ts index 8243a12069..8157a8c727 100644 --- a/templates/default/scripts/deploy-local.ts +++ b/templates/default/scripts/deploy-local.ts @@ -1,8 +1,6 @@ // scripts/deploy-local.ts -import { ethers } from "hardhat"; import { DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; - // Import the deployment logic from your published package // This assumes your package exports the deployment function import deployEnclave from "@gnosis-guild/enclave/deploy/enclave"; @@ -11,20 +9,21 @@ async function main() { console.log("🚀 Deploying Enclave protocol locally..."); // Get hardhat runtime environment - const hre = require("hardhat") as HardhatRuntimeEnvironment; + const hre = require("hardhat"); // Get deployer account - const [deployer] = await ethers.getSigners(); + const [deployer] = await hre.ethers.getSigners(); console.log("Deploying with account:", deployer.address); console.log( "Account balance:", - ethers.formatEther(await deployer.provider.getBalance(deployer.address)), + hre.ethers.formatEther( + await hre.ethers.provider.getBalance(deployer.address), + ), ); try { // Execute the deployment await deployEnclave(hre); - console.log("✅ Enclave protocol deployed successfully!"); // Log deployed contract addresses diff --git a/templates/default/scripts/dev_ciphernodes.sh b/templates/default/scripts/dev_ciphernodes.sh index cfad60997f..ff78d0571d 100755 --- a/templates/default/scripts/dev_ciphernodes.sh +++ b/templates/default/scripts/dev_ciphernodes.sh @@ -31,12 +31,9 @@ CN1=$(cat enclave.config.yaml | yq '.nodes.cn1.address') CN2=$(cat enclave.config.yaml | yq '.nodes.cn2.address') CN3=$(cat enclave.config.yaml | yq '.nodes.cn3.address') -cd /app - - # Add ciphernodes using variables from config.sh -pnpm ciphernode:add --ciphernode-address "$CN1" --network "localhost" -pnpm ciphernode:add --ciphernode-address "$CN2" --network "localhost" -pnpm ciphernode:add --ciphernode-address "$CN3" --network "localhost" +pnpm hardhat ciphernode:add --ciphernode-address $CN1 --network localhost +pnpm hardhat ciphernode:add --ciphernode-address $CN2 --network localhost +pnpm hardhat ciphernode:add --ciphernode-address $CN3 --network localhost wait diff --git a/templates/default/scripts/dev_program.sh b/templates/default/scripts/dev_program.sh index c2a27290e5..961ea315de 100755 --- a/templates/default/scripts/dev_program.sh +++ b/templates/default/scripts/dev_program.sh @@ -4,5 +4,5 @@ set -euo pipefail pnpm wait-on http://localhost:8545 && \ concurrently -r \ - "pnpm server" \ + "pnpm dev:server" \ "enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat" diff --git a/templates/default/scripts/dev_server.sh b/templates/default/scripts/dev_server.sh new file mode 100755 index 0000000000..76f5aed63f --- /dev/null +++ b/templates/default/scripts/dev_server.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -euo pipefail + +(export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" CHAIN_ID=31337 $(enclave print-env --chain hardhat) && pnpm ts-node ./server) diff --git a/templates/default/scripts/interact.ts b/templates/default/scripts/interact.ts deleted file mode 100644 index 5644ecb049..0000000000 --- a/templates/default/scripts/interact.ts +++ /dev/null @@ -1,183 +0,0 @@ -// scripts/interact.ts -import { ethers } from "hardhat"; -import { LeanIMT } from "@zk-kit/lean-imt"; -import { poseidon2 } from "poseidon-lite"; - -async function main() { - const command = process.argv[2]; - const args = process.argv.slice(3); - - if (!command) { - console.log("Available commands:"); - console.log(" add-ciphernode
"); - console.log(" remove-ciphernode
"); - console.log(" get-siblings
"); - console.log(" new-committee [options]"); - process.exit(1); - } - - const hre = require("hardhat"); - - try { - switch (command) { - case "add-ciphernode": - await addCiphernode(hre, args[0]); - break; - case "remove-ciphernode": - await removeCiphernode(hre, args[0], args[1]); - break; - case "get-siblings": - await getSiblings(args[0], args[1]); - break; - case "new-committee": - await newCommittee(hre, args); - break; - default: - console.error("Unknown command:", command); - process.exit(1); - } - } catch (error) { - console.error("❌ Command failed:", error); - process.exit(1); - } -} - -async function addCiphernode(hre: any, ciphernodeAddress: string) { - if (!ciphernodeAddress) { - throw new Error("Ciphernode address is required"); - } - - console.log(`📝 Adding ciphernode: ${ciphernodeAddress}`); - - const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); - const registryContract = await ethers.getContractAt( - "CiphernodeRegistryOwnable", - registry.address, - ); - - const tx = await registryContract.addCiphernode(ciphernodeAddress); - console.log("Transaction hash:", tx.hash); - - await tx.wait(); - console.log(`✅ Ciphernode ${ciphernodeAddress} registered successfully`); -} - -async function removeCiphernode( - hre: any, - ciphernodeAddress: string, - siblingsStr: string, -) { - if (!ciphernodeAddress || !siblingsStr) { - throw new Error("Ciphernode address and siblings are required"); - } - - console.log(`🗑️ Removing ciphernode: ${ciphernodeAddress}`); - - const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); - const registryContract = await ethers.getContractAt( - "CiphernodeRegistryOwnable", - registry.address, - ); - - const siblings = siblingsStr.split(",").map((s: string) => BigInt(s.trim())); - - const tx = await registryContract.removeCiphernode( - ciphernodeAddress, - siblings, - ); - console.log("Transaction hash:", tx.hash); - - await tx.wait(); - console.log(`✅ Ciphernode ${ciphernodeAddress} removed successfully`); -} - -async function getSiblings(ciphernodeAddress: string, addressesStr: string) { - if (!ciphernodeAddress || !addressesStr) { - throw new Error("Ciphernode address and list of addresses are required"); - } - - console.log(`🔍 Getting siblings for: ${ciphernodeAddress}`); - - const hash = (a: bigint, b: bigint) => poseidon2([a, b]); - const tree = new LeanIMT(hash); - - const addresses = addressesStr.split(",").map((addr) => addr.trim()); - - for (const address of addresses) { - tree.insert(BigInt(address)); - } - - const index = tree.indexOf(BigInt(ciphernodeAddress)); - if (index === -1) { - throw new Error( - `Ciphernode ${ciphernodeAddress} not found in the provided list`, - ); - } - - const { siblings } = tree.generateProof(index); - console.log(`📋 Siblings: ${siblings.join(",")}`); -} - -async function newCommittee(hre: any, args: string[]) { - console.log("🏛️ Requesting new committee..."); - - const enclave = await hre.deployments.get("Enclave"); - const enclaveContract = await ethers.getContractAt( - "Enclave", - enclave.address, - ); - - // Default parameters (can be made configurable) - const thresholdQuorum = 2; - const thresholdTotal = 2; - const windowStart = Math.floor(Date.now() / 1000); - const windowEnd = windowStart + 86400; // 1 day - const duration = 86400; // 1 day - - // Get default addresses - const naiveRegistryFilter = await hre.deployments.get("NaiveRegistryFilter"); - - // For demo purposes, we'll need mock contracts - // In production, users would provide their own E3 program - let e3Address; - try { - const mockE3Program = await hre.deployments.get("MockE3Program"); - e3Address = mockE3Program.address; - } catch { - throw new Error( - "MockE3Program not deployed. You may need to deploy mocks first.", - ); - } - - // Enable E3 program - try { - const enableE3Tx = await enclaveContract.enableE3Program(e3Address); - await enableE3Tx.wait(); - console.log("E3 program enabled"); - } catch (e) { - console.log("E3 program already enabled or enabling failed"); - } - - // Request committee - const tx = await enclaveContract.request( - naiveRegistryFilter.address, - [thresholdQuorum, thresholdTotal], - [windowStart, windowEnd], - duration, - e3Address, - ethers.zeroPadValue("0x00", 32), // e3Params - ethers.zeroPadValue("0x00", 32), // computeParams - { value: ethers.parseEther("1.0") }, // 1 ETH - ); - - console.log("Transaction hash:", tx.hash); - await tx.wait(); - console.log("✅ Committee requested successfully"); -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exit(1); - }); -} diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 618db59f54..9ef16365a2 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -1,42 +1,112 @@ -import express, { Request, Response } from 'express'; -import { handleRpc } from 'typed-rpc/server'; +import express, { Request, Response } from "express"; +import { EnclaveSDK } from "@gnosis-guild/enclave/sdk"; +import { handleRpc } from "typed-rpc/server"; + +function validateHex(value: string, length?: number, name = "value"): boolean { + if (!value?.startsWith("0x") || !/^[a-fA-F0-9]*$/.test(value.slice(2))) { + throw new Error(`${name} must be valid hex`); + } + if (length && value.slice(2).length !== length) { + throw new Error(`${name} must be ${length} hex chars`); + } + return true; +} + +function ensureEnv(key: string): string { + const value = process.env[key]; + if (!value) { + throw new Error(`Missing required env var: ${key}`); + } + return value; +} + +function getCheckedEnvVars() { + return { + RPC_URL: ensureEnv("RPC_URL"), + ENCLAVE_CONTRACT: ensureEnv("ENCLAVE_ADDRESS"), + CIPHERNODE_REGISTRY_CONTRACT: ensureEnv("REGISTRY_ADDRESS"), + PRIVATE_KEY: ensureEnv("PRIVATE_KEY"), + CHAIN_ID: parseInt(ensureEnv("CHAIN_ID")), + }; +} + +async function createPrivateSDK() { + const { + CHAIN_ID, + PRIVATE_KEY, + CIPHERNODE_REGISTRY_CONTRACT, + ENCLAVE_CONTRACT, + RPC_URL, + } = getCheckedEnvVars(); + + if (!isSupportedChain(CHAIN_ID)) { + throw new Error(`Unsupported CHAIN_ID: ${CHAIN_ID}`); + } + + const sdk = EnclaveSDK.create({ + rpcUrl: RPC_URL, + privateKey: PRIVATE_KEY as `0x${string}`, + contracts: { + enclave: ENCLAVE_CONTRACT as `0x${string}`, + ciphernodeRegistry: CIPHERNODE_REGISTRY_CONTRACT as `0x${string}`, + }, + chainId: CHAIN_ID, + }); + + await sdk.initialize(); + return sdk; +} + +function isValidHexString(value: string): value is `0x${string}` { + return value.startsWith("0x") && /^0x[a-fA-F0-9]*$/.test(value); +} + +function isSupportedChain(value: any): value is keyof typeof EnclaveSDK.chains { + return value in EnclaveSDK.chains; +} + +// This should check if we are missing env vars and throw if any are missing. +getCheckedEnvVars(); const app = express(); app.use(express.json()); -app.post('/', (req: Request, res: Response) => { +app.post("/", (req: Request, res: Response) => { handleRpc(req.body, { // This is called before a computation is attempted. You can use it to prevent unecessary computation. shouldCompute(e3Params: string, ciphertextInputs: Array<[string, number]>) { - return ciphertextInputs.length > 0 + console.log( + `shouldCompute(e3Id:${e3Params},ciphertextInputs.length:${ciphertextInputs.length})`, + ); + return ciphertextInputs.length > 1; }, // This is called after computation has occurred async processOutput(e3Id: number, proof: string, ciphertext: string) { + console.log( + `processOutput(e3Id:${e3Id},proof:${proof},ciphertext:${ciphertext})`, + ); + if (!isValidHexString(ciphertext) || !isValidHexString(proof)) { + throw new Error("Input is not valid"); + } + const sdk = await createPrivateSDK(); - - console.log({ e3Id, proof, ciphertext }) - - /* - - const sdk = new EnclaveSdk(...); - await sdk.publishCiphertext(e3Id, proof, ciphertext); - - */ + await sdk.publishCiphertextOutput(BigInt(e3Id), ciphertext, proof); return 0; }, - // This informs the caller of what methods are available on this server capabilities() { return [ "shouldCompute", // optional - "processOutput" // mandatory - ] - } - }).then(result => res.json(result)); + "processOutput", // mandatory + ]; + }, + }).then((result) => res.json(result)); +}); +const PORT = 8080; +app.listen(PORT, () => { + console.log(`Server is listening on ${8080}`); }); - -app.listen(8080); From b9c831e7c80e8258dffe578aac34885398a58fcf Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Sat, 7 Jun 2025 23:56:16 +0500 Subject: [PATCH 052/106] Add InputValidator and Decryption Verifier to the Enclave Template (#487) * Local Deployment Scripts * Update pnpm-lock.yaml * Add InputValidator and Decryption Verifier to the Enclave Template * Prettier --- deploy/local/contracts.sh | 27 +++++++++++++++++++ deploy/local/nodes.sh | 10 +++++++ packages/evm/deploy/mocks.ts | 6 +++-- packages/evm/package.json | 5 ++++ pnpm-lock.yaml | 12 ++++----- .../default/contracts/InputValidator.sol | 24 +++++++++++++++++ templates/default/contracts/MyProgram.sol | 14 +++++++--- templates/default/deploy/default.ts | 25 ++++++++++------- templates/default/deploy/enclave.ts | 15 +++++++++-- templates/default/enclave.config.yaml | 2 +- 10 files changed, 117 insertions(+), 23 deletions(-) create mode 100755 deploy/local/contracts.sh create mode 100755 deploy/local/nodes.sh create mode 100644 templates/default/contracts/InputValidator.sol diff --git a/deploy/local/contracts.sh b/deploy/local/contracts.sh new file mode 100755 index 0000000000..bcfa1fa321 --- /dev/null +++ b/deploy/local/contracts.sh @@ -0,0 +1,27 @@ +# !/bin/bash + +# Install the enclave binary +cargo install --path ./crates/cli --bin enclave -f + +# Deploy Contacts +(cd packages/evm && rm -rf deployments/localhost && pnpm deploy:mocks --network localhost) + +# Deploy CRISP Contracts +(cd examples/CRISP && ETH_WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 FOUNDRY_PROFILE=local forge script --rpc-url http://localhost:8545 --broadcast deploy/Deploy.s.sol) + +# Add Ciphernodes to Enclave +sleep 2 # wait for enclave to start + +# Get the addresses of the ciphernodes +CN1=0xbDA5747bFD65F08deb54cb465eB87D40e51B197E +CN2=0xdD2FD4581271e230360230F9337D5c0430Bf44C0 +CN3=0x2546BcD3c84621e976D8185a91A922aE77ECEc30 + +# Add the ciphernodes to the enclave +pnpm ciphernode:add --ciphernode-address "$CN1" --network "localhost" +pnpm ciphernode:add --ciphernode-address "$CN2" --network "localhost" +pnpm ciphernode:add --ciphernode-address "$CN3" --network "localhost" + + +# Delete local DB +(rm -rf ./examples/CRISP/apps/server/database) diff --git a/deploy/local/nodes.sh b/deploy/local/nodes.sh new file mode 100755 index 0000000000..0027b15f6e --- /dev/null +++ b/deploy/local/nodes.sh @@ -0,0 +1,10 @@ +# !/bin/bash + +# Install the enclave binary +cargo install --path ./crates/cli --bin enclave -f + +concurrently \ + --names "ANVIL,NODES" \ + --prefix-colors "blue,yellow" \ + "anvil" \ + "cd examples/CRISP && enclave wallet set --name ag --private-key "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" && enclave nodes up -v" \ No newline at end of file diff --git a/packages/evm/deploy/mocks.ts b/packages/evm/deploy/mocks.ts index 4a2feb643f..fb6760978e 100644 --- a/packages/evm/deploy/mocks.ts +++ b/packages/evm/deploy/mocks.ts @@ -40,9 +40,11 @@ MockE3Program:${mockE3Program.address} // Set up MockDecryptionVerifier in Enclave contract const enclaveDeployment = await hre.deployments.get("Enclave"); - const enclaveContract = await hre.ethers.getContractAt( - "Enclave", + const enclaveArtifact = await hre.deployments.getArtifact("Enclave"); + const enclaveContract = new hre.ethers.Contract( enclaveDeployment.address, + enclaveArtifact.abi, + await hre.ethers.getSigner(deployer), ); const encryptionSchemeId = hre.ethers.keccak256( diff --git a/packages/evm/package.json b/packages/evm/package.json index 6b0674bd00..0b137c30c9 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -13,6 +13,11 @@ "import": "./dist/deploy/enclave.js", "require": "./dist/deploy/enclave.js" }, + "./deploy/mocks": { + "types": "./dist/deploy/mocks.d.ts", + "import": "./dist/deploy/mocks.js", + "require": "./dist/deploy/mocks.js" + }, "./contracts/*": "./contracts/*", "./artifacts/*": "./artifacts/*", "./sdk": "./dist/src/sdk/index.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3219d278d5..7642358e24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -469,7 +469,7 @@ importers: version: 5.3.0 '@risc0/ethereum': specifier: file:lib/risc0-ethereum - version: file:templates/default/lib/risc0-ethereum + version: risc0-ethereum@file:templates/default/lib/risc0-ethereum '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) @@ -2609,9 +2609,6 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': - resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} - '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} @@ -7570,6 +7567,9 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + risc0-ethereum@file:templates/default/lib/risc0-ethereum: + resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} + rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -11624,8 +11624,6 @@ snapshots: - utf-8-validate - zod - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} - '@rolldown/pluginutils@1.0.0-beta.9': {} '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': @@ -18301,6 +18299,8 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + risc0-ethereum@file:templates/default/lib/risc0-ethereum: {} + rlp@2.2.7: dependencies: bn.js: 5.2.2 diff --git a/templates/default/contracts/InputValidator.sol b/templates/default/contracts/InputValidator.sol new file mode 100644 index 0000000000..04127f4724 --- /dev/null +++ b/templates/default/contracts/InputValidator.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.27; + +import {IInputValidator} from "@gnosis-guild/enclave/contracts/interfaces/IInputValidator.sol"; + +contract InputValidator is IInputValidator { + error EmptyInputData(); + + /// @notice Validates input + /// @param sender The account that is submitting the input. + /// @param data The input to be verified. + /// @return input The input data. + function validate( + address sender, + bytes memory data + ) external returns (bytes memory input) { + if (data.length == 0) revert EmptyInputData(); + + // You can add your own validation logic here. + // EXAMPLE: https://github.com/gnosisguild/enclave/blob/hacknet/examples/CRISP/contracts/CRISPInputValidator.sol + + input = data; + } +} diff --git a/templates/default/contracts/MyProgram.sol b/templates/default/contracts/MyProgram.sol index 23abc4af33..65e10684e3 100755 --- a/templates/default/contracts/MyProgram.sol +++ b/templates/default/contracts/MyProgram.sol @@ -14,6 +14,7 @@ contract MyProgram is IE3Program, Ownable { // State variables IEnclave public enclave; IRiscZeroVerifier public verifier; + IInputValidator public inputValidator; bytes32 public imageId; // Mappings @@ -28,16 +29,23 @@ contract MyProgram is IE3Program, Ownable { error AlreadyRegistered(); /// @notice Initialize the contract, binding it to a specified RISC Zero verifier. + /// @param _enclave The Enclave contract address /// @param _verifier The RISC Zero verifier address /// @param _imageId The image ID for the guest program + /// @param _inputValidator The input validator address constructor( + IEnclave _enclave, IRiscZeroVerifier _verifier, - bytes32 _imageId + bytes32 _imageId, + IInputValidator _inputValidator ) Ownable(msg.sender) { require(address(_verifier) != address(0), VerifierAddressZero()); + enclave = _enclave; verifier = _verifier; + inputValidator = _inputValidator; imageId = _imageId; + authorizedContracts[address(_enclave)] = true; } /// @notice Validate the E3 program parameters @@ -48,7 +56,7 @@ contract MyProgram is IE3Program, Ownable { uint256, bytes calldata e3ProgramParams, bytes calldata - ) external returns (bytes32, IInputValidator inputValidator) { + ) external returns (bytes32, IInputValidator) { require( authorizedContracts[msg.sender] || msg.sender == owner(), CallerNotAuthorized() @@ -56,7 +64,7 @@ contract MyProgram is IE3Program, Ownable { require(paramsHashes[e3Id] == bytes32(0), E3AlreadyInitialized()); paramsHashes[e3Id] = keccak256(e3ProgramParams); - return (ENCRYPTION_SCHEME_ID, inputValidator); + return (ENCRYPTION_SCHEME_ID, IInputValidator(address(inputValidator))); } /// @notice Verify the proof diff --git a/templates/default/deploy/default.ts b/templates/default/deploy/default.ts index e83d086950..ba67ab163b 100644 --- a/templates/default/deploy/default.ts +++ b/templates/default/deploy/default.ts @@ -1,10 +1,13 @@ import { DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { deployer } = await hre.getNamedAccounts(); const { deploy } = hre.deployments; + const [deployerAccount] = await hre.ethers.getSigners(); + const enclave = await hre.deployments.get("Enclave"); + const verifier = await deploy("MockRISC0Verifier", { from: deployer, args: [], @@ -22,23 +25,27 @@ const func: DeployFunction = async function(hre: HardhatRuntimeEnvironment) { ); const programId = await imageIdContract.PROGRAM_ID(); - const e3Program = await deploy("MyProgram", { + const inputValidator = await deploy("InputValidator", { from: deployer, - args: [verifier.address, programId], + args: [], log: true, }); - const [deployerAccount] = await hre.ethers.getSigners(); - const enclave = await hre.deployments.get("Enclave"); + const e3Program = await deploy("MyProgram", { + from: deployer, + args: [enclave.address, verifier.address, programId, inputValidator.address], + log: true, + }); - const contract = new hre.ethers.Contract( + const enclaveContract = new hre.ethers.Contract( enclave.address, enclave.abi, deployerAccount, ); - const result = contract.interface.encodeFunctionData("enableE3Program", [ - e3Program.address, - ]); + const result = enclaveContract.interface.encodeFunctionData( + "enableE3Program", + [e3Program.address], + ); const tx = await deployerAccount.sendTransaction({ to: enclave.address, data: result, diff --git a/templates/default/deploy/enclave.ts b/templates/default/deploy/enclave.ts index 44c17f31b3..a87f8d1fe9 100644 --- a/templates/default/deploy/enclave.ts +++ b/templates/default/deploy/enclave.ts @@ -1,3 +1,14 @@ -import script from "@gnosis-guild/enclave/deploy/enclave"; +import deployEnclave from "@gnosis-guild/enclave/deploy/enclave"; +import deployMocks from "@gnosis-guild/enclave/deploy/mocks"; +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; -export default script; +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + await deployEnclave(hre); + // INFO: We need to deploy the mock contract due to the decryptionVerifier. + // Once we have a real verifier, we can remove this. + await deployMocks(hre); +}; + +export default func; +func.tags = ["enclave", "mocks"]; diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml index 8c76df8361..5d0c4139f9 100644 --- a/templates/default/enclave.config.yaml +++ b/templates/default/enclave.config.yaml @@ -2,7 +2,7 @@ chains: - name: "hardhat" rpc_url: "ws://localhost:8545" contracts: - e3_program: "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" + e3_program: "0x9A676e781A523b5d0C0e43731313A708CB607508" enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" ciphernode_registry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" From 735698d983d3d2da14539365e585d10cb1ba64fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 10 Jun 2025 12:53:51 +0000 Subject: [PATCH 053/106] Add shutdown logic to prevent swallowing errors in connection (#492) --- crates/entrypoint/src/helpers/shutdown.rs | 43 ++++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/crates/entrypoint/src/helpers/shutdown.rs b/crates/entrypoint/src/helpers/shutdown.rs index 38978d444b..a2a688a587 100644 --- a/crates/entrypoint/src/helpers/shutdown.rs +++ b/crates/entrypoint/src/helpers/shutdown.rs @@ -3,29 +3,46 @@ use anyhow::Result; use e3_events::{EnclaveEvent, Shutdown}; use std::time::Duration; use tokio::{ + select, signal::unix::{signal, SignalKind}, task::JoinHandle, }; -use tracing::info; +use tracing::{error, info}; -pub async fn listen_for_shutdown(bus: Recipient, handle: JoinHandle>) { +pub async fn listen_for_shutdown(bus: Recipient, mut handle: JoinHandle>) { let mut sigterm = signal(SignalKind::terminate()).expect("Failed to create SIGTERM signal stream"); + select! { + _ = sigterm.recv() => { + info!("SIGTERM received, initiating graceful shutdown..."); - sigterm.recv().await; - info!("SIGTERM received, initiating graceful shutdown..."); + // Stop the actor system + let _ = bus.send(EnclaveEvent::from(Shutdown)).await; - // Stop the actor system - let _ = bus.send(EnclaveEvent::from(Shutdown)).await; + // Abort the spawned task + handle.abort(); - // Abort the spawned task - handle.abort(); + // Wait for all actor processes to disconnect + tokio::time::sleep(Duration::from_secs(2)).await; - // Wait for all actor processes to disconnect - tokio::time::sleep(Duration::from_secs(2)).await; + // Wait for the task to finish + let _ = handle.await; - // Wait for the task to finish - let _ = handle.await; + info!("Graceful shutdown complete"); - info!("Graceful shutdown complete"); + } + result = &mut handle => { + match result { + Ok(Ok(_)) => { + info!("Completed"); + } + Ok(Err(e)) => { + error!("Failed: {}", e); + } + Err(e) => { + error!("Panicked: {}", e); + } + } + } + } } From 946b66bdfce6639840a2c79f69c9e3eaee812636 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 11 Jun 2025 01:14:11 +0500 Subject: [PATCH 054/106] Remove Rust program-listener and move event handling to TS server (#489) * Refactor Program Client/Listerner into Support/App and Add TS Server Listner * Prettier * Update Docker * Remove Support App from CLI * Update lockfile * bump * Update template port * Update Enclave Cli * Fake ImageId will exist to prevent contract compilation errors * Remove redundant args * Rename run -> start * Include error in output * Add logs to server * Fix default chain * Prettier * Wait and then kill everything * Update enclave sdk * Update react sdk * Add tmux script * update script * update to log the logs array * Make ciphernode cleanup only 2 sec * bump * Use for of instead of forEach * Use const * Linting * bump * Update to not log actual logs incase it is leading to undefined behaviour * Ensure that method is being called on the correct element * Fix bad eslint rule * bump * Add logging * Make the timeout to be a minute instead of 30 minutes * Add logging --------- Co-authored-by: ryardley --- Cargo.lock | 329 +--- Cargo.toml | 4 - crates/Dockerfile | 2 - crates/cli/Cargo.toml | 1 - crates/cli/src/program.rs | 21 +- crates/net/src/network_manager.rs | 2 +- crates/program-client/Cargo.toml | 12 - crates/program-client/src/lib.rs | 34 - crates/program-listener/Cargo.toml | 20 - crates/program-listener/src/lib.rs | 147 -- crates/support-scripts/ctl/{run => start} | 2 +- crates/support-scripts/src/lib.rs | 4 +- crates/support/Cargo.lock | 13 +- crates/support/Cargo.toml | 1 - crates/support/app/Cargo.toml | 3 +- crates/support/app/src/main.rs | 110 +- .../scripts/container/{run.sh => start.sh} | 0 examples/CRISP/apps/server/Dockerfile | 2 - package.json | 4 +- packages/enclave-react/package.json | 2 +- packages/enclave-react/src/useEnclaveSDK.ts | 320 +-- packages/evm/package.json | 2 +- packages/evm/src/sdk/contract-client.ts | 5 +- packages/evm/src/sdk/enclave-sdk.ts | 23 +- packages/evm/src/sdk/event-listener.ts | 24 +- packages/evm/src/sdk/types.ts | 34 +- templates/default/.gitignore | 1 - templates/default/.gitignore.bak | 4 + .../default/client/src/pages/WizardSDK.tsx | 1732 ++++++++--------- templates/default/contracts/ImageID.sol | 23 + templates/default/scripts/dev_ciphernodes.sh | 2 + templates/default/scripts/dev_program.sh | 5 +- templates/default/scripts/dev_server.sh | 6 +- templates/default/scripts/tmux_all.sh | 68 + templates/default/server/index.ts | 270 ++- 35 files changed, 1512 insertions(+), 1720 deletions(-) delete mode 100644 crates/program-client/Cargo.toml delete mode 100644 crates/program-client/src/lib.rs delete mode 100644 crates/program-listener/Cargo.toml delete mode 100644 crates/program-listener/src/lib.rs rename crates/support-scripts/ctl/{run => start} (60%) rename crates/support/scripts/container/{run.sh => start.sh} (100%) create mode 100644 templates/default/contracts/ImageID.sol create mode 100755 templates/default/scripts/tmux_all.sh diff --git a/Cargo.lock b/Cargo.lock index 6e23c86432..7e264e4b10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1766,12 +1766,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.0" @@ -1849,16 +1843,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "compile-time" version = "0.2.0" @@ -1955,16 +1939,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2387,7 +2361,6 @@ dependencies = [ "e3-entrypoint", "e3-events", "e3-init", - "e3-program-listener", "e3-support-scripts", "hex", "opentelemetry", @@ -2659,32 +2632,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "e3-program-client" -version = "0.1.0" -dependencies = [ - "anyhow", - "reqwest", - "serde", -] - -[[package]] -name = "e3-program-listener" -version = "0.1.0" -dependencies = [ - "anyhow", - "e3-compute-provider", - "e3-config", - "e3-evm-helpers", - "e3-indexer", - "e3-program-client", - "e3-support-scripts", - "eyre", - "hex", - "jsonrpsee", - "tokio", -] - [[package]] name = "e3-request" version = "0.1.0" @@ -3684,7 +3631,6 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "log", "rustls", "rustls-pki-types", "tokio", @@ -3897,7 +3843,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ "async-io", - "core-foundation 0.9.4", + "core-foundation", "fnv", "futures", "if-addrs", @@ -4084,28 +4030,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - [[package]] name = "jobserver" version = "0.1.33" @@ -4126,74 +4050,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonrpsee" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-types", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "jsonrpsee-types", - "pin-project", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" -dependencies = [ - "base64", - "http-body 1.0.1", - "hyper 1.6.0", - "hyper-rustls", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "rustls", - "rustls-platform-verifier", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower 0.5.2", - "url", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" -dependencies = [ - "http 1.3.1", - "serde", - "serde_json", - "thiserror 2.0.12", -] - [[package]] name = "k256" version = "0.13.4" @@ -4923,7 +4779,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] @@ -6397,7 +6253,6 @@ version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ - "log", "once_cell", "ring 0.17.14", "rustls-pki-types", @@ -6406,18 +6261,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.2.0", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -6436,33 +6279,6 @@ dependencies = [ "web-time", ] -[[package]] -name = "rustls-platform-verifier" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki 0.103.2", - "security-framework 3.2.0", - "security-framework-sys", - "webpki-root-certs 0.26.11", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - [[package]] name = "rustls-webpki" version = "0.101.7" @@ -6519,15 +6335,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[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.27" @@ -6575,20 +6382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" -dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -6999,7 +6793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.0", - "core-foundation 0.9.4", + "core-foundation", "system-configuration-sys", ] @@ -7248,15 +7042,15 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.9.0", "toml_datetime", @@ -7614,16 +7408,6 @@ dependencies = [ "libc", ] -[[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" @@ -7753,24 +7537,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-root-certs" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" -dependencies = [ - "webpki-root-certs 1.0.0", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a83f7e1a9f8712695c03eabe9ed3fbca0feff0152f33f12593e5a6303cb1a4" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "webpki-roots" version = "0.26.11" @@ -7811,15 +7577,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -7890,15 +7647,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -7926,21 +7674,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -7988,12 +7721,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -8012,12 +7739,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -8036,12 +7757,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -8072,12 +7787,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -8096,12 +7805,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -8120,12 +7823,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -8144,12 +7841,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -8170,9 +7861,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 5751a1072d..4acf169b6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,8 +17,6 @@ members = [ "crates/keyshare", "crates/logger", "crates/net", - "crates/program-client", - "crates/program-listener", "crates/request", "crates/sdk", "crates/sortition", @@ -72,9 +70,7 @@ e3-indexer = { version = "0.1.0", path = "./crates/indexer" } e3-keyshare = { version = "0.1.0", path = "./crates/keyshare" } e3-logger = { version = "0.1.0", path = "./crates/logger" } e3-net = { version = "0.1.0", path = "./crates/net" } -e3-program-client = { version = "0.1.0", path = "./crates/program-client" } e3-compute-provider = { version = "0.1.0", path = "./crates/compute-provider" } -e3-program-listener = { version = "0.1.0", path = "./crates/program-listener" } e3-sortition = { version = "0.1.0", path = "./crates/sortition" } e3-support-scripts = { version = "0.1.0", path = "./crates/support-scripts" } e3-test-helpers = { version = "0.1.0", path = "./crates/test-helpers" } diff --git a/crates/Dockerfile b/crates/Dockerfile index a518907b95..4b59d61ba0 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -46,8 +46,6 @@ COPY crates/init/Cargo.toml ./init/Cargo.toml COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml COPY crates/logger/Cargo.toml ./logger/Cargo.toml COPY crates/net/Cargo.toml ./net/Cargo.toml -COPY crates/program-client/Cargo.toml ./program-client/Cargo.toml -COPY crates/program-listener/Cargo.toml ./program-listener/Cargo.toml COPY crates/request/Cargo.toml ./request/Cargo.toml COPY crates/sdk/Cargo.toml ./sdk/Cargo.toml COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 9aeecb61df..2b9e6e04b5 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -22,7 +22,6 @@ e3-entrypoint = { workspace = true } e3-events = { workspace = true } e3-init = { workspace = true } e3-support-scripts = { workspace = true } -e3-program-listener = { workspace = true } hex = { workspace = true } opentelemetry = { workspace = true } opentelemetry-otlp = { workspace = true } diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index 05c5562b4b..f820cb2551 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -4,29 +4,16 @@ use e3_config::AppConfig; #[derive(Subcommand, Debug)] pub enum ProgramCommands { - /// Listen for blockchain events and trigger a computation after an E3Request has expired - Listen { - /// Webhook to trigger upon execution completion - #[arg(long)] - json_rpc_server: String, - - /// Webhook to trigger upon execution completion - #[arg(long)] - chain: String, - }, + /// Start the program + Start, /// Compile the program code Compile, } -pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { +pub async fn execute(command: ProgramCommands, _config: &AppConfig) -> Result<()> { match command { - ProgramCommands::Listen { - json_rpc_server, - chain, - } => { - e3_program_listener::execute(config, &chain, &json_rpc_server).await?; - } + ProgramCommands::Start => e3_support_scripts::program_start().await?, ProgramCommands::Compile => e3_support_scripts::program_compile().await?, }; diff --git a/crates/net/src/network_manager.rs b/crates/net/src/network_manager.rs index 45f1632cc2..5fb4bc228e 100644 --- a/crates/net/src/network_manager.rs +++ b/crates/net/src/network_manager.rs @@ -159,7 +159,7 @@ impl Handler for NetworkManager { }) .await { - error!(error=?e, "Error sending bytes to libp2p"); + error!(error=?e, "Error sending bytes to libp2p: {e}"); }; } Err(error) => { diff --git a/crates/program-client/Cargo.toml b/crates/program-client/Cargo.toml deleted file mode 100644 index fec5b3b4b1..0000000000 --- a/crates/program-client/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "e3-program-client" -version = "0.1.0" -edition.workspace = true -license.workspace = true -description = "E3 - Program Client" -repository = "https://github.com/gnosisguild/enclave/crates/program-client" - -[dependencies] -serde.workspace = true -reqwest.workspace = true -anyhow.workspace = true diff --git a/crates/program-client/src/lib.rs b/crates/program-client/src/lib.rs deleted file mode 100644 index c8edef8318..0000000000 --- a/crates/program-client/src/lib.rs +++ /dev/null @@ -1,34 +0,0 @@ -use anyhow::Result; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct ComputeRequest { - pub params: Vec, - pub ciphertext_inputs: Vec<(Vec, u64)>, -} - -#[derive(Deserialize, Serialize)] -pub struct ComputeResponse { - pub ciphertext: Vec, - pub proof: Vec, -} - -pub async fn run_compute( - params: Vec, - ciphertext_inputs: Vec<(Vec, u64)>, -) -> Result<(Vec, Vec)> { - let request = ComputeRequest { - params, - ciphertext_inputs, - }; - - let response: ComputeResponse = reqwest::Client::new() - .post("http://127.0.0.1:4001/run_compute") - .json(&request) - .send() - .await? - .json() - .await?; - - Ok((response.proof, response.ciphertext)) -} diff --git a/crates/program-listener/Cargo.toml b/crates/program-listener/Cargo.toml deleted file mode 100644 index f624d7be63..0000000000 --- a/crates/program-listener/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "e3-program-listener" -version.workspace = true -edition.workspace = true -license.workspace = true -description.workspace = true -repository.workspace = true - -[dependencies] -e3-config.workspace = true -e3-indexer.workspace = true -e3-program-client.workspace = true -e3-support-scripts.workspace = true -e3-compute-provider.workspace = true -e3-evm-helpers.workspace = true -anyhow.workspace = true -eyre.workspace = true -tokio.workspace = true -hex.workspace = true -jsonrpsee.workspace = true diff --git a/crates/program-listener/src/lib.rs b/crates/program-listener/src/lib.rs deleted file mode 100644 index 84d4deaad6..0000000000 --- a/crates/program-listener/src/lib.rs +++ /dev/null @@ -1,147 +0,0 @@ -use anyhow::anyhow; -use anyhow::bail; -use anyhow::Result; -use e3_compute_provider::FHEInputs; -use e3_config::{chain_config::ChainConfig, AppConfig, ContractAddresses}; -use e3_evm_helpers::events::E3Activated; -use e3_indexer::{E3Repository, EnclaveIndexer, InMemoryStore}; -use e3_program_client::run_compute; -use e3_support_scripts::ctl_run; -use jsonrpsee::{ - core::client::ClientT, - http_client::{HttpClient, HttpClientBuilder}, - rpc_params, -}; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use tokio::time::{sleep_until, Instant}; - -fn to_hex(bytes: Vec) -> String { - format!("0x{}", hex::encode(bytes)) -} - -#[derive(Clone)] -struct RpcServer { - client: HttpClient, - capabilities: Vec, -} - -impl RpcServer { - pub async fn create(url: &str) -> Result { - let client = HttpClientBuilder::default().build(url)?; - let capabilities = client.request("capabilities", rpc_params![]).await?; - Ok(Self { - client, - capabilities, - }) - } - - fn has_capability(&self, capability: &str) -> bool { - self.capabilities.contains(&capability.to_string()) - } - - async fn should_compute(&self) -> Result { - let result = self.client.request("shouldCompute", rpc_params![]).await?; - Ok(result) - } - - async fn process_output(&self, e3_id: u64, proof: Vec, ciphertext: Vec) -> Result<()> { - let proof = to_hex(proof); - let ciphertext = to_hex(ciphertext); - - let _: u8 = self - .client - .request("processOutput", rpc_params![e3_id, proof, ciphertext]) - .await?; - - Ok(()) - } -} - -pub async fn execute(config: &AppConfig, chain_name: &str, json_rpc_server: &str) -> Result<()> { - let json_rpc_server = json_rpc_server.to_owned(); - let Some(chain) = config.chains().iter().find(|c| c.name == chain_name) else { - anyhow::bail!("No chain '{chain_name}' found in config."); - }; - - tokio::spawn(async { - match ctl_run().await { - Ok(_) => (), - Err(err) => println!("Error running risc0 compute {err}"), - } - }); - - let rpc = RpcServer::create(&json_rpc_server).await?; - - if !rpc.has_capability("processOutput") { - bail!("The JSON_RPC server at {json_rpc_server} must support the `processOutput` method."); - } - - let ChainConfig { - rpc_url, - contracts: - ContractAddresses { - enclave: contract_address, - .. - }, - .. - } = chain; - - let mut indexer = EnclaveIndexer::::from_endpoint_address_in_mem( - &rpc_url, - &contract_address.address(), - ) - .await - .map_err(|e| anyhow!(e))?; - - indexer - .add_event_handler({ - move |event: E3Activated, store| { - let rpc = rpc.clone(); - - async move { - let e3_id = event.e3Id.to::(); - let repo = E3Repository::new(store, e3_id); - - let expiration = event.expiration.to::(); - - // Calculate expiration time to sleep until - let expiration = Instant::now() - + (UNIX_EPOCH + Duration::from_secs(expiration)) - .duration_since(SystemTime::now()) - .unwrap_or_else(|_| Duration::ZERO); - - // TODO: save this to the db and poll in a loop instead of use this async future as if - // the server crashes we loose state sync - sleep_until(expiration).await; - - let e3 = repo.get_e3().await?; - - if rpc.has_capability("shouldCompute") { - // Asks the JSON rpc server if this is ok to compute - if !rpc.should_compute().await.map_err(|e| eyre::eyre!("{e}"))? { - return Ok(()); - } - } - - let fhe_inputs = FHEInputs { - params: e3.e3_params, - ciphertexts: e3.ciphertext_inputs, - }; - - let (proof, ciphertext) = - run_compute(fhe_inputs.params, fhe_inputs.ciphertexts) - .await - .map_err(|e| eyre::eyre!("Error running compute: {e}"))?; - - rpc.process_output(e3_id, proof, ciphertext) - .await - .map_err(|e| eyre::eyre!("{e}"))?; - - Ok(()) - } - } - }) - .await; - - Ok(()) -} diff --git a/crates/support-scripts/ctl/run b/crates/support-scripts/ctl/start similarity index 60% rename from crates/support-scripts/ctl/run rename to crates/support-scripts/ctl/start index a6f991db37..c85d427035 100755 --- a/crates/support-scripts/ctl/run +++ b/crates/support-scripts/ctl/start @@ -1,4 +1,4 @@ #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/container" ./scripts/container/run.sh +"$SCRIPT_DIR/container" ./scripts/container/start.sh diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index c32285efe4..7c2ca0cef4 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -50,9 +50,9 @@ pub async fn program_compile() -> Result<()> { Ok(()) } -pub async fn ctl_run() -> Result<()> { +pub async fn program_start() -> Result<()> { let cwd = env::current_dir()?; - let script = cwd.join(".enclave/support/ctl/run"); + let script = cwd.join(".enclave/support/ctl/start"); ensure_script_exists(&script).await?; run_bash_script(&cwd, &script, &[]).await?; Ok(()) diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index ca5cd1a56c..e896d9cb16 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -2402,25 +2402,16 @@ dependencies = [ "sha3", ] -[[package]] -name = "e3-program-client" -version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" -dependencies = [ - "anyhow", - "reqwest", - "serde", -] - [[package]] name = "e3-support-app" version = "0.1.0" dependencies = [ "actix-web", + "anyhow", "e3-compute-provider", - "e3-program-client", "e3-support-host", "env_logger", + "reqwest", "serde", "serde_json", "tokio", diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 4929bd6b3c..92948586c2 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -37,7 +37,6 @@ fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } -e3-program-client = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/crates/support/app/Cargo.toml b/crates/support/app/Cargo.toml index 7c7589f510..5ce2726634 100644 --- a/crates/support/app/Cargo.toml +++ b/crates/support/app/Cargo.toml @@ -11,4 +11,5 @@ serde_json.workspace = true tokio.workspace = true e3-compute-provider.workspace = true e3-support-host.workspace = true -e3-program-client.workspace = true +reqwest.workspace = true +anyhow.workspace = true diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index ddec53d43f..d1d0f4b2c3 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,43 +1,127 @@ -use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result}; +use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; +use anyhow::bail; use e3_compute_provider::FHEInputs; -use e3_program_client::{ComputeRequest, ComputeResponse}; +use serde::{Deserialize, Serialize}; -// Run compute handler -async fn run_compute(req: web::Json) -> Result { +#[derive(Serialize, Deserialize, Debug)] +pub struct ComputeRequest { + pub params: Vec, + pub ciphertext_inputs: Vec<(Vec, u64)>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ComputeResponse { + pub ciphertext: Vec, + pub proof: Vec, +} + +#[derive(Debug, Deserialize)] +struct ComputeRequestPayload { + pub e3_id: Option, + pub params: Vec, + pub ciphertext_inputs: Vec<(Vec, u64)>, + pub callback_url: Option, +} + +#[derive(Serialize, Debug)] +struct WebhookPayload { + pub e3_id: u64, + pub ciphertext: Vec, + pub proof: Vec, +} + +#[derive(Serialize, Debug)] +struct ProcessingResponse { + status: String, + e3_id: u64, +} + +async fn call_webhook( + callback_url: &str, + e3_id: u64, + proof: Vec, + ciphertext: Vec, +) -> anyhow::Result<()> { + let payload = WebhookPayload { + e3_id, + ciphertext, + proof, + }; + + let _response: serde_json::Value = reqwest::Client::new() + .post(callback_url) + .json(&payload) + .send() + .await? + .json() + .await?; + + println!("✓ Webhook called successfully for E3 {}", e3_id); + Ok(()) +} + +async fn handle_compute(req: web::Json) -> ActixResult { + // TODO: process this in a spawn so that we return early and allow webhook instead of + // processing sequentially + println!("Processing computation..."); let fhe_inputs = FHEInputs { params: req.params.clone(), ciphertexts: req.ciphertext_inputs.clone(), }; + let (risc0_output, ciphertext) = tokio::task::spawn_blocking(move || e3_support_host::run_compute(fhe_inputs)) .await .map_err(|e| { - eprintln!("Task spawn error: {:?}", e); + eprintln!("Task spawn failed: {:?}", e); actix_web::error::ErrorInternalServerError("Task execution failed") })? .map_err(|e| { - eprintln!("Compute function error: {:?}", e); + eprintln!("Computation failed: {:?}", e); actix_web::error::ErrorInternalServerError("Computation failed") })?; let proof: Vec = risc0_output.seal.into(); - let response = ComputeResponse { ciphertext, proof }; - Ok(HttpResponse::Ok().json(response)) + match (req.e3_id, &req.callback_url) { + (Some(e3_id), Some(callback_url)) => { + let callback_url = callback_url.clone(); + tokio::spawn(async move { + if let Err(e) = call_webhook(&callback_url, e3_id, proof, ciphertext).await { + eprintln!("✗ Webhook failed for E3 {}: {}", e3_id, e); + } + }); + + Ok(HttpResponse::Ok().json(ProcessingResponse { + status: "processing".to_string(), + e3_id, + })) + } + (Some(e3_id), None) => { + println!("⚠️ E3 {} completed but no callback URL provided", e3_id); + let response = ComputeResponse { ciphertext, proof }; + Ok(HttpResponse::Ok().json(response)) + } + (None, _) => { + let response = ComputeResponse { ciphertext, proof }; + Ok(HttpResponse::Ok().json(response)) + } + } } #[actix_web::main] -async fn main() -> std::io::Result<()> { +async fn main() -> anyhow::Result<()> { env_logger::init(); + let bind_addr = "0.0.0.0:13151"; - let server = HttpServer::new(|| { + let server = HttpServer::new(move || { App::new() .wrap(Logger::default()) - .route("/run_compute", web::post().to(run_compute)) + .route("/run_compute", web::post().to(handle_compute)) }) .bind(bind_addr)?; - println!("'program' listening on http://{}", bind_addr); + println!("🚀 FHE Compute Service listening on http://{}", bind_addr); - server.run().await + server.run().await.map_err(Into::into) } diff --git a/crates/support/scripts/container/run.sh b/crates/support/scripts/container/start.sh similarity index 100% rename from crates/support/scripts/container/run.sh rename to crates/support/scripts/container/start.sh diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 74d2cd0fe7..8f11bf69ae 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -75,8 +75,6 @@ COPY crates/init/Cargo.toml crates/init/Cargo.toml COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml COPY crates/logger/Cargo.toml crates/logger/Cargo.toml COPY crates/net/Cargo.toml crates/net/Cargo.toml -COPY crates/program-client/Cargo.toml crates/program-client/Cargo.toml -COPY crates/program-listener/Cargo.toml crates/program-listener/Cargo.toml COPY crates/request/Cargo.toml crates/request/Cargo.toml COPY crates/sdk/Cargo.toml crates/sdk/Cargo.toml COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml diff --git a/package.json b/package.json index bd1f03aaa7..464b53a309 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "evm:coverage": "cd packages/evm && pnpm coverage", "evm:release": "cd packages/evm && pnpm release", "react:release": "cd packages/enclave-react && pnpm release", - "npm:release": "pnpm evm:release && pnpm react:release", + "npm:release": "pnpm build && pnpm evm:release && pnpm react:release", "build": "pnpm -r build", "changeset": "changeset", "version": "changeset version", @@ -55,4 +55,4 @@ "husky": "^9.1.7", "@changesets/cli": "^2.27.1" } -} +} \ No newline at end of file diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index d518b059f8..ec2a48127c 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.9", + "version": "0.0.5-test.17", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/enclave-react/src/useEnclaveSDK.ts b/packages/enclave-react/src/useEnclaveSDK.ts index c4a9cc5f1f..1d621fc294 100644 --- a/packages/enclave-react/src/useEnclaveSDK.ts +++ b/packages/enclave-react/src/useEnclaveSDK.ts @@ -1,57 +1,63 @@ -import { useState, useEffect, useCallback, useRef } from 'react'; -import { useWalletClient, usePublicClient } from 'wagmi'; +import { useState, useEffect, useCallback, useRef } from "react"; +import { useWalletClient, usePublicClient } from "wagmi"; import { - EnclaveSDK, - type SDKConfig, - type AllEventTypes, - type EventCallback, - EnclaveEventType, - RegistryEventType, - SDKError -} from '@gnosis-guild/enclave/sdk'; + EnclaveSDK, + type SDKConfig, + type AllEventTypes, + type EventCallback, + EnclaveEventType, + RegistryEventType, + SDKError, +} from "@gnosis-guild/enclave/sdk"; export interface UseEnclaveSDKConfig { - contracts?: { - enclave: `0x${string}`; - ciphernodeRegistry: `0x${string}`; - }; - chainId?: number; - autoConnect?: boolean; + contracts?: { + enclave: `0x${string}`; + ciphernodeRegistry: `0x${string}`; + }; + chainId?: number; + autoConnect?: boolean; } export interface UseEnclaveSDKReturn { - sdk: EnclaveSDK | null; - isInitialized: boolean; - error: string | null; - // Contract interaction methods (only the ones commonly used) - requestE3: typeof EnclaveSDK.prototype.requestE3; - activateE3: typeof EnclaveSDK.prototype.activateE3; - publishInput: typeof EnclaveSDK.prototype.publishInput; - // Event handling - onEnclaveEvent: (eventType: T, callback: EventCallback) => void; - off: (eventType: T, callback: EventCallback) => void; - // Event types for convenience - EnclaveEventType: typeof EnclaveEventType; - RegistryEventType: typeof RegistryEventType; + sdk: EnclaveSDK | null; + isInitialized: boolean; + error: string | null; + // Contract interaction methods (only the ones commonly used) + requestE3: typeof EnclaveSDK.prototype.requestE3; + activateE3: typeof EnclaveSDK.prototype.activateE3; + publishInput: typeof EnclaveSDK.prototype.publishInput; + // Event handling + onEnclaveEvent: ( + eventType: T, + callback: EventCallback, + ) => void; + off: ( + eventType: T, + callback: EventCallback, + ) => void; + // Event types for convenience + EnclaveEventType: typeof EnclaveEventType; + RegistryEventType: typeof RegistryEventType; } /** * React hook for interacting with Enclave SDK - * + * * @param config Configuration for the SDK initialization * @returns Object containing SDK instance and helper methods - * + * * @example * ```tsx * import { useEnclaveSDK } from '@gnosis-guild/enclave-react'; - * + * * function MyComponent() { - * const { - * sdk, - * isInitialized, - * error, - * requestE3, - * onEnclaveEvent + * const { + * sdk, + * isInitialized, + * error, + * requestE3, + * onEnclaveEvent * } = useEnclaveSDK({ * autoConnect: true, * contracts: { @@ -59,119 +65,135 @@ export interface UseEnclaveSDKReturn { * ciphernodeRegistry: '0x...' * } * }); - * + * * // Use the SDK... * } * ``` */ -export const useEnclaveSDK = (config: UseEnclaveSDKConfig): UseEnclaveSDKReturn => { - const [sdk, setSdk] = useState(null); - const [isInitialized, setIsInitialized] = useState(false); - const [error, setError] = useState(null); - const sdkRef = useRef(null); - - const publicClient = usePublicClient(); - const { data: walletClient } = useWalletClient(); - - const initializeSDK = useCallback(async () => { - try { - setError(null); - - if (!publicClient) { - throw new Error('Public client not available'); - } - - const sdkConfig: SDKConfig = { - publicClient, - walletClient: walletClient || undefined, - contracts: config.contracts || { - enclave: '0x0000000000000000000000000000000000000000', - ciphernodeRegistry: '0x0000000000000000000000000000000000000000' - }, - chainId: config.chainId - }; - - const newSdk = new EnclaveSDK(sdkConfig); - await newSdk.initialize(); - - setSdk(newSdk); - sdkRef.current = newSdk; - setIsInitialized(true); - } catch (err: unknown) { - const errorMessage = err instanceof SDKError - ? `SDK Error (${err.code}): ${err.message}` - : `Failed to initialize SDK: ${err}`; - setError(errorMessage); - console.error('SDK initialization failed:', err); - } - }, [publicClient, walletClient, config.contracts, config.chainId]); - - // Initialize SDK when wagmi clients are available - useEffect(() => { - if (config.autoConnect && publicClient && !isInitialized) { - initializeSDK(); - } - }, [config.autoConnect, publicClient, isInitialized, initializeSDK]); - - // Re-initialize when wallet client changes (connect/disconnect) - useEffect(() => { - if (isInitialized && publicClient && walletClient) { - initializeSDK(); - } - }, [walletClient, initializeSDK]); - - // Cleanup on unmount - useEffect(() => { - return () => { - if (sdkRef.current) { - sdkRef.current.cleanup(); - } - }; - }, []); - - // Contract interaction methods - const requestE3 = useCallback((...args: Parameters) => { - if (!sdk) throw new Error('SDK not initialized'); - return sdk.requestE3(...args); - }, [sdk]); - - const activateE3 = useCallback((...args: Parameters) => { - if (!sdk) throw new Error('SDK not initialized'); - return sdk.activateE3(...args); - }, [sdk]); - - const publishInput = useCallback((...args: Parameters) => { - if (!sdk) throw new Error('SDK not initialized'); - return sdk.publishInput(...args); - }, [sdk]); - - // Event handling methods - const onEnclaveEvent = useCallback(( - eventType: T, - callback: EventCallback - ) => { - if (!sdk) throw new Error('SDK not initialized'); - return sdk.onEnclaveEvent(eventType, callback); - }, [sdk]); - - const off = useCallback(( - eventType: T, - callback: EventCallback - ) => { - if (!sdk) throw new Error('SDK not initialized'); - return sdk.off(eventType, callback); - }, [sdk]); - - return { - sdk, - isInitialized, - error, - requestE3, - activateE3, - publishInput, - onEnclaveEvent, - off, - EnclaveEventType, - RegistryEventType +export const useEnclaveSDK = ( + config: UseEnclaveSDKConfig, +): UseEnclaveSDKReturn => { + const [sdk, setSdk] = useState(null); + const [isInitialized, setIsInitialized] = useState(false); + const [error, setError] = useState(null); + const sdkRef = useRef(null); + + const publicClient = usePublicClient(); + + const { data: walletClient } = useWalletClient(); + const initializeSDK = useCallback(async () => { + try { + setError(null); + + if (!publicClient) { + throw new Error("Public client not available"); + } + + if (sdk) { + sdk.cleanup(); + } + + const sdkConfig: SDKConfig = { + publicClient, + walletClient: walletClient || undefined, + contracts: config.contracts || { + enclave: "0x0000000000000000000000000000000000000000", + ciphernodeRegistry: "0x0000000000000000000000000000000000000000", + }, + chainId: config.chainId, + }; + + const newSdk = new EnclaveSDK(sdkConfig); + await newSdk.initialize(); + + setSdk(newSdk); + sdkRef.current = newSdk; + setIsInitialized(true); + } catch (err: unknown) { + const errorMessage = + err instanceof SDKError + ? `SDK Error (${err.code}): ${err.message}` + : `Failed to initialize SDK: ${err}`; + setError(errorMessage); + console.error("SDK initialization failed:", err); + } + }, [publicClient, walletClient, config.contracts, config.chainId]); + + // Initialize SDK when wagmi clients are available + useEffect(() => { + if (config.autoConnect && publicClient && !isInitialized) { + initializeSDK(); + } + }, [config.autoConnect, publicClient, isInitialized, initializeSDK]); + + // Re-initialize when wallet client changes (connect/disconnect) + useEffect(() => { + if (isInitialized && publicClient && walletClient) { + initializeSDK(); + } + }, [walletClient, initializeSDK]); + + // Cleanup on unmount + useEffect(() => { + return () => { + if (sdkRef.current) { + sdkRef.current.cleanup(); + } }; -}; \ No newline at end of file + }, []); + + // Contract interaction methods + const requestE3 = useCallback( + (...args: Parameters) => { + if (!sdk) throw new Error("SDK not initialized"); + return sdk.requestE3(...args); + }, + [sdk], + ); + + const activateE3 = useCallback( + (...args: Parameters) => { + if (!sdk) throw new Error("SDK not initialized"); + return sdk.activateE3(...args); + }, + [sdk], + ); + + const publishInput = useCallback( + (...args: Parameters) => { + if (!sdk) throw new Error("SDK not initialized"); + return sdk.publishInput(...args); + }, + [sdk], + ); + + // Event handling methods + const onEnclaveEvent = useCallback( + (eventType: T, callback: EventCallback) => { + if (!sdk) throw new Error("SDK not initialized"); + return sdk.onEnclaveEvent(eventType, callback); + }, + [sdk], + ); + + const off = useCallback( + (eventType: T, callback: EventCallback) => { + if (!sdk) throw new Error("SDK not initialized"); + return sdk.off(eventType, callback); + }, + [sdk], + ); + + return { + sdk, + isInitialized, + error, + requestE3, + activateE3, + publishInput, + onEnclaveEvent, + off, + EnclaveEventType, + RegistryEventType, + }; +}; diff --git a/packages/evm/package.json b/packages/evm/package.json index 0b137c30c9..dcfc37bc9d 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.9", + "version": "0.0.5-test.17", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", diff --git a/packages/evm/src/sdk/contract-client.ts b/packages/evm/src/sdk/contract-client.ts index 4c3e4d8775..e88850fdba 100644 --- a/packages/evm/src/sdk/contract-client.ts +++ b/packages/evm/src/sdk/contract-client.ts @@ -10,6 +10,7 @@ import { CiphernodeRegistryOwnable__factory, Enclave__factory, } from "../../types"; +import { type E3 } from "./types"; import { SDKError, isValidAddress } from "./utils"; export class ContractClient { @@ -268,13 +269,13 @@ export class ContractClient { * Get E3 information * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3) */ - public async getE3(e3Id: bigint): Promise { + public async getE3(e3Id: bigint): Promise { if (!this.contractInfo) { await this.initialize(); } try { - const result = await this.publicClient.readContract({ + const result: E3 = await this.publicClient.readContract({ address: this.addresses.enclave, abi: Enclave__factory.abi, functionName: "getE3", diff --git a/packages/evm/src/sdk/enclave-sdk.ts b/packages/evm/src/sdk/enclave-sdk.ts index 29136bc878..f017776cf2 100644 --- a/packages/evm/src/sdk/enclave-sdk.ts +++ b/packages/evm/src/sdk/enclave-sdk.ts @@ -6,6 +6,7 @@ import { createPublicClient, createWalletClient, http, + webSocket, } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { hardhat, mainnet, monadTestnet, sepolia } from "viem/chains"; @@ -18,6 +19,7 @@ import { ContractClient } from "./contract-client"; import { EventListener } from "./event-listener"; import { type AllEventTypes, + type E3, EnclaveEventType, type EventCallback, type SDKConfig, @@ -30,12 +32,11 @@ export class EnclaveSDK { 11155111: sepolia, 41454: monadTestnet, 31337: hardhat, - // Add new chains here } as const; private eventListener: EventListener; private contractClient: ContractClient; - private initialized = false; // This is redundant + private initialized = false; constructor(private config: SDKConfig) { if (!config.publicClient) { @@ -164,7 +165,7 @@ export class EnclaveSDK { /** * Get E3 information */ - public async getE3(e3Id: bigint): Promise { + public async getE3(e3Id: bigint): Promise { if (!this.initialized) { await this.initialize(); } @@ -311,7 +312,6 @@ export class EnclaveSDK { this.config.chainId = newConfig.chainId; } - // Reinitialize contract client with new config this.contractClient = new ContractClient( this.config.publicClient, this.config.walletClient, @@ -332,18 +332,25 @@ export class EnclaveSDK { }): EnclaveSDK { const chain = EnclaveSDK.chains[options.chainId]; + const isWebSocket = + options.rpcUrl.startsWith("ws://") || options.rpcUrl.startsWith("wss://"); + const transport = isWebSocket + ? webSocket(options.rpcUrl, { + keepAlive: { interval: 30_000 }, + reconnect: { attempts: 5, delay: 2_000 }, + }) + : http(options.rpcUrl); const publicClient = createPublicClient({ chain, - transport: http(options.rpcUrl), + transport, }) as SDKConfig["publicClient"]; - let walletClient: WalletClient | undefined = undefined; if (options.privateKey) { const account = privateKeyToAccount(options.privateKey); walletClient = createWalletClient({ account, - chain: mainnet, - transport: http(options.rpcUrl), + chain, + transport, }); } diff --git a/packages/evm/src/sdk/event-listener.ts b/packages/evm/src/sdk/event-listener.ts index 2de1215a73..68df1c9678 100644 --- a/packages/evm/src/sdk/event-listener.ts +++ b/packages/evm/src/sdk/event-listener.ts @@ -34,23 +34,32 @@ export class EventListener implements SDKEventEmitter { callback: EventCallback, ): Promise { const watcherKey = `${address}:${eventType}`; + console.log(`watchContractEvent: ${watcherKey}`); if (!this.listeners.has(eventType)) { this.listeners.set(eventType, new Set()); } - + console.log("Added callback"); this.listeners.get(eventType)!.add(callback as EventCallback); + // eslint-disable-next-line @typescript-eslint/no-this-alias + const emitter = this; + // If we don't have an active watcher for this event, create one if (!this.activeWatchers.has(watcherKey)) { + console.log("Adding active watcher for " + watcherKey); + try { const unwatch = this.publicClient.watchContractEvent({ address, abi, eventName: eventType as string, fromBlock: this.config.fromBlock, - onLogs: (logs: Log[]) => { - logs.forEach((log: Log) => { + onLogs(logs: Log[]) { + console.log(`Log received for ${watcherKey}`, logs); + for (let i = 0; i < logs.length; i++) { + const log = logs[i]; + console.log("Got log!"); const event: EnclaveEvent = { type: eventType, data: (log as unknown as { args: unknown }) @@ -64,8 +73,10 @@ export class EventListener implements SDKEventEmitter { blockNumber: log.blockNumber ?? BigInt(0), transactionHash: log.transactionHash ?? "0x", }; - this.emit(event); - }); + console.log("Created event, now emitting event..."); + emitter.emit(event); + console.log("Event emitted"); + } }, }); @@ -205,9 +216,12 @@ export class EventListener implements SDKEventEmitter { } public emit(event: EnclaveEvent): void { + console.log("emit() called for " + event.type); const callbacks = this.listeners.get(event.type); if (callbacks) { + console.log("Have " + callbacks.size + " callbacks"); callbacks.forEach((callback) => { + console.log("Running callback..."); try { void (callback as EventCallback)(event); } catch (error) { diff --git a/packages/evm/src/sdk/types.ts b/packages/evm/src/sdk/types.ts index 6cac260a61..e196ab394a 100644 --- a/packages/evm/src/sdk/types.ts +++ b/packages/evm/src/sdk/types.ts @@ -73,24 +73,26 @@ export enum RegistryEventType { export type AllEventTypes = EnclaveEventType | RegistryEventType; // Event data interfaces based on TypeChain types +export interface E3 { + seed: bigint; + threshold: readonly [number, number]; + requestBlock: bigint; + startWindow: readonly [bigint, bigint]; + duration: bigint; + expiration: bigint; + encryptionSchemeId: string; + e3Program: string; + e3ProgramParams: string; + inputValidator: string; + decryptionVerifier: string; + committeePublicKey: string; + ciphertextOutput: string; + plaintextOutput: string; +} + export interface E3RequestedData { e3Id: bigint; - e3: { - seed: bigint; - threshold: [bigint, bigint]; - requestBlock: bigint; - startWindow: [bigint, bigint]; - duration: bigint; - expiration: bigint; - encryptionSchemeId: string; - e3Program: string; - e3ProgramParams: string; - inputValidator: string; - decryptionVerifier: string; - committeePublicKey: string; - ciphertextOutput: string; - plaintextOutput: string; - }; + e3: E3; filter: string; e3Program: string; } diff --git a/templates/default/.gitignore b/templates/default/.gitignore index f9732d09f0..313921fcd5 100644 --- a/templates/default/.gitignore +++ b/templates/default/.gitignore @@ -17,7 +17,6 @@ node_modules /target # Ignore risc0 files -contracts/ImageID.sol tests/Elf.sol /deployments diff --git a/templates/default/.gitignore.bak b/templates/default/.gitignore.bak index b02b5c1495..7b1d1b5934 100644 --- a/templates/default/.gitignore.bak +++ b/templates/default/.gitignore.bak @@ -19,5 +19,9 @@ node_modules /coverage /coverage.json +# Ignore risc0 files +contracts/ImageID.sol +tests/Elf.sol + # Hardhat Ignition default folder for deployments against a local node ignition/deployments/chain-31337 diff --git a/templates/default/client/src/pages/WizardSDK.tsx b/templates/default/client/src/pages/WizardSDK.tsx index 3c359bcc24..0ae60e64c7 100644 --- a/templates/default/client/src/pages/WizardSDK.tsx +++ b/templates/default/client/src/pages/WizardSDK.tsx @@ -11,31 +11,31 @@ import Spinner from './components/Spinner' // SDK and utilities import { useEnclaveSDK } from '@gnosis-guild/enclave-react' import { - encodeBfvParams, - encodeComputeProviderParams, - calculateStartWindow, - decodePlaintextOutput, - DEFAULT_COMPUTE_PROVIDER_PARAMS, - DEFAULT_E3_CONFIG + encodeBfvParams, + encodeComputeProviderParams, + calculateStartWindow, + decodePlaintextOutput, + DEFAULT_COMPUTE_PROVIDER_PARAMS, + DEFAULT_E3_CONFIG, } from '@gnosis-guild/enclave/sdk' import { HAS_MISSING_ENV_VARS, MISSING_ENV_VARS, getContractAddresses } from '@/utils/env-config' import { formatContractError } from '@/utils/error-formatting' -// WebAssembly hook +// WebAssembly hook import { useWebAssemblyHook } from '@/hooks/useWebAssembly' // Icons import { - Wallet, - Calculator, - Lock, - CheckCircle, - NumberSquareOne, - NumberSquareTwo, - NumberSquareThree, - NumberSquareFour, - NumberSquareFive, - NumberSquareSix + Wallet, + Calculator, + Lock, + CheckCircle, + NumberSquareOne, + NumberSquareTwo, + NumberSquareThree, + NumberSquareFour, + NumberSquareFive, + NumberSquareSix, } from '@phosphor-icons/react' // ============================================================================ @@ -43,23 +43,23 @@ import { // ============================================================================ enum WizardStep { - CONNECT_WALLET = 1, - REQUEST_COMPUTATION = 2, - ACTIVATE_E3 = 3, - ENTER_INPUTS = 4, - ENCRYPT_SUBMIT = 5, - RESULTS = 6, + CONNECT_WALLET = 1, + REQUEST_COMPUTATION = 2, + ACTIVATE_E3 = 3, + ENTER_INPUTS = 4, + ENCRYPT_SUBMIT = 5, + RESULTS = 6, } interface E3State { - id: bigint | null - isRequested: boolean - isCommitteePublished: boolean - isActivated: boolean - publicKey: `0x${string}` | null - expiresAt: bigint | null - plaintextOutput: string | null - hasPlaintextOutput: boolean + id: bigint | null + isRequested: boolean + isCommitteePublished: boolean + isActivated: boolean + publicKey: `0x${string}` | null + expiresAt: bigint | null + plaintextOutput: string | null + hasPlaintextOutput: boolean } // ============================================================================ @@ -67,527 +67,473 @@ interface E3State { // ============================================================================ interface ErrorDisplayProps { - error: any - showDetails: boolean - onToggleDetails: () => void + error: any + showDetails: boolean + onToggleDetails: () => void } const ErrorDisplay: React.FC = ({ error, showDetails, onToggleDetails }) => { - if (!error) return null; - - const userMessage = formatContractError(error); - const technicalMessage = error.message || JSON.stringify(error, null, 2); - - return ( -
-

- Error: {userMessage} -

- {userMessage !== technicalMessage && ( - - )} - {showDetails && userMessage !== technicalMessage && ( -
-                    {technicalMessage}
-                
- )} -
- ); -}; + if (!error) return null + + const userMessage = formatContractError(error) + const technicalMessage = error.message || JSON.stringify(error, null, 2) + + return ( +
+

+ Error: {userMessage} +

+ {userMessage !== technicalMessage && ( + + )} + {showDetails && userMessage !== technicalMessage && ( +
{technicalMessage}
+ )} +
+ ) +} // ============================================================================ -// STEP COMPONENTS +// STEP COMPONENTS // ============================================================================ const ConnectWalletStep: React.FC = () => ( - -
-
- -
-

Step 1: Connect Your Wallet

-
-

Welcome to Enclave

-

- Enclave is a protocol for Encrypted Execution Environments (E3) that enables secure computations - on private data using fully homomorphic encryption (FHE), zero-knowledge proofs, and distributed - key cryptography. Connect your wallet to experience privacy-preserving computation. -

-
-

- How it works: You'll request an E3 computation → Ciphernode committee is selected - → Committee publishes shared public key → You encrypt and submit inputs → Secure computation executes - → Only verified outputs are decrypted by the committee. -

-
-
-
- -
+ +
+
+ +
+

Step 1: Connect Your Wallet

+
+

Welcome to Enclave

+

+ Enclave is a protocol for Encrypted Execution Environments (E3) that enables secure computations on private data using fully + homomorphic encryption (FHE), zero-knowledge proofs, and distributed key cryptography. Connect your wallet to experience + privacy-preserving computation. +

+
+

+ How it works: You'll request an E3 computation → Ciphernode committee is selected → Committee publishes shared + public key → You encrypt and submit inputs → Secure computation executes → Only verified outputs are decrypted by the committee. +

- +
+
+ +
+
+
) interface RequestComputationStepProps { - e3State: E3State - isRequesting: boolean - transactionHash: string | undefined - error: any - isSuccess: boolean - onRequestComputation: () => Promise + e3State: E3State + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onRequestComputation: () => Promise } const RequestComputationStep: React.FC = ({ - e3State, - isRequesting, - transactionHash, - error, - isSuccess, - onRequestComputation + e3State, + isRequesting, + transactionHash, + error, + isSuccess, + onRequestComputation, }) => ( - -
-
- -
-

Step 2: Request Computation

-
-

Request Encrypted Execution Environment

-

- Request an E3 computation from Enclave's decentralized network. This initiates the selection - of a Ciphernode Committee through cryptographic sortition, who will generate shared - keys for securing your computation without any single point of trust. -

-
-

- Process: Request E3 → Committee Selection via Sortition → Key Generation → Ready for Activation -

-
+ +
+
+ +
+

Step 2: Request Computation

+
+

Request Encrypted Execution Environment

+

+ Request an E3 computation from Enclave's decentralized network. This initiates the selection of a Ciphernode Committee through + cryptographic sortition, who will generate shared keys for securing your computation without any single point of trust. +

+
+

+ Process: Request E3 → Committee Selection via Sortition → Key Generation → Ready for Activation +

+
- {/* E3 State Progress */} - {e3State.id !== null && ( -
-
-

- ✅ E3 ID: {String(e3State.id)} -
- Status: Computation requested -

-
- - {e3State.isCommitteePublished && e3State.publicKey ? ( -
-

- 🔑 Committee Published Public Key! -
- Public Key: {e3State.publicKey.slice(0, 20)}...{e3State.publicKey.slice(-10)} -
- Ready to activate E3 environment. -

-
- ) : ( -
-
- -

- ⏳ Waiting for committee to publish public key... -
- The computation committee is being selected and will provide the public key shortly. -

-
-
- )} -
- )} - - {error && ( - { }} - /> - )} - - {isSuccess && transactionHash && ( -
-

- ✅ Transaction Successful! -
- Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} -

-
- )} + {/* E3 State Progress */} + {e3State.id !== null && ( +
+
+

+ ✅ E3 ID: {String(e3State.id)} +
+ Status: Computation requested +

- {isRequesting && ( -
- + {e3State.isCommitteePublished && e3State.publicKey ? ( +
+

+ 🔑 Committee Published Public Key! +
+ Public Key: {e3State.publicKey.slice(0, 20)}...{e3State.publicKey.slice(-10)} +
+ Ready to activate E3 environment. +

+
+ ) : ( +
+
+ +

+ ⏳ Waiting for committee to publish public key... +
+ The computation committee is being selected and will provide the public key shortly. +

+
)} +
+ )} - + {error && {}} />} + + {isSuccess && transactionHash && ( +
+

+ ✅ Transaction Successful! +
+ Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} +
+ + {isRequesting && ( +
+
- + )} + + +
+ ) interface ActivateE3StepProps { - e3State: E3State - isRequesting: boolean - transactionHash: string | undefined - error: any - isSuccess: boolean - onActivateE3: () => Promise + e3State: E3State + isRequesting: boolean + transactionHash: string | undefined + error: any + isSuccess: boolean + onActivateE3: () => Promise } -const ActivateE3Step: React.FC = ({ - e3State, - isRequesting, - transactionHash, - error, - isSuccess, - onActivateE3 -}) => ( - -
-
- -
-

Step 3: Activate E3

-
-

Activate Encrypted Execution Environment

-

- Activate the E3 using the Ciphernode Committee's shared public key. This distributed - key ensures no single node can decrypt your inputs or intermediate states - only the verified - final output can be collectively decrypted by the committee. -

+const ActivateE3Step: React.FC = ({ e3State, isRequesting, transactionHash, error, isSuccess, onActivateE3 }) => ( + +
+
+ +
+

Step 3: Activate E3

+
+

Activate Encrypted Execution Environment

+

+ Activate the E3 using the Ciphernode Committee's shared public key. This distributed key ensures no single node can decrypt your + inputs or intermediate states - only the verified final output can be collectively decrypted by the committee. +

+ + {e3State.isActivated && e3State.expiresAt && ( +
+

+ ✅ E3 Environment Activated! +
+ Expires At: {new Date(Number(e3State.expiresAt) * 1000).toLocaleString()} +

+
+ )} - {e3State.isActivated && e3State.expiresAt && ( -
-

- ✅ E3 Environment Activated! -
- Expires At: {new Date(Number(e3State.expiresAt) * 1000).toLocaleString()} -

-
- )} - - {error && ( - { }} - /> - )} - - {isSuccess && transactionHash && ( -
-

- ✅ Transaction Successful! -
- Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} -

-
- )} -
+ {error && {}} />} - {isRequesting && ( -
- -
- )} + {isSuccess && transactionHash && ( +
+

+ ✅ Transaction Successful! +
+ Hash: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} +
- + {isRequesting && ( +
+
-
+ )} + + +
+ ) interface EnterInputsStepProps { - e3State: E3State - input1: string - input2: string - onInput1Change: (value: string) => void - onInput2Change: (value: string) => void - onSubmit: (e: React.FormEvent) => void + e3State: E3State + input1: string + input2: string + onInput1Change: (value: string) => void + onInput2Change: (value: string) => void + onSubmit: (e: React.FormEvent) => void } -const EnterInputsStep: React.FC = ({ - e3State, - input1, - input2, - onInput1Change, - onInput2Change, - onSubmit -}) => ( - -
-
- -
-

Step 4: Enter Your Numbers

-
-

Homomorphic Encrypted Computation

-

- Enter two numbers for a privacy-preserving addition using fully homomorphic encryption (FHE). - Your inputs will be encrypted locally and remain encrypted throughout the entire computation - process, with only the final result being decrypted. -

-
-

- Privacy Guarantee: FHE allows computation on encrypted data. Your numbers remain - private throughout the process - inputs, intermediate states, and execution are all encrypted. -

-
- -
-
- - onInput1Change(e.target.value)} - className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-enclave-500 focus:border-transparent" - placeholder="Enter first number" - required - /> -
-
- - onInput2Change(e.target.value)} - className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-enclave-500 focus:border-transparent" - placeholder="Enter second number" - required - /> -
-
+const EnterInputsStep: React.FC = ({ e3State, input1, input2, onInput1Change, onInput2Change, onSubmit }) => ( + + +
+ +
+

Step 4: Enter Your Numbers

+
+

Homomorphic Encrypted Computation

+

+ Enter two numbers for a privacy-preserving addition using fully homomorphic encryption (FHE). Your inputs will be encrypted + locally and remain encrypted throughout the entire computation process, with only the final result being decrypted. +

+
+

+ Privacy Guarantee: FHE allows computation on encrypted data. Your numbers remain private throughout the process + - inputs, intermediate states, and execution are all encrypted. +

+
- {input1 && input2 && ( -
-

- Ready to compute: {input1} + {input2} = ? -

-
- )} -
+
+
+ + onInput1Change(e.target.value)} + className='w-full rounded-md border border-slate-300 px-3 py-2 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-enclave-500' + placeholder='Enter first number' + required + /> +
+
+ + onInput2Change(e.target.value)} + className='w-full rounded-md border border-slate-300 px-3 py-2 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-enclave-500' + placeholder='Enter second number' + required + /> +
+
- - -
+ {input1 && input2 && ( +
+

+ Ready to compute: {input1} + {input2} = ? +

+
+ )} +
+ + + +
) interface EncryptSubmitStepProps { - inputPublishError: string | null - inputPublishSuccess: boolean - showErrorDetails: boolean - onToggleErrorDetails: () => void - onTryAgain: () => void + inputPublishError: string | null + inputPublishSuccess: boolean + showErrorDetails: boolean + onToggleErrorDetails: () => void + onTryAgain: () => void } const EncryptSubmitStep: React.FC = ({ - inputPublishError, - inputPublishSuccess, - showErrorDetails, - onToggleErrorDetails, - onTryAgain + inputPublishError, + inputPublishSuccess, + showErrorDetails, + onToggleErrorDetails, + onTryAgain, }) => ( - -
-
- + +
+
+ +
+

Step 5: Encrypting & Submitting

+
+

Secure Process Execution

+ + {!inputPublishError && !inputPublishSuccess && ( +
+
+
-

Step 5: Encrypting & Submitting

-
-

Secure Process Execution

- - {!inputPublishError && !inputPublishSuccess && ( -
-
- -
-

- Your inputs are being encrypted to the committee's public key and submitted to the E3. - The Compute Provider will execute the FHE computation over your encrypted data... -

-
-

- Process: Encrypt to Key → Submit to E3 → FHE Computation → Ciphertext Output -

-
-
- )} - - {inputPublishError && ( -
- - -
- )} - - {inputPublishSuccess && ( -
-
- -
-
-

- ✅ Inputs Successfully Submitted! -
- Your encrypted inputs have been published to the E3. The Compute Provider is executing - the FHE computation and will publish the ciphertext output for committee decryption. -

-
-
-
- -
-

- Computing... Waiting for the Ciphernode Committee to collectively decrypt the verified output. -

-
-
- )} +

+ Your inputs are being encrypted to the committee's public key and submitted to the E3. The Compute Provider will execute the + FHE computation over your encrypted data... +

+
+

+ Process: Encrypt to Key → Submit to E3 → FHE Computation → Ciphertext Output +

-
- +
+ )} + + {inputPublishError && ( +
+ + +
+ )} + + {inputPublishSuccess && ( +
+
+ +
+
+

+ ✅ Inputs Successfully Submitted! +
+ Your encrypted inputs have been published to the E3. The Compute Provider is executing the FHE computation and will publish + the ciphertext output for committee decryption. +

+
+
+
+ +
+

+ Computing... Waiting for the Ciphernode Committee to collectively decrypt the verified output. +

+
+
+ )} +
+
+
) interface ResultsStepProps { - input1: string - input2: string - result: number | null - e3State: E3State - transactionHash: string | undefined - onReset: () => void + input1: string + input2: string + result: number | null + e3State: E3State + transactionHash: string | undefined + onReset: () => void } -const ResultsStep: React.FC = ({ - input1, - input2, - result, - e3State, - transactionHash, - onReset -}) => ( - -
-
- -
-

Step 6: Results

-
-

Computation Complete!

- -
-
-

- Your Encrypted Computation: -

-

- {input1} + {input2} = {result !== null ? result : 'Computing...'} -

- {result !== null && ( -

- ✅ Computed securely using FHE with distributed key decryption! -

- )} -
-
- -
-
-

- E3 ID: {String(e3State.id)} -

-
- {transactionHash && ( -
-

- Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} -

-
- )} - {e3State.plaintextOutput && ( -
-

- Raw Output: {e3State.plaintextOutput.slice(0, 20)}... -

-
- )} -
+const ResultsStep: React.FC = ({ input1, input2, result, e3State, transactionHash, onReset }) => ( + +
+
+ +
+

Step 6: Results

+
+

Computation Complete!

+ +
+
+

+ Your Encrypted Computation: +

+

+ {input1} + {input2} = {result !== null ? result : 'Computing...'} +

+ {result !== null &&

✅ Computed securely using FHE with distributed key decryption!

} +
+
-
-

- 🔒 Cryptographic Guarantees: Your inputs remained encrypted throughout the entire - process. The Ciphernode Committee used distributed key cryptography to decrypt only the - verified output, ensuring data privacy, data integrity, and correct execution. -

-
+
+
+

+ E3 ID: {String(e3State.id)} +

+
+ {transactionHash && ( +
+

+ Transaction: {transactionHash.slice(0, 10)}...{transactionHash.slice(-8)} +

+
+ )} + {e3State.plaintextOutput && ( +
+

+ Raw Output: {e3State.plaintextOutput.slice(0, 20)}... +

+ )} +
- +
+

+ 🔒 Cryptographic Guarantees: Your inputs remained encrypted throughout the entire process. The Ciphernode + Committee used distributed key cryptography to decrypt only the verified output, ensuring data privacy, data integrity, and + correct execution. +

- +
+ + +
+
) // ============================================================================ @@ -595,430 +541,424 @@ const ResultsStep: React.FC = ({ // ============================================================================ const WizardSDK: React.FC = () => { - const { isConnected } = useAccount() - const { isLoaded: isWasmLoaded, encryptInput } = useWebAssemblyHook() - - if (HAS_MISSING_ENV_VARS) { - return + const { isConnected } = useAccount() + const { isLoaded: isWasmLoaded, encryptInput } = useWebAssemblyHook() + + if (HAS_MISSING_ENV_VARS) { + return + } + const contracts = getContractAddresses() + const sdkConfig = useMemo( + () => ({ + autoConnect: true, + contracts: { + enclave: contracts.enclave, + ciphernodeRegistry: contracts.ciphernodeRegistry, + }, + }), + [contracts.enclave, contracts.ciphernodeRegistry], + ) + + const { + isInitialized, + error: sdkError, + requestE3, + activateE3, + publishInput, + onEnclaveEvent, + off, + EnclaveEventType, + RegistryEventType, + } = useEnclaveSDK(sdkConfig) + + // Component state + const [currentStep, setCurrentStep] = useState(WizardStep.CONNECT_WALLET) + const [input1, setInput1] = useState('') + const [input2, setInput2] = useState('') + const [lastTransactionHash, setLastTransactionHash] = useState() + const [inputPublishError, setInputPublishError] = useState(null) + const [inputPublishSuccess, setInputPublishSuccess] = useState(false) + const [requestError, setRequestError] = useState(null) + const [showErrorDetails, setShowErrorDetails] = useState(false) + const [isRequesting, setIsRequesting] = useState(false) + const [requestSuccess, setRequestSuccess] = useState(false) + const [result, setResult] = useState(null) + + // E3 state tracking + const [e3State, setE3State] = useState({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false, + }) + + // Set up event listeners + useEffect(() => { + if (!isInitialized) return + + const handleE3Requested = (event: any) => { + const e3Id = event.data.e3Id + setE3State((prev) => ({ + ...prev, + id: e3Id, + isRequested: true, + })) } - const contracts = getContractAddresses() - const sdkConfig = useMemo(() => ({ - autoConnect: true, - contracts: { - enclave: contracts.enclave, - ciphernodeRegistry: contracts.ciphernodeRegistry - } - }), [contracts.enclave, contracts.ciphernodeRegistry]) - - const { - isInitialized, - error: sdkError, - requestE3, - activateE3, - publishInput, - onEnclaveEvent, - off, - EnclaveEventType, - RegistryEventType - } = useEnclaveSDK(sdkConfig) - - // Component state - const [currentStep, setCurrentStep] = useState(WizardStep.CONNECT_WALLET) - const [input1, setInput1] = useState('') - const [input2, setInput2] = useState('') - const [lastTransactionHash, setLastTransactionHash] = useState() - const [inputPublishError, setInputPublishError] = useState(null) - const [inputPublishSuccess, setInputPublishSuccess] = useState(false) - const [requestError, setRequestError] = useState(null) - const [showErrorDetails, setShowErrorDetails] = useState(false) - const [isRequesting, setIsRequesting] = useState(false) - const [requestSuccess, setRequestSuccess] = useState(false) - const [result, setResult] = useState(null) - - // E3 state tracking - const [e3State, setE3State] = useState({ - id: null, - isRequested: false, - isCommitteePublished: false, - isActivated: false, - publicKey: null, - expiresAt: null, - plaintextOutput: null, - hasPlaintextOutput: false - }) - - // Set up event listeners - useEffect(() => { - if (!isInitialized) return - - const handleE3Requested = (event: any) => { - const e3Id = event.data.e3Id - setE3State(prev => ({ - ...prev, - id: e3Id, - isRequested: true - })) - } - - const handleCommitteePublished = (event: any) => { - const { e3Id, publicKey } = event.data - - // I added a 2 second delay to show the waiting state, its too fast on anvil - setTimeout(() => { - setE3State(prev => { - if (prev.id !== null && e3Id === prev.id) { - return { - ...prev, - isCommitteePublished: true, - publicKey: publicKey as `0x${string}` - } - } - return prev - }) - }, 2000) - } - - const handleE3Activated = (event: any) => { - const { e3Id, expiration } = event.data - setE3State(prev => { - if (prev.id !== null && e3Id === prev.id) { - return { - ...prev, - isActivated: true, - expiresAt: expiration || null - } - } - return prev - }) - } - - const handlePlaintextOutput = (event: any) => { - const { e3Id, plaintextOutput } = event.data - setE3State(prev => { - if (prev.id !== null && e3Id === prev.id) { - const decodedResult = decodePlaintextOutput(plaintextOutput) - setResult(decodedResult) - return { - ...prev, - plaintextOutput: plaintextOutput as string, - hasPlaintextOutput: true - } - } - return prev - }) - } - // Set up event listeners - onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested) - onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) - onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3Activated) - onEnclaveEvent(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) - - // Cleanup - return () => { - off(EnclaveEventType.E3_REQUESTED, handleE3Requested) - off(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) - off(EnclaveEventType.E3_ACTIVATED, handleE3Activated) - off(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) - } - }, [isInitialized, onEnclaveEvent, off, EnclaveEventType, RegistryEventType]) - - // Auto-advance steps based on state - useEffect(() => { - if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { - setCurrentStep(WizardStep.CONNECT_WALLET) - } else if (isConnected && isInitialized && currentStep === WizardStep.CONNECT_WALLET) { - setCurrentStep(WizardStep.REQUEST_COMPUTATION) - } else if (e3State.isCommitteePublished && currentStep === WizardStep.REQUEST_COMPUTATION) { - setCurrentStep(WizardStep.ACTIVATE_E3) - } else if (e3State.isActivated && currentStep === WizardStep.ACTIVATE_E3) { - setCurrentStep(WizardStep.ENTER_INPUTS) - } else if (e3State.hasPlaintextOutput && currentStep < WizardStep.RESULTS) { - setCurrentStep(WizardStep.RESULTS) - } - }, [isConnected, isInitialized, currentStep, e3State]) - - const handleRequestComputation = async () => { - setIsRequesting(true) - setRequestError(null) - setRequestSuccess(false) - - // Reset E3 state - setE3State({ - id: null, - isRequested: false, - isCommitteePublished: false, - isActivated: false, - publicKey: null, - expiresAt: null, - plaintextOutput: null, - hasPlaintextOutput: false + const handleCommitteePublished = (event: any) => { + const { e3Id, publicKey } = event.data + + // I added a 2 second delay to show the waiting state, its too fast on anvil + setTimeout(() => { + setE3State((prev) => { + if (prev.id !== null && e3Id === prev.id) { + return { + ...prev, + isCommitteePublished: true, + publicKey: publicKey as `0x${string}`, + } + } + return prev }) - - try { - const threshold: [number, number] = [DEFAULT_E3_CONFIG.threshold_min, DEFAULT_E3_CONFIG.threshold_max] - const startWindow = calculateStartWindow() - const duration = BigInt(DEFAULT_E3_CONFIG.duration) - const e3ProgramParams = encodeBfvParams() - const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) - - const hash = await requestE3({ - filter: contracts.filterRegistry, - threshold, - startWindow, - duration, - e3Program: contracts.e3Program, - e3ProgramParams, - computeProviderParams, - value: BigInt("1000000000000000") // 0.001 ETH - }) - - setLastTransactionHash(hash) - setRequestSuccess(true) - } catch (error) { - setRequestError(error) - console.error('Error requesting computation:', error) - } finally { - setIsRequesting(false) - } + }, 2000) } - const handleActivateE3 = async () => { - if (!e3State.id || !e3State.publicKey) return - - setIsRequesting(true) - setRequestError(null) - - try { - const hash = await activateE3(e3State.id, e3State.publicKey) - setLastTransactionHash(hash) - setRequestSuccess(true) - } catch (error) { - setRequestError(error) - console.error('Error activating E3:', error) - } finally { - setIsRequesting(false) + const handleE3Activated = (event: any) => { + const { e3Id, expiration } = event.data + setE3State((prev) => { + if (prev.id !== null && e3Id === prev.id) { + return { + ...prev, + isActivated: true, + expiresAt: expiration || null, + } } + return prev + }) } - const handleInputSubmit = async (e: React.FormEvent) => { - e.preventDefault() - if (!input1 || !input2 || !e3State.publicKey || !e3State.id) return - - setCurrentStep(WizardStep.ENCRYPT_SUBMIT) - setInputPublishError(null) - setInputPublishSuccess(false) - - try { - // Parse inputs - const num1 = BigInt(input1) - const num2 = BigInt(input2) - - // Convert hex public key to bytes - const publicKeyBytes = hexToBytes(e3State.publicKey) - - // Encrypt both inputs - const encryptedInput1 = await encryptInput(num1, publicKeyBytes) - const encryptedInput2 = await encryptInput(num2, publicKeyBytes) - - if (!encryptedInput1 || !encryptedInput2) { - throw new Error('Failed to encrypt inputs') - } - - // Publish first input - await publishInput( - e3State.id, - `0x${Array.from(encryptedInput1, b => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}` - ) - - // Publish second input - const hash2 = await publishInput( - e3State.id, - `0x${Array.from(encryptedInput2, b => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}` - ) - - setLastTransactionHash(hash2) - setInputPublishSuccess(true) - } catch (error) { - setInputPublishError(error instanceof Error ? error.message : 'Failed to encrypt and publish inputs') - console.error('Error encrypting/publishing inputs:', error) + const handlePlaintextOutput = (event: any) => { + const { e3Id, plaintextOutput } = event.data + setE3State((prev) => { + if (prev.id !== null && e3Id === prev.id) { + const decodedResult = decodePlaintextOutput(plaintextOutput) + setResult(decodedResult) + return { + ...prev, + plaintextOutput: plaintextOutput as string, + hasPlaintextOutput: true, + } } + return prev + }) } - const handleReset = () => { - setCurrentStep(WizardStep.CONNECT_WALLET) - setInput1('') - setInput2('') - setLastTransactionHash(undefined) - setInputPublishError(null) - setInputPublishSuccess(false) - setRequestError(null) - setIsRequesting(false) - setRequestSuccess(false) - setResult(null) - setE3State({ - id: null, - isRequested: false, - isCommitteePublished: false, - isActivated: false, - publicKey: null, - expiresAt: null, - plaintextOutput: null, - hasPlaintextOutput: false - }) + // Set up event listeners + onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested) + onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) + onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3Activated) + onEnclaveEvent(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) + + // Cleanup + return () => { + off(EnclaveEventType.E3_REQUESTED, handleE3Requested) + off(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) + off(EnclaveEventType.E3_ACTIVATED, handleE3Activated) + off(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) } - - const handleTryAgain = () => { - setCurrentStep(WizardStep.ENTER_INPUTS) - setInputPublishError(null) - setInputPublishSuccess(false) + }, [isInitialized, onEnclaveEvent, off, EnclaveEventType, RegistryEventType]) + console.log({ currentStep }) + // Auto-advance steps based on state + useEffect(() => { + if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.CONNECT_WALLET) + } else if (isConnected && isInitialized && currentStep === WizardStep.CONNECT_WALLET) { + setCurrentStep(WizardStep.REQUEST_COMPUTATION) + } else if (e3State.isCommitteePublished && currentStep === WizardStep.REQUEST_COMPUTATION) { + setCurrentStep(WizardStep.ACTIVATE_E3) + } else if (e3State.isActivated && currentStep === WizardStep.ACTIVATE_E3) { + setCurrentStep(WizardStep.ENTER_INPUTS) + } else if (e3State.hasPlaintextOutput && currentStep < WizardStep.RESULTS) { + setCurrentStep(WizardStep.RESULTS) } + }, [isConnected, isInitialized, currentStep, e3State]) + + const handleRequestComputation = async () => { + setIsRequesting(true) + setRequestError(null) + setRequestSuccess(false) + + // Reset E3 state + setE3State({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false, + }) - const getStepIcon = (step: WizardStep) => { - const iconProps = { size: 24, className: currentStep >= step ? 'text-enclave-500' : 'text-slate-400' } - switch (step) { - case WizardStep.CONNECT_WALLET: return - case WizardStep.REQUEST_COMPUTATION: return - case WizardStep.ACTIVATE_E3: return - case WizardStep.ENTER_INPUTS: return - case WizardStep.ENCRYPT_SUBMIT: return - case WizardStep.RESULTS: return - } + try { + const threshold: [number, number] = [DEFAULT_E3_CONFIG.threshold_min, DEFAULT_E3_CONFIG.threshold_max] + const startWindow = calculateStartWindow(60) // 1 minute + const duration = BigInt(60) // 1 minute + const e3ProgramParams = encodeBfvParams() + const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) + + const hash = await requestE3({ + filter: contracts.filterRegistry, + threshold, + startWindow, + duration, + e3Program: contracts.e3Program, + e3ProgramParams, + computeProviderParams, + value: BigInt('1000000000000000'), // 0.001 ETH + }) + + setLastTransactionHash(hash) + setRequestSuccess(true) + } catch (error) { + setRequestError(error) + console.error('Error requesting computation:', error) + } finally { + setIsRequesting(false) } - - const renderStepIndicator = () => ( -
-
- {[1, 2, 3, 4, 5, 6].map((step) => ( -
-
= step - ? 'bg-enclave-100 border-enclave-400 text-enclave-600' - : 'bg-slate-100 border-slate-300 text-slate-400' - }`}> - {getStepIcon(step as WizardStep)} -
- {step < 6 && ( -
step ? 'bg-enclave-400' : 'bg-slate-300' - }`} /> - )} -
- ))} -
-
- ) - - const renderStepContent = () => { - switch (currentStep) { - case WizardStep.CONNECT_WALLET: - return - case WizardStep.REQUEST_COMPUTATION: - return ( - - ) - case WizardStep.ACTIVATE_E3: - return ( - - ) - case WizardStep.ENTER_INPUTS: - return ( - - ) - case WizardStep.ENCRYPT_SUBMIT: - return ( - setShowErrorDetails(!showErrorDetails)} - onTryAgain={handleTryAgain} - /> - ) - case WizardStep.RESULTS: - return ( - - ) - default: - return null - } + } + + const handleActivateE3 = async () => { + if (!e3State.id || !e3State.publicKey) return + + setIsRequesting(true) + setRequestError(null) + + try { + const hash = await activateE3(e3State.id, e3State.publicKey) + setLastTransactionHash(hash) + setRequestSuccess(true) + } catch (error) { + setRequestError(error) + console.error('Error activating E3:', error) + } finally { + setIsRequesting(false) } - - if (sdkError) { - return ( -
-
-
-
-
-

- SDK Error -

-
- {sdkError} -
-
-
-
-
+ } + + const handleInputSubmit = async (e: React.FormEvent) => { + e.preventDefault() + if (!input1 || !input2 || !e3State.publicKey || !e3State.id) return + + setCurrentStep(WizardStep.ENCRYPT_SUBMIT) + setInputPublishError(null) + setInputPublishSuccess(false) + + try { + // Parse inputs + const num1 = BigInt(input1) + const num2 = BigInt(input2) + + // Convert hex public key to bytes + const publicKeyBytes = hexToBytes(e3State.publicKey) + + // Encrypt both inputs + const encryptedInput1 = await encryptInput(num1, publicKeyBytes) + const encryptedInput2 = await encryptInput(num2, publicKeyBytes) + + if (!encryptedInput1 || !encryptedInput2) { + throw new Error('Failed to encrypt inputs') + } + + // Publish first input + await publishInput(e3State.id, `0x${Array.from(encryptedInput1, (b) => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}`) + + // Publish second input + const hash2 = await publishInput( + e3State.id, + `0x${Array.from(encryptedInput2, (b) => b.toString(16).padStart(2, '0')).join('')}` as `0x${string}`, + ) + + setLastTransactionHash(hash2) + setInputPublishSuccess(true) + } catch (error) { + setInputPublishError(error instanceof Error ? error.message : 'Failed to encrypt and publish inputs') + console.error('Error encrypting/publishing inputs:', error) + } + } + + const handleReset = () => { + setCurrentStep(WizardStep.CONNECT_WALLET) + setInput1('') + setInput2('') + setLastTransactionHash(undefined) + setInputPublishError(null) + setInputPublishSuccess(false) + setRequestError(null) + setIsRequesting(false) + setRequestSuccess(false) + setResult(null) + setE3State({ + id: null, + isRequested: false, + isCommitteePublished: false, + isActivated: false, + publicKey: null, + expiresAt: null, + plaintextOutput: null, + hasPlaintextOutput: false, + }) + } + + const handleTryAgain = () => { + setCurrentStep(WizardStep.ENTER_INPUTS) + setInputPublishError(null) + setInputPublishSuccess(false) + } + + const getStepIcon = (step: WizardStep) => { + const iconProps = { size: 24, className: currentStep >= step ? 'text-enclave-500' : 'text-slate-400' } + switch (step) { + case WizardStep.CONNECT_WALLET: + return + case WizardStep.REQUEST_COMPUTATION: + return + case WizardStep.ACTIVATE_E3: + return + case WizardStep.ENTER_INPUTS: + return + case WizardStep.ENCRYPT_SUBMIT: + return + case WizardStep.RESULTS: + return + } + } + + const renderStepIndicator = () => ( +
+
+ {[1, 2, 3, 4, 5, 6].map((step) => ( +
+
= step ? 'border-enclave-400 bg-enclave-100 text-enclave-600' : 'border-slate-300 bg-slate-100 text-slate-400' + }`} + > + {getStepIcon(step as WizardStep)}
+ {step < 6 && ( +
step ? 'bg-enclave-400' : 'bg-slate-300'}`} /> + )} +
+ ))} +
+
+ ) + + const renderStepContent = () => { + switch (currentStep) { + case WizardStep.CONNECT_WALLET: + return + case WizardStep.REQUEST_COMPUTATION: + return ( + ) + case WizardStep.ACTIVATE_E3: + return ( + + ) + case WizardStep.ENTER_INPUTS: + return ( + + ) + case WizardStep.ENCRYPT_SUBMIT: + return ( + setShowErrorDetails(!showErrorDetails)} + onTryAgain={handleTryAgain} + /> + ) + case WizardStep.RESULTS: + return ( + + ) + default: + return null } + } + if (sdkError) { return ( -
-
-
-

- Enclave E3 -

-

- Confidential computation with Enclave Encrypted Execution Environments -

-
- - {renderStepIndicator()} - -
- {renderStepContent()} -
- - {!isWasmLoaded && ( -
-

- Loading encryption module... -

-
- )} +
+
+
+
+
+

SDK Error

+
{sdkError}
+
+
+
) + } + + return ( +
+
+
+

Enclave E3

+

Confidential computation with Enclave Encrypted Execution Environments

+
+ + {renderStepIndicator()} + +
{renderStepContent()}
+ + {!isWasmLoaded && ( +
+

Loading encryption module...

+
+ )} +
+
+ ) } -export default WizardSDK \ No newline at end of file +export default WizardSDK diff --git a/templates/default/contracts/ImageID.sol b/templates/default/contracts/ImageID.sol new file mode 100644 index 0000000000..eb936f62a1 --- /dev/null +++ b/templates/default/contracts/ImageID.sol @@ -0,0 +1,23 @@ +// Copyright 2024 RISC Zero, Inc. +// +// 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. +// +// SPDX-License-Identifier: Apache-2.0 + +// This file is automatically generated + +pragma solidity ^0.8.20; + +library ImageID { + bytes32 public constant PROGRAM_ID = bytes32(0x69f2bdcf375ce3bc8c934c729c38e16ade73301bcdc6e4ae97a98910c31ab11d); +} diff --git a/templates/default/scripts/dev_ciphernodes.sh b/templates/default/scripts/dev_ciphernodes.sh index ff78d0571d..012125f16d 100755 --- a/templates/default/scripts/dev_ciphernodes.sh +++ b/templates/default/scripts/dev_ciphernodes.sh @@ -5,6 +5,8 @@ set -euo pipefail cleanup() { echo "Cleaning up processes..." enclave nodes down + sleep 2 + pkill enclave echo "Cleanup complete" exit 0 } diff --git a/templates/default/scripts/dev_program.sh b/templates/default/scripts/dev_program.sh index 961ea315de..d5ae2e9bb5 100755 --- a/templates/default/scripts/dev_program.sh +++ b/templates/default/scripts/dev_program.sh @@ -2,7 +2,4 @@ set -euo pipefail -pnpm wait-on http://localhost:8545 && \ - concurrently -r \ - "pnpm dev:server" \ - "enclave program listen --json-rpc-server http://localhost:8080 --chain hardhat" +pnpm wait-on http://localhost:8545 && enclave program start diff --git a/templates/default/scripts/dev_server.sh b/templates/default/scripts/dev_server.sh index 76f5aed63f..cec8377b87 100755 --- a/templates/default/scripts/dev_server.sh +++ b/templates/default/scripts/dev_server.sh @@ -2,4 +2,8 @@ set -euo pipefail -(export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" CHAIN_ID=31337 $(enclave print-env --chain hardhat) && pnpm ts-node ./server) +pnpm wait-on http://localhost:8545 && \ + (export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" CHAIN_ID=31337 && \ + export $(enclave print-env --chain hardhat) && \ + export RPC_URL="http://localhost:8545" && \ + pnpm ts-node ./server) diff --git a/templates/default/scripts/tmux_all.sh b/templates/default/scripts/tmux_all.sh new file mode 100755 index 0000000000..48cba2cc63 --- /dev/null +++ b/templates/default/scripts/tmux_all.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# Check if tmux is installed +if ! command -v tmux &> /dev/null; then + echo "ERROR: tmux is not installed or not in PATH" + echo "Please install tmux first:" + echo " - Ubuntu/Debian: sudo apt install tmux" + echo " - macOS: brew install tmux" + echo " - CentOS/RHEL: sudo yum install tmux" + exit 1 +fi + +# Create a new tmux session with 6 splits (2 rows of 3) and run specific commands +SESSION_NAME="enclave-splits" + +# Check if we're already inside a tmux session +if [ -n "$TMUX" ]; then + echo "Already inside a tmux session. Creating splits in current session..." + # We're inside tmux, so just create the splits in the current session +else + echo "Not in tmux. Creating new session '$SESSION_NAME'..." + # Create new session + tmux new-session -d -s "$SESSION_NAME" +fi + +# Split into 3 vertical panes (top row) +tmux split-window -h +tmux split-window -h + +# Select the first pane and create bottom row +tmux select-pane -t 1 +tmux split-window -v + +# Select the second pane and create its bottom counterpart +tmux select-pane -t 3 +tmux split-window -v + +# Select the third pane and create its bottom counterpart +tmux select-pane -t 5 +tmux split-window -v + +# Reorganize layout to make it more even +tmux select-layout tiled + +# Run commands in each pane +tmux send-keys -t 1 'pnpm dev:evm' C-m +sleep 1 + +tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m +sleep 1 + +tmux send-keys -t 3 'pnpm dev:server' C-m +sleep 1 + +tmux send-keys -t 4 'enclave program start' C-m +sleep 1 + +tmux send-keys -t 5 'pnpm dev:frontend' C-m + +# Select the first pane to start +tmux select-pane -t 1 + +# Attach to the session only if we weren't already in tmux +if [ -z "$TMUX" ]; then + tmux attach-session -t "$SESSION_NAME" +else + echo "6-split layout created in current session with commands running!" +fi diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 9ef16365a2..bfd0ac1f93 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -1,17 +1,23 @@ import express, { Request, Response } from "express"; -import { EnclaveSDK } from "@gnosis-guild/enclave/sdk"; -import { handleRpc } from "typed-rpc/server"; +import { + EnclaveSDK, + EnclaveEventType, + type E3ActivatedData, + type InputPublishedData, + type E3RequestedData, +} from "@gnosis-guild/enclave/sdk"; -function validateHex(value: string, length?: number, name = "value"): boolean { - if (!value?.startsWith("0x") || !/^[a-fA-F0-9]*$/.test(value.slice(2))) { - throw new Error(`${name} must be valid hex`); - } - if (length && value.slice(2).length !== length) { - throw new Error(`${name} must be ${length} hex chars`); - } - return true; +interface E3Session { + e3Id: bigint; + expiration: bigint; + e3ProgramParams?: string; + inputs: Array<{ data: string; index: bigint }>; + isProcessing: boolean; + isCompleted: boolean; } +const e3Sessions = new Map(); + function ensureEnv(key: string): string { const value = process.env[key]; if (!value) { @@ -27,6 +33,9 @@ function getCheckedEnvVars() { CIPHERNODE_REGISTRY_CONTRACT: ensureEnv("REGISTRY_ADDRESS"), PRIVATE_KEY: ensureEnv("PRIVATE_KEY"), CHAIN_ID: parseInt(ensureEnv("CHAIN_ID")), + PROGRAM_RUNNER_URL: + process.env.PROGRAM_RUNNER_URL || "http://127.0.0.1:13151", + CALLBACK_URL: process.env.CALLBACK_URL || "http://127.0.0.1:8080", }; } @@ -57,6 +66,148 @@ async function createPrivateSDK() { return sdk; } +async function callFheRunner( + e3Id: bigint, + params: string, + ciphertextInputs: Array<[string, number]>, +): Promise { + const { PROGRAM_RUNNER_URL, CALLBACK_URL } = getCheckedEnvVars(); + + const payload = { + e3_id: Number(e3Id), + params, + ciphertext_inputs: ciphertextInputs, + callback_url: CALLBACK_URL, + }; + + const response = await fetch(`${PROGRAM_RUNNER_URL}/run_compute`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + throw new Error( + `FHE Runner failed: ${response.status} ${response.statusText}`, + ); + } + + const result = await response.json(); + console.log(`✓ FHE Runner accepted E3 ${e3Id}:`, result); +} + +async function processE3Session(e3Id: bigint): Promise { + const sessionKey = e3Id.toString(); + const session = e3Sessions.get(sessionKey); + + if (!session || session.isProcessing || session.isCompleted) { + return; + } + + console.log( + `📊 Processing E3 session ${e3Id} with ${session.inputs.length} inputs`, + ); + + try { + session.isProcessing = true; + + if (session.inputs.length <= 1) { + console.log( + `⏭️ Skipping E3 ${e3Id}: not enough inputs (${session.inputs.length})`, + ); + session.isCompleted = true; + return; + } + + let e3ProgramParams = session.e3ProgramParams; + if (!e3ProgramParams) { + const sdk = await createPrivateSDK(); + const e3Details = (await sdk.getE3(e3Id)) as any; + e3ProgramParams = e3Details.e3ProgramParams; + session.e3ProgramParams = e3ProgramParams; + } + + const ciphertextInputs: Array<[string, number]> = session.inputs.map( + (input) => [input.data, Number(input.index)], + ); + + console.log(`🔄 Calling FHE runner for E3 ${e3Id}...`); + await callFheRunner(e3Id, e3ProgramParams!, ciphertextInputs); + + console.log(`✅ E3 ${e3Id} sent to FHE runner - awaiting callback`); + } catch (error) { + console.error(`❌ Error processing E3 ${e3Id}:`, error); + session.isProcessing = false; + } +} + +async function setupEventListeners() { + const sdk = await createPrivateSDK(); + + console.log("📡 Setting up event listeners..."); + + sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, async (event) => { + const data = event.data as E3ActivatedData; + const e3Id = data.e3Id; + const expiration = data.expiration; + + console.log(`🎯 E3 Activated: ${e3Id}, expiration: ${expiration}`); + + const sessionKey = e3Id.toString(); + if (!e3Sessions.has(sessionKey)) { + const e3 = await sdk.getE3(e3Id); + e3Sessions.set(sessionKey, { + e3Id, + e3ProgramParams: e3.e3ProgramParams, + expiration, + inputs: [], + isProcessing: false, + isCompleted: false, + }); + } + + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + const sleepSeconds = + expiration > currentTime ? Number(expiration - currentTime) : 0; + + if (sleepSeconds > 0) { + console.log( + `⏰ Scheduling E3 ${e3Id} processing in ${sleepSeconds} seconds...`, + ); + setTimeout(async () => { + await processE3Session(e3Id); + }, sleepSeconds * 1000); + } else { + console.log(`⚡ E3 ${e3Id} already expired, processing immediately...`); + await processE3Session(e3Id); + } + }); + + sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, async (event) => { + const data = event.data as InputPublishedData; + const e3Id = data.e3Id; + + console.log(`📝 Input Published for E3 ${e3Id}: index ${data.index}`); + + const sessionKey = e3Id.toString(); + const session = e3Sessions.get(sessionKey); + + if (session) { + session.inputs.push({ + data: data.data, + index: data.index, + }); + console.log(`📊 E3 ${e3Id} now has ${session.inputs.length} inputs`); + } else { + console.warn(`⚠️ Received input for unknown E3 session: ${e3Id}`); + } + }); + + console.log("✅ Event listeners set up successfully"); +} + function isValidHexString(value: string): value is `0x${string}` { return value.startsWith("0x") && /^0x[a-fA-F0-9]*$/.test(value); } @@ -65,48 +216,75 @@ function isSupportedChain(value: any): value is keyof typeof EnclaveSDK.chains { return value in EnclaveSDK.chains; } -// This should check if we are missing env vars and throw if any are missing. -getCheckedEnvVars(); - const app = express(); - app.use(express.json()); -app.post("/", (req: Request, res: Response) => { - handleRpc(req.body, { - // This is called before a computation is attempted. You can use it to prevent unecessary computation. - shouldCompute(e3Params: string, ciphertextInputs: Array<[string, number]>) { - console.log( - `shouldCompute(e3Id:${e3Params},ciphertextInputs.length:${ciphertextInputs.length})`, - ); - return ciphertextInputs.length > 1; - }, +app.post("/", async (req: Request, res: Response) => { + try { + console.log("📨 Webhook received:", req.body); - // This is called after computation has occurred - async processOutput(e3Id: number, proof: string, ciphertext: string) { - console.log( - `processOutput(e3Id:${e3Id},proof:${proof},ciphertext:${ciphertext})`, - ); - if (!isValidHexString(ciphertext) || !isValidHexString(proof)) { - throw new Error("Input is not valid"); - } - const sdk = await createPrivateSDK(); + const { e3_id, ciphertext, proof } = req.body; - await sdk.publishCiphertextOutput(BigInt(e3Id), ciphertext, proof); + if (!e3_id || !ciphertext || !proof) { + res + .status(400) + .json({ error: "Missing required fields: e3_id, ciphertext, proof" }); + return; + } - return 0; - }, + if (!isValidHexString(ciphertext) || !isValidHexString(proof)) { + res + .status(400) + .json({ error: "ciphertext and proof must be valid hex strings" }); + return; + } - // This informs the caller of what methods are available on this server - capabilities() { - return [ - "shouldCompute", // optional - "processOutput", // mandatory - ]; - }, - }).then((result) => res.json(result)); + console.log(`🔄 Publishing output for E3 ${e3_id}...`); + + const sdk = await createPrivateSDK(); + await sdk.publishCiphertextOutput(BigInt(e3_id), ciphertext, proof); + + // Mark session as completed + const sessionKey = e3_id.toString(); + const session = e3Sessions.get(sessionKey); + if (session) { + session.isCompleted = true; + session.isProcessing = false; + console.log(`✅ Successfully completed E3 ${e3_id}`); + } + + res.json({ status: "success", e3_id }); + } catch (error) { + console.error("❌ Webhook processing failed:", error); + res.status(500).json({ error: "Internal server error" }); + } }); -const PORT = 8080; -app.listen(PORT, () => { - console.log(`Server is listening on ${8080}`); + +app.get("/sessions", (req: Request, res: Response) => { + const sessions = Array.from(e3Sessions.entries()).map(([key, session]) => ({ + e3Id: key, + expiration: session.expiration.toString(), + inputCount: session.inputs.length, + isProcessing: session.isProcessing, + isCompleted: session.isCompleted, + })); + res.json(sessions); }); + +async function startServer() { + try { + await setupEventListeners(); + + const PORT = process.env.PORT ? parseInt(process.env.PORT) : 8080; + app.listen(PORT, () => { + console.log(`🚀 Enclave Server listening on port ${PORT}`); + console.log(`📡 Event listeners active`); + console.log(`📊 Sessions: http://localhost:${PORT}/sessions`); + }); + } catch (error) { + console.error("❌ Failed to start server:", error); + process.exit(1); + } +} + +startServer().catch(console.error); From bc9fb2cd438ce0989ed9dab0b62cf1f0f5c91c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 09:06:34 +0000 Subject: [PATCH 055/106] Fix ! bug (#494) --- templates/default/client/src/pages/WizardSDK.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/templates/default/client/src/pages/WizardSDK.tsx b/templates/default/client/src/pages/WizardSDK.tsx index 0ae60e64c7..f70340233a 100644 --- a/templates/default/client/src/pages/WizardSDK.tsx +++ b/templates/default/client/src/pages/WizardSDK.tsx @@ -198,7 +198,7 @@ const RequestComputationStep: React.FC = ({
)} - {error && {}} />} + {error && { }} />} {isSuccess && transactionHash && (
@@ -267,7 +267,7 @@ const ActivateE3Step: React.FC = ({ e3State, isRequesting,
)} - {error && {}} />} + {error && { }} />} {isSuccess && transactionHash && (
@@ -733,7 +733,7 @@ const WizardSDK: React.FC = () => { } const handleActivateE3 = async () => { - if (!e3State.id || !e3State.publicKey) return + if (e3State.id === null || e3State.publicKey === null) return setIsRequesting(true) setRequestError(null) @@ -752,7 +752,7 @@ const WizardSDK: React.FC = () => { const handleInputSubmit = async (e: React.FormEvent) => { e.preventDefault() - if (!input1 || !input2 || !e3State.publicKey || !e3State.id) return + if (!input1 || !input2 || e3State.publicKey === null || e3State.id === null) return setCurrentStep(WizardStep.ENCRYPT_SUBMIT) setInputPublishError(null) @@ -844,9 +844,8 @@ const WizardSDK: React.FC = () => { {[1, 2, 3, 4, 5, 6].map((step) => (
= step ? 'border-enclave-400 bg-enclave-100 text-enclave-600' : 'border-slate-300 bg-slate-100 text-slate-400' - }`} + className={`flex h-10 w-10 items-center justify-center rounded-full border-2 transition-all duration-200 ${currentStep >= step ? 'border-enclave-400 bg-enclave-100 text-enclave-600' : 'border-slate-300 bg-slate-100 text-slate-400' + }`} > {getStepIcon(step as WizardStep)}
From f191bfd0961b2879fdfbbad8f97d9efa46118bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 10:48:38 +0000 Subject: [PATCH 056/106] Update release script (#495) * bump * Update release script to publish package --- .github/workflows/publish-evm.yml | 4 ++++ packages/enclave-react/package.json | 6 +++++- packages/evm/package.json | 5 +++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-evm.yml b/.github/workflows/publish-evm.yml index 0c14b78188..214aaa4632 100644 --- a/.github/workflows/publish-evm.yml +++ b/.github/workflows/publish-evm.yml @@ -23,3 +23,7 @@ jobs: env: NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} YARN_REGISTRY: https://registry.npmjs.org/ + - run: pnpm react:release + env: + NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} + YARN_REGISTRY: https://registry.npmjs.org/ diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index ec2a48127c..bc24d119bb 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.17", + "version": "0.0.5-test.18", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", @@ -34,6 +34,10 @@ "wagmi": "^2.14.16", "viem": "^2.30.6" }, + "publishConfig": { + "access": "public", + "git-checks": false + }, "dependencies": { "@gnosis-guild/enclave": "workspace:*" }, diff --git a/packages/evm/package.json b/packages/evm/package.json index dcfc37bc9d..825ca99d6b 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.17", + "version": "0.0.5-test.18", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", @@ -84,7 +84,8 @@ "typechain" ], "publishConfig": { - "access": "public" + "access": "public", + "git-checks": false }, "scripts": { "clean": "rimraf ./artifacts ./cache ./coverage ./types ./coverage.json && pnpm typechain", From de230522445e2c5bb718a05f34720aa5f87e649d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 11:06:10 +0000 Subject: [PATCH 057/106] Update release script (#496) * Add env var * Add env var and bump --- .github/workflows/publish-evm.yml | 2 ++ packages/enclave-react/package.json | 2 +- packages/evm/package.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-evm.yml b/.github/workflows/publish-evm.yml index 214aaa4632..51d51099c2 100644 --- a/.github/workflows/publish-evm.yml +++ b/.github/workflows/publish-evm.yml @@ -23,7 +23,9 @@ jobs: env: NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} YARN_REGISTRY: https://registry.npmjs.org/ + NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet - run: pnpm react:release env: NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} YARN_REGISTRY: https://registry.npmjs.org/ + NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index bc24d119bb..e53074c93c 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.18", + "version": "0.0.5-test.19", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/evm/package.json b/packages/evm/package.json index 825ca99d6b..3e165fc9fb 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.18", + "version": "0.0.5-test.19", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", From ea5be9ade62743b7843b98620aa16b989b66c242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 12:27:36 +0000 Subject: [PATCH 058/106] Serialization fix (#497) * Update support scripts * Update tmux session * Add logging * Update test --- crates/support/.dockerignore | 1 + crates/support/Cargo.lock | 12 +++ crates/support/Cargo.toml | 3 +- crates/support/app/Cargo.toml | 2 + crates/support/app/src/main.rs | 25 +----- crates/support/types/Cargo.toml | 10 +++ crates/support/types/src/lib.rs | 114 ++++++++++++++++++++++++++ templates/default/scripts/tmux_all.sh | 29 +++---- templates/default/server/index.ts | 2 + 9 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 crates/support/types/Cargo.toml create mode 100644 crates/support/types/src/lib.rs diff --git a/crates/support/.dockerignore b/crates/support/.dockerignore index 49c9c69517..c521e78a32 100644 --- a/crates/support/.dockerignore +++ b/crates/support/.dockerignore @@ -1,2 +1,3 @@ +/target /contracts /tests diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index e896d9cb16..8e62784cc1 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -2410,7 +2410,9 @@ dependencies = [ "anyhow", "e3-compute-provider", "e3-support-host", + "e3-support-types", "env_logger", + "hex", "reqwest", "serde", "serde_json", @@ -2441,6 +2443,16 @@ dependencies = [ "tracing-subscriber 0.3.19", ] +[[package]] +name = "e3-support-types" +version = "0.1.0" +dependencies = [ + "anyhow", + "hex", + "serde", + "serde_json", +] + [[package]] name = "e3-user-program" version = "0.1.0" diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 92948586c2..d469c38af6 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["app", "host", "methods"] +members = ["app", "host", "methods", "types"] exclude = ["methods/guest"] [workspace.package] @@ -11,6 +11,7 @@ edition = "2021" e3-support-app = { path = "./app" } e3-support-host = { path = "./host" } e3-user-program = { path = "./program" } +e3-support-types = { path = "./types" } methods = { path = "./methods" } alloy-primitives = { version = "0.8", default-features = false, features = [ "rlp", diff --git a/crates/support/app/Cargo.toml b/crates/support/app/Cargo.toml index 5ce2726634..0ad1a998d4 100644 --- a/crates/support/app/Cargo.toml +++ b/crates/support/app/Cargo.toml @@ -11,5 +11,7 @@ serde_json.workspace = true tokio.workspace = true e3-compute-provider.workspace = true e3-support-host.workspace = true +e3-support-types.workspace = true reqwest.workspace = true anyhow.workspace = true +hex.workspace = true diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index d1d0f4b2c3..632dd501fb 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,27 +1,8 @@ use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; use anyhow::bail; use e3_compute_provider::FHEInputs; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug)] -pub struct ComputeRequest { - pub params: Vec, - pub ciphertext_inputs: Vec<(Vec, u64)>, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct ComputeResponse { - pub ciphertext: Vec, - pub proof: Vec, -} - -#[derive(Debug, Deserialize)] -struct ComputeRequestPayload { - pub e3_id: Option, - pub params: Vec, - pub ciphertext_inputs: Vec<(Vec, u64)>, - pub callback_url: Option, -} +use e3_support_types::{ComputeRequest, ComputeResponse}; +use serde::{Deserialize, Deserializer, Serialize}; #[derive(Serialize, Debug)] struct WebhookPayload { @@ -60,7 +41,7 @@ async fn call_webhook( Ok(()) } -async fn handle_compute(req: web::Json) -> ActixResult { +async fn handle_compute(req: web::Json) -> ActixResult { // TODO: process this in a spawn so that we return early and allow webhook instead of // processing sequentially println!("Processing computation..."); diff --git a/crates/support/types/Cargo.toml b/crates/support/types/Cargo.toml new file mode 100644 index 0000000000..4389bfb609 --- /dev/null +++ b/crates/support/types/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "e3-support-types" +version.workspace = true +edition.workspace = true + +[dependencies] +serde.workspace = true +serde_json.workspace = true +anyhow.workspace = true +hex.workspace = true diff --git a/crates/support/types/src/lib.rs b/crates/support/types/src/lib.rs new file mode 100644 index 0000000000..66bead96be --- /dev/null +++ b/crates/support/types/src/lib.rs @@ -0,0 +1,114 @@ +use anyhow::Result; +use serde::{Deserialize, Deserializer, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct ComputeResponse { + pub ciphertext: Vec, + pub proof: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct ComputeRequest { + pub e3_id: Option, + #[serde(deserialize_with = "deserialize_hex_string")] + pub params: Vec, + #[serde(deserialize_with = "deserialize_hex_tuple")] + pub ciphertext_inputs: Vec<(Vec, u64)>, + pub callback_url: Option, +} + +pub fn deserialize_hex_string<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s: String = Deserialize::deserialize(deserializer)?; + let hex_str = s.strip_prefix("0x").unwrap_or(&s); + hex::decode(hex_str).map_err(serde::de::Error::custom) +} + +pub fn deserialize_hex_tuple<'de, D>(deserializer: D) -> Result, u64)>, D::Error> +where + D: Deserializer<'de>, +{ + let tuples: Vec<(String, u64)> = Deserialize::deserialize(deserializer)?; + tuples + .into_iter() + .map(|(hex_str, num)| { + let stripped = hex_str.strip_prefix("0x").unwrap_or(&hex_str); + hex::decode(stripped) + .map(|bytes| (bytes, num)) + .map_err(serde::de::Error::custom) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use crate::ComputeRequest; + + #[test] + fn test_deserialize_compute_request() { + let json = r#" + { + "e3_id": 12345, + "params": "0x12345ffa", + "ciphertext_inputs": [ + ["0xffabc123", 100], + ["0xaa6de432", 200] + ], + "callback_url": "https://example.com/callback" + } + "#; + + let payload: ComputeRequest = serde_json::from_str(json).unwrap(); + + assert_eq!(payload.e3_id, Some(12345)); + assert_eq!(payload.params, hex::decode("12345ffa").unwrap()); + assert_eq!(payload.ciphertext_inputs.len(), 2); + assert_eq!( + payload.ciphertext_inputs[0], + (hex::decode("ffabc123").unwrap(), 100) + ); + assert_eq!( + payload.ciphertext_inputs[1], + (hex::decode("aa6de432").unwrap(), 200) + ); + assert_eq!( + payload.callback_url, + Some("https://example.com/callback".to_string()) + ); + } + + #[test] + fn test_deserialize_compute_request_no_prefix() { + let json = r#" + { + "e3_id": 12345, + "params": "12345ffa", + "ciphertext_inputs": [ + ["ffabc123", 100], + ["aa6de432", 200] + ], + "callback_url": "https://example.com/callback" + } + "#; + + let payload: ComputeRequest = serde_json::from_str(json).unwrap(); + + assert_eq!(payload.e3_id, Some(12345)); + assert_eq!(payload.params, hex::decode("12345ffa").unwrap()); + assert_eq!(payload.ciphertext_inputs.len(), 2); + assert_eq!( + payload.ciphertext_inputs[0], + (hex::decode("ffabc123").unwrap(), 100) + ); + assert_eq!( + payload.ciphertext_inputs[1], + (hex::decode("aa6de432").unwrap(), 200) + ); + assert_eq!( + payload.callback_url, + Some("https://example.com/callback".to_string()) + ); + } +} diff --git a/templates/default/scripts/tmux_all.sh b/templates/default/scripts/tmux_all.sh index 48cba2cc63..47e77e379a 100755 --- a/templates/default/scripts/tmux_all.sh +++ b/templates/default/scripts/tmux_all.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash - # Check if tmux is installed if ! command -v tmux &> /dev/null; then echo "ERROR: tmux is not installed or not in PATH" @@ -13,16 +12,16 @@ fi # Create a new tmux session with 6 splits (2 rows of 3) and run specific commands SESSION_NAME="enclave-splits" -# Check if we're already inside a tmux session -if [ -n "$TMUX" ]; then - echo "Already inside a tmux session. Creating splits in current session..." - # We're inside tmux, so just create the splits in the current session -else - echo "Not in tmux. Creating new session '$SESSION_NAME'..." - # Create new session - tmux new-session -d -s "$SESSION_NAME" +# Kill existing session if it exists +if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then + echo "Killing existing session '$SESSION_NAME'..." + tmux kill-session -t "$SESSION_NAME" fi +echo "Creating new session '$SESSION_NAME'..." +# Create new session +tmux new-session -d -s "$SESSION_NAME" + # Split into 3 vertical panes (top row) tmux split-window -h tmux split-window -h @@ -45,24 +44,16 @@ tmux select-layout tiled # Run commands in each pane tmux send-keys -t 1 'pnpm dev:evm' C-m sleep 1 - tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m sleep 1 - tmux send-keys -t 3 'pnpm dev:server' C-m sleep 1 - tmux send-keys -t 4 'enclave program start' C-m sleep 1 - tmux send-keys -t 5 'pnpm dev:frontend' C-m # Select the first pane to start tmux select-pane -t 1 -# Attach to the session only if we weren't already in tmux -if [ -z "$TMUX" ]; then - tmux attach-session -t "$SESSION_NAME" -else - echo "6-split layout created in current session with commands running!" -fi +# Attach to the session +tmux attach-session -t "$SESSION_NAME" diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index bfd0ac1f93..325175be26 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -79,6 +79,8 @@ async function callFheRunner( ciphertext_inputs: ciphertextInputs, callback_url: CALLBACK_URL, }; + console.log("payload:"); + console.log(JSON.stringify(payload)); const response = await fetch(`${PROGRAM_RUNNER_URL}/run_compute`, { method: "POST", From ff8559567014c95e2ce9f388b76c9438d168add5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 12:47:45 +0000 Subject: [PATCH 059/106] bump (#498) --- packages/enclave-react/package.json | 2 +- packages/evm/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index e53074c93c..92e81cab7c 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.19", + "version": "0.0.5-test.20", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/evm/package.json b/packages/evm/package.json index 3e165fc9fb..9e44947bc5 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.19", + "version": "0.0.5-test.20", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", From f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 13:09:06 +0000 Subject: [PATCH 060/106] Update publish-evm.yml (#499) * Update publish-evm.yml * Update publish-evm.yml --- .github/workflows/publish-evm.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish-evm.yml b/.github/workflows/publish-evm.yml index 51d51099c2..ad1010ac79 100644 --- a/.github/workflows/publish-evm.yml +++ b/.github/workflows/publish-evm.yml @@ -2,12 +2,10 @@ name: EVM Version release on: release: types: [created] - env: MNEMONIC: "test test test test test test test test test test test junk" INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" ETHERSCAN_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" - jobs: publish-npm: runs-on: ubuntu-latest @@ -16,16 +14,15 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 20 + registry-url: 'https://registry.npmjs.org/' - name: pnpm-setup uses: pnpm/action-setup@v4 - run: pnpm install - run: pnpm evm:release env: - NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - YARN_REGISTRY: https://registry.npmjs.org/ + NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet - run: pnpm react:release env: - NPM_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - YARN_REGISTRY: https://registry.npmjs.org/ + NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet From a8b943053cd44b5ee375e286e536a3d69184fc7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 15:16:25 +0000 Subject: [PATCH 061/106] Serialization failure (#501) * Attempt to debug serialization failure * Attempt to pin to a rev --- Cargo.lock | 2 ++ crates/bfv-helpers/Cargo.toml | 3 +++ crates/bfv-helpers/src/lib.rs | 26 ++++++++++++++++++++++++ crates/support/Cargo.toml | 2 +- crates/support/app/src/main.rs | 2 +- crates/support/host/Cargo.toml | 2 +- crates/support/methods/guest/Cargo.toml | 2 +- crates/support/program/Cargo.toml | 4 ++-- crates/support/types/src/lib.rs | 9 ++++++++ templates/default/client/wasm/Cargo.toml | 2 +- templates/default/program/Cargo.toml | 4 ++-- 11 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e264e4b10..6c0d21f08f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2343,8 +2343,10 @@ name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ "alloy", + "anyhow", "fhe", "fhe-traits", + "hex", ] [[package]] diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index 54d2ee900f..78599a620d 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -11,3 +11,6 @@ alloy = { version = "0.8.3" , features = ["dyn-abi", "rlp", "serde"] } fhe-traits.workspace = true fhe_rs.workspace = true +[dev-dependencies] +hex.workspace = true +anyhow.workspace = true diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index 5228f6351b..908d67ee9e 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -206,6 +206,7 @@ pub fn decode_bfv_params_arc(bytes: &[u8]) -> Arc { #[cfg(test)] mod tests { use super::*; + use anyhow::Result; #[test] fn test_build_bfv_params() { @@ -283,6 +284,7 @@ mod tests { let _ = decode_bfv_params(&invalid_bytes); } + #[cfg(test)] mod params_tests { use super::*; @@ -339,5 +341,29 @@ mod tests { assert_eq!(decoded.plaintext(), plaintext_modulus); assert_eq!(decoded.moduli(), moduli); } + + #[test] + fn test_real_bfv_params() -> Result<()> { + let decoded = decode_bfv_params_arc(&hex::decode("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001")?); + Ok(()) + } + + #[test] + fn test_real_bfv_params_2() -> Result<()> { + let bytes = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 255, 255, 255, 0, + 0, 1, + ]; + + let params = decode_bfv_params_arc(&bytes); + assert_eq!(params.plaintext(), 1032193); + Ok(()) + } } } diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index d469c38af6..cce2a5cbab 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -37,7 +37,7 @@ serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", branch = "hacknet" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index 632dd501fb..dce93b2740 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -49,7 +49,7 @@ async fn handle_compute(req: web::Json) -> ActixResult Date: Wed, 11 Jun 2025 20:35:16 +0000 Subject: [PATCH 062/106] Update dockerfile and cargo lock (#502) --- .github/workflows/support-docker.yml | 55 ++++++++++++++++++++++++++++ crates/support/Cargo.lock | 4 +- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/support-docker.yml diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml new file mode 100644 index 0000000000..5e086a8463 --- /dev/null +++ b/.github/workflows/support-docker.yml @@ -0,0 +1,55 @@ +name: Build Support Dockerfile +on: + workflow_dispatch: + pull_request: + branches: + - main + - hacknet + paths: + - "crates/support/**" +env: + DOCKERFILE_PATH: crates/support/Dockerfile + IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/e3-support +permissions: + contents: read + packages: write +jobs: + build: + name: Build & Push Image + runs-on: ubuntu-latest + outputs: + image_tag: ${{ steps.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + - name: Generate version tag + id: version + run: | + echo "version=$(date +'%Y%m%d')-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + - name: Set up BuildKit + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build image + uses: docker/build-push-action@v5 + with: + context: ./crates/support + file: ${{ env.DOCKERFILE_PATH }} + push: true + tags: | + ${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} + ${{ github.ref == 'refs/heads/main' && format('{0}:latest', env.IMAGE_NAME) || '' }} + ${{ github.ref == 'refs/heads/hacknet' && format('{0}:hacknet', env.IMAGE_NAME) || '' }} + cache-from: | + type=gha,scope=cargo-registry + type=gha,scope=cargo-git + type=gha,scope=cargo-target + type=gha,scope=buildcache + cache-to: | + type=gha,mode=max,scope=cargo-registry + type=gha,mode=max,scope=cargo-git + type=gha,mode=max,scope=cargo-target + type=gha,mode=max,scope=buildcache diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index 8e62784cc1..10c71ef180 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -2378,7 +2378,7 @@ dependencies = [ [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "alloy 0.8.3", "fhe", @@ -2388,7 +2388,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", From 99973d87aefcafbaea41989f57586f9479ca06be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 22:13:48 +0000 Subject: [PATCH 063/106] Pass Bonsai Credentials to Risc0 (#503) * pass bonsai api to risc0 * Add risc0 bonsai credentials to config * Add to config --- Cargo.lock | 1 + crates/cli/src/program.rs | 4 +- crates/config/src/app_config.rs | 50 +++++++++++++++++++++++ crates/support-scripts/Cargo.toml | 1 + crates/support-scripts/ctl/start | 17 +++++++- crates/support-scripts/src/lib.rs | 25 ++++++++++-- crates/support/scripts/container/start.sh | 13 ++++++ 7 files changed, 105 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c0d21f08f..19f6b9c997 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2681,6 +2681,7 @@ version = "0.1.0" dependencies = [ "anyhow", "duct", + "e3-config", "tokio", ] diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index f820cb2551..d272a8f6be 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -11,9 +11,9 @@ pub enum ProgramCommands { Compile, } -pub async fn execute(command: ProgramCommands, _config: &AppConfig) -> Result<()> { +pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { match command { - ProgramCommands::Start => e3_support_scripts::program_start().await?, + ProgramCommands::Start => e3_support_scripts::program_start(config.program()).await?, ProgramCommands::Compile => e3_support_scripts::program_compile().await?, }; diff --git a/crates/config/src/app_config.rs b/crates/config/src/app_config.rs index 60c5e93c80..de36e4ed38 100644 --- a/crates/config/src/app_config.rs +++ b/crates/config/src/app_config.rs @@ -84,6 +84,34 @@ impl Default for NodeDefinition { } } +#[derive(Debug, Deserialize, Serialize, PartialEq)] +#[serde(untagged)] +pub enum Risc0Config { + Bonsai { + bonsai_api_key: String, + bonsai_api_url: String, + }, + DevMode, +} + +impl Default for Risc0Config { + fn default() -> Self { + Risc0Config::DevMode + } +} + +/// Configuration for the program runner +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct ProgramConfig { + risc0: Risc0Config, +} + +impl ProgramConfig { + pub fn risc0(&self) -> &Risc0Config { + &self.risc0 + } +} + /// The config actually used throughout the app #[derive(Debug, Deserialize, Serialize)] pub struct AppConfig { @@ -105,6 +133,8 @@ pub struct AppConfig { autopassword: bool, /// If a wallet has not been set autogenerate one on start autowallet: bool, + /// Program config + program: ProgramConfig, } impl AppConfig { @@ -160,6 +190,7 @@ impl AppConfig { autopassword: node.autopassword, autowallet: node.autowallet, autonetkey: node.autonetkey, + program: config.program.unwrap_or_default(), }) } @@ -275,6 +306,10 @@ impl AppConfig { pub fn autopassword(&self) -> bool { self.autopassword } + + pub fn program(&self) -> &ProgramConfig { + &self.program + } } #[derive(Debug, Deserialize, Serialize)] @@ -296,6 +331,8 @@ pub struct UnscopedAppConfig { nodes: HashMap, /// Set the Open Telemetry collector grpc endpoint. Eg. 127.0.0.1:4317 otel: Option, + /// Program config + program: Option, } impl Default for UnscopedAppConfig { @@ -308,6 +345,7 @@ impl Default for UnscopedAppConfig { found_config_file: None, otel: None, nodes: HashMap::new(), + program: None, } } } @@ -441,6 +479,11 @@ node: db_file: "./foo" quic_port: 1234 +program: + risc0: + bonsai_api_key: "12345678" + bonsai_api_url: "http://my.api.com" + nodes: ag: quic_port: 1235 @@ -473,6 +516,13 @@ nodes: PathBuf::from("/myconfig/override/_default/key") ); assert_eq!(config.quic_port(), 1234); + assert_eq!( + config.program().risc0(), + &Risc0Config::Bonsai { + bonsai_api_key: "12345678".to_string(), + bonsai_api_url: "http://my.api.com".to_string() + } + ); assert!(config.peers().is_empty()); }; { diff --git a/crates/support-scripts/Cargo.toml b/crates/support-scripts/Cargo.toml index f1bba03b34..97e7d4672a 100644 --- a/crates/support-scripts/Cargo.toml +++ b/crates/support-scripts/Cargo.toml @@ -10,3 +10,4 @@ repository.workspace = true anyhow.workspace = true tokio.workspace = true duct.workspace = true +e3-config.workspace = true diff --git a/crates/support-scripts/ctl/start b/crates/support-scripts/ctl/start index c85d427035..95ffdb6926 100755 --- a/crates/support-scripts/ctl/start +++ b/crates/support-scripts/ctl/start @@ -1,4 +1,19 @@ #!/usr/bin/env bash +while [[ $# -gt 0 ]]; do + [[ $1 == --api-key ]] && API_KEY="$2" && shift 2 && continue + [[ $1 == --api-url ]] && API_URL="$2" && shift 2 && continue + shift +done + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/container" ./scripts/container/start.sh + +if [[ -n "$API_KEY" && -n "$API_URL" ]]; then + # BONSAI MODE + "$SCRIPT_DIR/container" ./scripts/container/start.sh --api-key "$API_KEY" --api-url "$API_URL" +elif [[ -z "$API_KEY" && -z "$API_URL" ]]; then + # DEV MODE + "$SCRIPT_DIR/container" ./scripts/container/start.sh +else + exit 1 +fi diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 7c2ca0cef4..27937ab068 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -1,16 +1,20 @@ use anyhow::{bail, Result}; use duct::cmd; +use e3_config::ProgramConfig; +use e3_config::Risc0Config; use std::{env, path::PathBuf}; use tokio::fs; use tokio::signal; async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { - println!("run_bash_script: {:?} {:?} {:?}", cwd, script, args); + println!("run_bash_script: {:?} {:?} {:?}", cwd, script, args); // Delete this later as this exposes + // credential information // Build the command using cmd! macro for cleaner syntax let mut cmd_args = vec!["bash".to_string(), script.to_string_lossy().to_string()]; cmd_args.extend(args.iter().map(|s| s.to_string())); + // Note this will not end up on shell history let expression = cmd("bash", &cmd_args[1..]).dir(cwd); let handle = expression.start()?; @@ -50,10 +54,25 @@ pub async fn program_compile() -> Result<()> { Ok(()) } -pub async fn program_start() -> Result<()> { +pub async fn program_start(program_config: &ProgramConfig) -> Result<()> { let cwd = env::current_dir()?; let script = cwd.join(".enclave/support/ctl/start"); ensure_script_exists(&script).await?; - run_bash_script(&cwd, &script, &[]).await?; + + let args: Vec<&str> = match program_config.risc0() { + Risc0Config::Bonsai { + bonsai_api_key, + bonsai_api_url, + } => { + vec![ + "--api-key", + bonsai_api_key.as_str(), + "--api-url", + bonsai_api_url.as_str(), + ] + } + Risc0Config::DevMode => vec![], + }; + run_bash_script(&cwd, &script, &args).await?; Ok(()) } diff --git a/crates/support/scripts/container/start.sh b/crates/support/scripts/container/start.sh index a755f9e60c..e27aadefa1 100755 --- a/crates/support/scripts/container/start.sh +++ b/crates/support/scripts/container/start.sh @@ -1,3 +1,16 @@ #!/usr/bin/env bash +while [[ $# -gt 0 ]]; do + if [[ $1 == --api-key ]]; then + export BONSAI_API_KEY="$2" + shift 2 + elif [[ $1 == --api-url ]]; then + export BONSAI_API_URL="$2" + shift 2 + else + break + fi +done + +[[ -z "$BONSAI_API_KEY" ]] && export RISC0_DEV_MODE=1 exec cargo run --bin e3-support-app "$@" From 4ec479d48121da2c2654d1cbfc801456e3f7656b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 11 Jun 2025 22:44:49 +0000 Subject: [PATCH 064/106] Args in support scripts (#504) * Update script * Update inner script --- crates/support-scripts/ctl/start | 26 ++++++++++++++---- crates/support/scripts/container/start.sh | 32 +++++++++++++++-------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/crates/support-scripts/ctl/start b/crates/support-scripts/ctl/start index 95ffdb6926..ac0d067a8e 100755 --- a/crates/support-scripts/ctl/start +++ b/crates/support-scripts/ctl/start @@ -1,19 +1,35 @@ #!/usr/bin/env bash +# Clear any existing environment variables +unset API_KEY API_URL + +# Parse command line arguments while [[ $# -gt 0 ]]; do - [[ $1 == --api-key ]] && API_KEY="$2" && shift 2 && continue - [[ $1 == --api-url ]] && API_URL="$2" && shift 2 && continue - shift + case $1 in + --api-key) + API_KEY="$2" + shift 2 + ;; + --api-url) + API_URL="$2" + shift 2 + ;; + *) + echo "Unknown argument: $1" + exit 1 + ;; + esac done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [[ -n "$API_KEY" && -n "$API_URL" ]]; then # BONSAI MODE - "$SCRIPT_DIR/container" ./scripts/container/start.sh --api-key "$API_KEY" --api-url "$API_URL" + exec "$SCRIPT_DIR/container" ./scripts/container/start.sh --api-key "$API_KEY" --api-url "$API_URL" elif [[ -z "$API_KEY" && -z "$API_URL" ]]; then # DEV MODE - "$SCRIPT_DIR/container" ./scripts/container/start.sh + exec "$SCRIPT_DIR/container" ./scripts/container/start.sh else + echo "Error: Both --api-key and --api-url must be provided together, or neither" exit 1 fi diff --git a/crates/support/scripts/container/start.sh b/crates/support/scripts/container/start.sh index e27aadefa1..e21772ca7c 100755 --- a/crates/support/scripts/container/start.sh +++ b/crates/support/scripts/container/start.sh @@ -1,16 +1,26 @@ #!/usr/bin/env bash + +# Clear any existing environment variables +unset BONSAI_API_KEY BONSAI_API_URL + +# Parse command line arguments while [[ $# -gt 0 ]]; do - if [[ $1 == --api-key ]]; then - export BONSAI_API_KEY="$2" - shift 2 - elif [[ $1 == --api-url ]]; then - export BONSAI_API_URL="$2" - shift 2 - else - break - fi + case $1 in + --api-key) + export BONSAI_API_KEY="$2" + export RISC0_DEV_MODE=1 + shift 2 + ;; + --api-url) + export BONSAI_API_URL="$2" + unset RISC0_DEV_MODE + shift 2 + ;; + *) + echo "Unknown argument: $1" + exit 1 + ;; + esac done -[[ -z "$BONSAI_API_KEY" ]] && export RISC0_DEV_MODE=1 - exec cargo run --bin e3-support-app "$@" From 28605dfa0f251f725af9a4254d0d9a163a9b92ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 12 Jun 2025 00:08:58 +0000 Subject: [PATCH 065/106] Add logging and fix dev mode (#505) --- crates/support/scripts/container/start.sh | 8 ++++-- .../default/client/src/pages/WizardSDK.tsx | 26 ++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/crates/support/scripts/container/start.sh b/crates/support/scripts/container/start.sh index e21772ca7c..138d58b0ae 100755 --- a/crates/support/scripts/container/start.sh +++ b/crates/support/scripts/container/start.sh @@ -8,12 +8,10 @@ while [[ $# -gt 0 ]]; do case $1 in --api-key) export BONSAI_API_KEY="$2" - export RISC0_DEV_MODE=1 shift 2 ;; --api-url) export BONSAI_API_URL="$2" - unset RISC0_DEV_MODE shift 2 ;; *) @@ -23,4 +21,10 @@ while [[ $# -gt 0 ]]; do esac done +CARGO_INCREMENTAL=1 + +[ -z "$BONSAI_API_KEY" ] && export RISC0_DEV_MODE=1 + +echo "RISC0_DEV_MODE=$RISC0_DEV_MODE" + exec cargo run --bin e3-support-app "$@" diff --git a/templates/default/client/src/pages/WizardSDK.tsx b/templates/default/client/src/pages/WizardSDK.tsx index f70340233a..0215417141 100644 --- a/templates/default/client/src/pages/WizardSDK.tsx +++ b/templates/default/client/src/pages/WizardSDK.tsx @@ -598,7 +598,11 @@ const WizardSDK: React.FC = () => { // Set up event listeners useEffect(() => { - if (!isInitialized) return + console.log('running use effect') + if (!isInitialized) { + console.log('refusing to run because sdk is not initialized!') + return + } const handleE3Requested = (event: any) => { const e3Id = event.data.e3Id @@ -658,6 +662,7 @@ const WizardSDK: React.FC = () => { } // Set up event listeners + console.log('Setting up listeners...') onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested) onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3Activated) @@ -665,13 +670,14 @@ const WizardSDK: React.FC = () => { // Cleanup return () => { + console.log('Cleaning up listeners...') off(EnclaveEventType.E3_REQUESTED, handleE3Requested) off(RegistryEventType.COMMITTEE_PUBLISHED, handleCommitteePublished) off(EnclaveEventType.E3_ACTIVATED, handleE3Activated) off(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, handlePlaintextOutput) } }, [isInitialized, onEnclaveEvent, off, EnclaveEventType, RegistryEventType]) - console.log({ currentStep }) + // Auto-advance steps based on state useEffect(() => { if (!isConnected && currentStep > WizardStep.CONNECT_WALLET) { @@ -688,6 +694,7 @@ const WizardSDK: React.FC = () => { }, [isConnected, isInitialized, currentStep, e3State]) const handleRequestComputation = async () => { + console.log('handleRequestComputation') setIsRequesting(true) setRequestError(null) setRequestSuccess(false) @@ -711,6 +718,7 @@ const WizardSDK: React.FC = () => { const e3ProgramParams = encodeBfvParams() const computeProviderParams = encodeComputeProviderParams(DEFAULT_COMPUTE_PROVIDER_PARAMS) + console.log('requestE3') const hash = await requestE3({ filter: contracts.filterRegistry, threshold, @@ -733,8 +741,12 @@ const WizardSDK: React.FC = () => { } const handleActivateE3 = async () => { - if (e3State.id === null || e3State.publicKey === null) return + console.log('handleActivateE3') + if (e3State.id === null || e3State.publicKey === null) { + console.log('refusing to run handler because id or publicKey is null') + return + } setIsRequesting(true) setRequestError(null) @@ -752,7 +764,11 @@ const WizardSDK: React.FC = () => { const handleInputSubmit = async (e: React.FormEvent) => { e.preventDefault() - if (!input1 || !input2 || e3State.publicKey === null || e3State.id === null) return + console.log('handleInputSubmit') + if (!input1 || !input2 || e3State.publicKey === null || e3State.id === null) { + console.log('Refusing to submit input because input is empty or publickey is null or is is null') + return + } setCurrentStep(WizardStep.ENCRYPT_SUBMIT) setInputPublishError(null) @@ -792,6 +808,7 @@ const WizardSDK: React.FC = () => { } const handleReset = () => { + console.log('handleReset') setCurrentStep(WizardStep.CONNECT_WALLET) setInput1('') setInput2('') @@ -815,6 +832,7 @@ const WizardSDK: React.FC = () => { } const handleTryAgain = () => { + console.log('HandleTryAgain') setCurrentStep(WizardStep.ENTER_INPUTS) setInputPublishError(null) setInputPublishSuccess(false) From 29aff39e8a18cff9363f6345e0d7103525f5b477 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Thu, 12 Jun 2025 15:32:51 +0200 Subject: [PATCH 066/106] integrate real `greco` proof in `CRISP` (#485) * use greco as crate and update wasm * update wrong param moduli * update greco - still buggy * still getting failed to broadcast * correct verifier * clean code * increase swapfile for nargo compilation before playwright * just make 1G for swapfile * skip circuit compilation * Revert swap and Nargo BB from Dockerfile * Increase E3 Round Duration to let the proof generate * Increase E3 Duration for Proof Generation * decrease test timeout * decrease test timeout * increase total test timeout * increase timeout even more * Add Logs * Testing with 0 retries * Decrease E3 Duration and Increase Timeout * Revert back logs --------- Co-authored-by: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Co-authored-by: Hamza Khalid --- examples/CRISP/Dockerfile | 20 - .../apps/client/libs/noir/crisp_circuit.json | 2 +- .../libs/wasm/pkg/crisp_wasm_crypto.d.ts | 6 +- .../client/libs/wasm/pkg/crisp_wasm_crypto.js | 10 +- .../libs/wasm/pkg/crisp_wasm_crypto_bg.wasm | Bin 639531 -> 672727 bytes .../wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts | 6 +- examples/CRISP/apps/server/.env.example | 2 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 189 ++++- examples/CRISP/apps/wasm-crypto/Cargo.toml | 1 + .../CRISP/apps/wasm-crypto/src/greco/greco.rs | 673 ------------------ .../CRISP/apps/wasm-crypto/src/greco/mod.rs | 2 - .../CRISP/apps/wasm-crypto/src/greco/poly.rs | 359 ---------- examples/CRISP/apps/wasm-crypto/src/lib.rs | 16 +- examples/CRISP/circuits/Nargo.toml | 5 +- examples/CRISP/circuits/src/main.nr | 33 +- examples/CRISP/contracts/CRISPVerifier.sol | 92 +-- examples/CRISP/playwright.config.ts | 2 +- examples/CRISP/scripts/tasks/setup.sh | 5 +- examples/CRISP/test/crisp.spec.ts | 4 +- .../CRISP/test/wallet-setup/basic.setup.ts | 2 +- packages/evm/deploy/enclave.ts | 2 +- packages/evm/test/Enclave.spec.ts | 4 +- packages/evm/test/fixtures/Enclave.fixture.ts | 2 +- 23 files changed, 291 insertions(+), 1146 deletions(-) delete mode 100644 examples/CRISP/apps/wasm-crypto/src/greco/greco.rs delete mode 100644 examples/CRISP/apps/wasm-crypto/src/greco/mod.rs delete mode 100644 examples/CRISP/apps/wasm-crypto/src/greco/poly.rs diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index d402e56c71..c1410740db 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -3,8 +3,6 @@ # ──────────────────────────────────────────────────────────────────────────────── FROM ubuntu:24.04 -ARG NOIR_VERSION=1.0.0-beta.3 -ARG BB_VERSION=0.82.2 ARG RISCZERO_VERSION=2.0.0 ARG CPP_VERSION=2024.1.5 ARG RUST_VERSION=1.85.0 @@ -50,24 +48,6 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ ENV PATH="/home/${USERNAME}/.cargo/bin:${PATH}" RUN rustup component add rustfmt clippy -# ──────────────────────────────────────────────────────────────────────────────── -# Noir / Nargo -# ──────────────────────────────────────────────────────────────────────────────── -ENV NARGO_HOME="/home/${USERNAME}/.nargo" -ENV PATH="${PATH}:${NARGO_HOME}/bin" - -RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash \ - && "$HOME/.nargo/bin/noirup" -v ${NOIR_VERSION} - -# ──────────────────────────────────────────────────────────────────────────────── -# Barretenberg CLI (bbup) -# ──────────────────────────────────────────────────────────────────────────────── -ENV BB_HOME="/home/${USERNAME}/.bb" -ENV PATH="${PATH}:${BB_HOME}" - -RUN curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash \ - && bbup -v ${BB_VERSION} - # ──────────────────────────────────────────────────────────────────────────────── # Foundry # ──────────────────────────────────────────────────────────────────────────────── diff --git a/examples/CRISP/apps/client/libs/noir/crisp_circuit.json b/examples/CRISP/apps/client/libs/noir/crisp_circuit.json index c8b2516db1..d152e555bc 100644 --- a/examples/CRISP/apps/client/libs/noir/crisp_circuit.json +++ b/examples/CRISP/apps/client/libs/noir/crisp_circuit.json @@ -1 +1 @@ -{"noir_version":"1.0.0-beta.3+ceaa1986628197bd1170147f6a07f0f98d21030a","hash":1286082986342997620,"abi":{"parameters":[{"name":"pk0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"pk1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"u","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e0","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e1","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"k1","type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"r1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"r2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"}],"return_type":null,"error_types":{}},"bytecode":"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","debug_symbols":"XYxLCoAwDAXvkrUn8Coi0k9aAqEpsRWk9O5+cCFdzhveNPBoa9woBdlhXhqwOFNI0k2tT2CVmCluw3wYJWMZPww1uZ8tZ8bhn1Uc+qr4lF7X134B","file_map":{},"names":["main"],"brillig_names":[]} \ No newline at end of file +{"noir_version":"1.0.0-beta.3+ceaa1986628197bd1170147f6a07f0f98d21030a","hash":14690302256544076630,"abi":{"parameters":[{"name":"pk0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"pk1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct0is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"ct1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"u","type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e0","type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"e1","type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"k1","type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2048,"type":{"kind":"field"}}}]},"visibility":"private"},{"name":"r1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"r2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p1is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":4095,"type":{"kind":"field"}}}]}},"visibility":"private"},{"name":"p2is","type":{"kind":"array","length":1,"type":{"kind":"struct","path":"greco::math::polynomial::Polynomial","fields":[{"name":"coefficients","type":{"kind":"array","length":2047,"type":{"kind":"field"}}}]}},"visibility":"private"}],"return_type":null,"error_types":{"6485997221020871071":{"error_kind":"string","string":"call to assert_max_bit_size"}}},"bytecode":"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DLMKDD+DhtkMDLMJDL+AhtkNDLMLDL+ChjkMDHMIDL+BhjkNDHMKDL+DhrkMDHMJDH+AhrkNDHMLDH+ChnkMDPMIDH+BhnkNDPMKDH+DhvkMDPMJDP+AhvkNDPMLDP+ChgUMDAsIDP+BhgUNDAsKDP/LxxkWMjAsJDAMABoWNjAsLDAMCBoWMTAsIjAMBBoWNTAsKjAMDBoWMzAsJjAMAhoWNzAsLjAMChqWMDAsITAMBhqWNDAsKTAMDhqWMjAsJTAMARqWNjAsLTAMCRqWMTAsIzAMBRqWNTAsKzAMDRqWMzAsJzAMAxqWNzAsLzAMCxpWMDCsIDAMBxpWNDCsKDAMDxpWMjCsJDCMABpWNjCsLDCMCBpWMTCsIjCMBBpWNTCsKjCMDBpWMzCsJjCMAhpWNzCsLjCMChrWMDCsITCMBhrWNDCsKTCMDhrWMjCsJTCMARrWNjCsLTCMCRrWMTCsIzCMBRrWNTCsKzCMDRrWMzCsJzCMAxrWNzCsLzCMCxo2MDBsIDCMBxo2NDBsKDCMDxo2MjBsJDBMABo2NjBsLDBMCBo2MTBsIjBMBBo2NTBsKjBMDBo2MzBsJjBMAho2NzBsLjBMChq2MDBsITBMBhq2NDBsKTBMDhq2MjBsJTBMARq2NjBsLTBMCRq2MTBsIzBMBRq2NTBsKzBMDRq2MzBsJzBMAxq2NzBsLzBMCxp2MDDsIDBMBxp2NDDsKDBMDxp2MjDsJDDMABp2NjDsLDDMCBp2MTDsIjDMBBp2NTDsKjDMDBp2MzDsJjDMAhp2NzDsLjDMChr2MDDsITDMBhr2NDDsKTDMDhr2MjDsJTDMARr2NjDsLTDMCRr2MTDsIzDMBRr2NTDsKzDMDRr2MzDsJzDMAxr2NzDsLzDMCxoOMDAcIDDMBxoONDAcKDDMDxoOMjAcJDAsABoONjAcLDAsCBoOMTAcIjAsBBoONTAcKjAsDBoOMzAcJjAsAhoONzAcLjAsChqOMDAcITAsBhqONDAcKTAsDhqOMjAcJTAsARqONjAcLTAsCRqOMTAcIzAsBRqONTAcKzAsDRqOMzAcJzAsAxqONzAcLzAsCxpOMDCcIDAsBxpONDCcKDAsDxpOMjCcJDCsABpONjCcLDCsCBpOMTCcIjCsBBpONTCcKjCsDBpOMzCcJjCsAhpONzCcLjCsChrOMDCcITCsBhrONDCcKTCsDhrOMjCcJTCsARrONjCcLTCsCRrOMTCcIzCsBRrONTCcKzCsDRrOMzCcJzCsAxrONzCcLzCsCxouMDBcIDCsBxouNDBcKDCsDxouMjBcJDBsABouNjBcLDBsCBouMTBcIjBsBBouNTBcKjBsDBouMzBcJjBsAhouNzBcLjBsChquMDBcITBsBhquNDBcKTBsDhquMjBcJTBsARquNjBcLTBsCRquMTBcIzBsBRquNTBcKzBsDRquMzBcJzBsAxquNzBcLzBsCxpuMDDcIDBsBxpuNDDcKDBsDxpuMjDcJDDsABpuNjDcLDDsCBpuMTDcIjDsBBpuNTDcKjDsDBpuMzDcJjDsAhpuNzDcLjDsChruMDDcITDsBhruNDDcKTDsDhruMjDcJTDsARruNjDcLTDsCRruMTDcIzDsBRruNTDcKzDsDRruMzDcJzDsAxruNzDcLzDsCxoeMDA8IDDsBxoeNDA8KDDsDxoeMjA8JDAcABoeNjA8LDAcCBoeMTA8IjAcBBoeNTA8KjAcDBoeMzA8JjAcAhoeNzA8LjAcChqeMDA8ITAcBhqeNDA8KTAcDhqeMjA8JTAcARqeNjA8LTAcCRqeMTA8IzAcBRqeNTA8KzAcDRqeMzA8JzAcAxqeNzA8LzAcCxpeMDC8IDAcBxpeNDC8KDAcDxpeMjC8JDCcABpeNjC8LDCcCBpeMTC8IjCcBBpeNTC8KjCcDBpeMzC8JjCcAhpeNzC8LjCcChreMDC8ITCcBhreNDC8KTCcDhreMjC8JTCcARreNjC8LTCcCRreMTC8IzCcBRreNTC8KzCcDRreMzC8JzCcAxreNzC8LzCcCxo+MDB8IDCcBxo+NDB8KDCcDxo+MjB8JDBcABo+NjB8LDBcCBo+MTB8IjBcBBo+NTB8KjBcDBo+MzB8JjBcAho+NzB8LjBcChq+MDB8ITBcBhq+NDB8KTBcDhq+MjB8JTBcARq+NjB8LTBcCRq+MTB8IzBcBRq+NTB8KzBcDRq+MzB8JzBcAxq+NzB8LzBcCxp+MDD8IDBcBxp+NDD8KDBcDxp+MjD8JDDcABp+NjD8LDDcCBp+MTD8IjDcBBp+NTD8KjDcDBp+MzD8JjDcAhp+NzD8LjDcChr+MDD8ITDcBhr+NDD8KTDcDhr+MjD8JTDcARr+NjD8LTDcCRr+MTD8IzDcBRr+NTD8KzDcDRr+MzD8JzDcAxr+V+b/vuH/GmnDvaBhAAPDAALDfaBhQAPDgALD/aBhIAPDQALDA6BhYAPDwALDg6BhEAPDIALDQ6BhUAPDoALDw6BhMAPDYALDI6BhcAPD4ALDo6BhCAPDEALDY6BhSAPDkALD46BhKAPDUALDE6BhaAPD0ALDk6BhGAPDMALDU6BhWAPDsALD06BhOAPDcALDM6BheAPD8ALDs6BhBAPDCALDc6BhRAPDiALD86BhJAPDSALDC6BhZAPDyALDi6BhFAPDKALDS6BhVAPDqALDy6BhNAPDaALDK6BhdAPD6ALDq6BhDAPDGALDa6BhTAPDmALD66BhLAPDWALDG6BhbAPD2ALDm6BhHAPDOALDW6BhXAPDuALD26BhPAPDeALDO6BhfAPD+ALDu6BhAgPDBALDe6BhQgPDhALD+6BhIgPDRALDB6BhYgPDxALDh6BhEgPDJALDR6BhUgPDpALDx6BhMgPDZALDJ6BhcgPD5ALDp6BhCgPDFALDZ6BhSgPDlALD56BhKgPDVALDF6BhagPD1ALDl6BhGgPDNALDV6BhWgPDtALD16BhOgPDdALDN6BhegPD9ALDt6BhBgPDDALDd6BhRgPDjALD96BhJgPDTALDD6BhZgPDzALDj6BhFgPDLALDT6BhVgPDrALDz6BhNgPDbALDL6BhdgPD7ALDr6BhDgPDHALDb6BhTgPDnALD76BhLgPDXALDH6BhbgPD3ALDn6BhHgPDPALDX6BhXgPDvALD36BhPgPDfALDP6BhfgPD/ALDv6Bhgf/jhv/b+P//++DdAP9xhgUN7rCg4A4DgoaFDAwLCQwDgYaFDQwLCwwDg4ZFDAyLCAyDgIZFDQyLCgyDgobFDAyLCQyDgYbFDQyLCwyDg4YlDAxLCAxDgIYlDQxLCgxDgoalDAxLCQxDgYalDQxLCwxDg4ZlDAzLCAzDgIZlDQzLCgzDgoblDAzLCQzDgYblDQzLCwzDg4YVDAwrCAwjgIYVDQwrCgwjgoaVDAwrCQwjgYaVDQwrCwwjg4ZVDAyrCAyjgIZVDQyrCgyjgobVDAyrCQyjgYbVDQyrCwyjg4Y1DAxrCAxjgIY1DQxrCgxjgoa1DAxrCQxjgYa1DQxrCwxjg4Z1DAzrCAzjgIZ1DQzrCgzjgob1DAzrCQzjgYb1DQzrCwzjg4YNDAwbCAwTgIYNDQwbCgwTgoaNDAwbCQwTgYaNDQwbCwwTg4ZNDAybCAyTgIZNDQybCgyTgobNDAybCQyTgYbNDQybCwyTg4YtDAxbCAxTgIYtDQxbCgxTgoatDAxbCQxTgYatDQxbCwxTg4ZtDAzbCAzTgIZtDQzbCgzTgobtDAzbCQzTgYbtDQzbCwzTg4YdDAw7CAwzgIYdDQw7CgwzgoadDAw7CQwzgYadDQw7Cwwzg4ZdDAy7CAyzgIZdDQy7CgyzgobdDAy7CQyzgYbdDQy7Cwyzg4Y9DAx7CAxzgIY9DQx7Cgxzgoa9DAx7CQxzgYa9DQx7Cwxzg4Z9DAz7CAzzgIZ9DQz7Cgzzgob9DAz7CQzzgYb9DQz7Cwzzg4YDDAwHCAwLgIYDDQwHCgwLgoaDDAwHCQwLgYaDDQwHCwwLg4ZDDAyHCAyLgIZDDQyHCgyLgobDDAyHCQyLgYbDDQyHCwyLg4YjDAxHCAxLgIYjDQxHCgxLgoajDAxHCQxLgYajDQxHCwxLg4ZjDAzHCAzLgIZjDQzHCgzLgobjDAzHCQzLgYbjDQzHCwzLg4YTDAwnCAwrgIYTDQwnCgwrgoaTDAwnCQwrgYaTDQwnCwwrg4ZTDAynCAyrgIZTDQynCgyrgobTDAynCQyrgYbTDQynCwyrg4YzDAxnCAxrgIYzDQxnCgxrgoazDAxnCQxrgYazDQxnCwxrg4ZzDAznCAzrgIZzDQznCgzrgobzDAznCQzrgYbzDQznCwzrg4YLDAwXCAwbgIYLDQwXCgwbgoaLDAwXCQwbgYaLDQwXCwwbg4ZLDAyXCAybgIZLDQyXCgybgobLDAyXCQybgYbLDQyXCwybg4YrDAxXCAxbgIYrDQxXCgxbgoarDAxXCQxbgYarDQxXCwxbg4ZrDAzXCAzbgIZrDQzXCgzbgobrDAzXCQzbgYbrDQzXCwzbg4YbDAw3CAw7gIYbDQw3Cgw7goabDAw3CQw7gYabDQw3Cww7g4ZbDAy3CAy7gIZbDQy3Cgy7gobbDAy3CQy7gYbbDQy3Cwy7g4Y7DAx3CAx7gIY7DQx3Cgx7goa7DAx3CQx7gYa7DQx3Cwx7g4Z7DAz3CAz7gIZ7DQz3Cgz7gob7DAz3CQz7gYb7DQz3Cwz7g4YHDAwPCAwHgIYHDQwPCgwHgoaHDAwPCQwHgYaHDQwPCwwH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MTBsIjBMAho2NTBsKjBMCho2MzBsJjBMBho2NzBsLjBMDhq2MDBsITBMARq2NDBsKTBMCRq2MjBsJTBMBRq2NjBsLTBMDRq2MTBsIzBMAxq2NTBsKzBMCxq2MzBsJzBMBxq2NzBsLzBMDxp2MDDsIDDMABp2NDDsKDDMCBp2MjDsJDDMBBp2NjDsLDDMDBp2MTDsIjDMAhp2NTDsKjDMChp2MzDsJjDMBhp2NzDsLjDMDhr2MDDsITDMARr2NDDsKTDMCRr2MjDsJTDMBRr2NjDsLTDMDRr2MTDsIzDMAxr2NTDsKzDMCxr2MzDsJzDMBxr2NzDsLzDMDxoOMDAcIDAsABoONDAcKDAsCBoOMjAcJDAsBBoONjAcLDAsDBoOMTAcIjAsAhoONTAcKjAsChoOMzAcJjAsBhoONzAcLjAsDhqOMDAcITAsARqONDAcKTAsCRqOMjAcJTAsBRqONjAcLTAsDRqOMTAcIzAsAxqONTAcKzAsCxqOMzAcJzAsBxqONzAcLzAsDxpOMDCcIDCsABpONDCcKDCsCBpOMjCcJDCsBBpONjCcLDCsDBpOMTCcIjCsAhpONTCcKjCsChpOMzCcJjCsBhpONzCcLjCsDhrOMDCcITCsARrONDCcKTCsCRrOMjCcJTCsBRrONjCcLTCsDRrOMTCcIzCsAxrONTCcKzCsCxrOMzCcJzCsBxrONzCcLzCsDxouMDBcIDBsABouNDBcKDBsCBouMjBcJDBsBBouNjBcLDBsDBouMTBcIjBsAhouNTBcKjBsChouMzBcJjBsBhouNzBcLjBsDhquMDBcITBsARquNDBcKTBsCRquMjBcJTBsBRquNjBcLTBsDRquMTBcIzBsAxquNTBcKzBsCxquMzBcJzBsBxquNzBcLzBsDxpuMDDcIDDsABpuNDDcKDDsCBpuMjDcJDDsBBpuNjDcLDDsDBpuMTDcIjDsAhpuNTDcKjDsChpuMzDcJjDsBhpuNzDcLjDsDhruMDDcITDsARruNDDcKTDsCRruMjDcJTDsBRruNjDcLTDsDRruMTDcIzDsAxruNTDcKzDsCxruMzDcJzDsBxruNzDcLzDsDxoeMDA8IDAcABoeNDA8KDAcCBoeMjA8JDAcBBoeNjA8LDAcDBoeMTA8IjAcAhoeNTA8KjAcChoeMzA8JjAcBhoeNzA8LjAcDhqe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QMPxBobjBYYVQcMJBoYTBIaVQMOJBoYTBYaVQcNJBoaTBIZVQMPJBoaTBYZVQcMpBoZTBIbVQMOpBoZTBYbVQcNpBobTBIY1QMPpBobTBYY1QcMZBoYzBIa1QMOZBoYzBYa1QcNZBoazBIZ1QMPZBoazBYZ1QcM5BoZzBIb1QMO5BoZzBYb1QcN5BobzBIYNQMP5BobzBYYNQcMFBoYLBIaNQMOFBoYLBYaNQcNFBoaLBIZNQMPFBoaLBYZNQcMlBoZLBIbNQMOlBoZLBYbNQcNlBobLBIYtQMPlBobLBYYtQcMVBoYrBIatQMOVBoYrBYatQcNVBoarBIZtQMPVBoarBYZtQcM1BoZrBIbtQMO1BoZrBYbtQcN1BobrBIYdQMP1BobrBYYdQcMNBoYbBIadQMONBoYbBYadQcNNBoabBIZdQMPNBoabBYZdQcMtBoZbBIbdQMOtBoZbBYbdQcNtBobbBIY9QMPtBobbBYY9QcMdBoY7BIa9QMOdBoY7BYa9QcNdBoa7BIZ9QMPdBoa7BYZ9QcM9BoZ7BIb9QMO9BoZ7BYb9QcN9Bob7BIYDQMP9Bob7BYYDQcMDBoYHBIaDQMODBoYHBYaDQcNDBoaHBIZDQMPDBoaHBYZDQcMjBoZHBIbDQMOjBoZHBYbDQcNjBobHBIYjQMPjBobHBYYjQcMTBoYnBIajQMOTBoYnBYajQcNTBoanBIZjQMPTBoanBYZjQcMzBoZnBIbjQMOzBoZnBYbjQcNzBobnBIYTQMPzBobnBYYTQcMLBoYXBIaTQMOLBoYXBYaTQcNLBoaXBIZTQMPLBoaXBYZTQcMrBoZXBIbTQMOrBoZXBYbTQcNrBobXBIYzQMPrBobXBYYzQcMbBoY3BIazQMObBoY3BYazQcNbBoa3BIZzQMPbBoa3BYZzQcM7BoZ3BIbzQMO7BoZ3BYbzQcN7Bob3BIYLQMP7Bob3BYYLQcMHBoYPBIaLQMOHBoYPBYaLQcNHBoaPBIZLQMPHBoaPBYZLQcMnBoZPBIbLQMOnBoZPBYbLQcNnBobPBIYrQMPnBobPBYYrQcMXBoYvBIarQMOXBoYvBYarQcNXBoavBIZrQMPXBoavBYZrQcM3BoZvBIbrQMO3BoZvBYbrQcN3BobvBIYbQMP3BobvBYYbQcMPBoYfBIabQMOPBoYfBYabQcNPBoafBIZb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DeMZGMYTGD4ADeMbGMYXGD4EDRMYGCYQGD4CDRMaGCYUGD4GDRMZGCYSGD4BDRMbGCYWGD4FDZMYGCYRGD4DDZMaGCYVGD4HDZMZGCYTGL4ADZMbGCYXGL4EDVMYGKYQGL4CDVMaGKYUGL4GDVMZGKYSGL4BDVMbGKYWGL4FDdMYGKYRGL4DDdMaGKYVGL4HDdMZGKYTGH4ADdMbGKYXGH4EDTMYGGYQGH4CDTMaGGYUGH4GDTMZGGYSGH4BDTMbGGYWGH4FDbMYGGYRGH4DDbMaGGYVGH4HDbMZGGYTGP4ADbMbGGYXGP4EDXMYGOYQGP4CDXMaGOYUGP4GDXMZGOYSGP4BDXMbGOYWGP4FDfMYGOYRGP4DDfMaGOYVGP5XkDPMZ2CYT2AYADTMb2CYX2AYEDQsYGBYQGAYCDQsaGBYUGAYGDQsZGBYSGAYBDQsbGBYWGAYFDQsYmBYRGAYDDQsamBYVGAYHDQsZmBYTGAYAjQsbmBYXGAYEjQsYWBYQmAYCjQsaWBYUmAYGjQsZWBYSmAYBjQsbWBYWmAYFjQsY2BYRmAYDjQsa2BYVmAYHjQsZ2BYTmAYATQsb2BYXmAYETSsYGBYQWAYCTSsaGBYUWAYGTSsZGBYSWAYBTSsbGBYWWAYFTSsYmBYRWAYDTSsamBYVWAYHTSsZmBYTWAYAzSsbmBYXWAYEzSsYWBYQ2AYCzSsaWBYU2AYGzSsZWBYS2AYBzSsbWBYW2AYFzSsY2BYR2AYDzSsa2BYV2AYHzSsZ2BYT2CYADSsb2BYX2CYEDRsYGDYQGCYCDRsaGDYUGCYGDRsZGDYSGCYBDRsbGDYWGCYFDRsYmDYRGCYDDRsamDYVGCYHDRsZmDYTGCYAjRsbmDYXGCYEjRsYWDYQmCYCjRsaWDYUmCYGjRsZWDYSmCYBjRsbWDYWmCYFjRsY2DYRmCYDjRsa2DYVmCYHjRsZ2DYTmCYATRsb2DYXmCYETTsYGDYQWCYCTTsaGDYUWCYGTTsZGDYSWCYBTTsbGDYWWCYFTTsYmDYRWCYDTTsamDYVWCYHTTsZmDYTWCYAzTsbmDYXWCYEzTsYWDYQ2CYCzTsaWDYU2CYGzTsZWDYS2CYBzTsbWDYW2CYFzTsY2DYR2CYDzTsa2DYV2CYHzTsZ2DYT2BYADTsb2DYX2BYEDQcYGA4QGBYCDQcaGA4UGBYGDQcZGA4SGBYBDQcbGA4WGBYFDQcYmA4RGBYDDQcamA4VGBYHDQcZmA4TGBYAjQcbmA4XGBYEjQcYWA4QmBYCjQcaWA4UmBYGjQcZWA4SmBYBjQcbWA4WmBYFjQcY2A4RmBYDjQca2A4VmBYHjQcZ2A4TmBYATQcb2A4XmBYETScYGA4QWBYCTScaGA4UWBYGTScZGA4SWBYBTScbGA4WWBYFTScYmA4RWBYDTScamA4VWBYHTScZmA4TWBYAzScbmA4XWBYEzScYWA4Q2BYCzScaWA4U2BYGzScZWA4S2BYBzScbWA4W2BYFzScY2A4R2BYDzSca2A4V2BYHzScZ2A4T2DYADScb2A4X2DYEDRcYGC4QGDYCDRcaGC4UGDYGDRcZGC4SGDYBDRcbGC4WGDYFDRcYmC4RGDYDDRcamC4VGDYHDRcZmC4TGDYAjRcbmC4XGDYEjRcYWC4QmDYCjRcaWC4UmDYGjRcZWC4SmDYBjRcbWC4WmDYFjRcY2C4RmDYDjRca2C4VmDYHjRcZ2C4TmDYATRcb2C4XmDYETTcYGC4QWDYCTTcaGC4UWDYGTTcZGC4SWDYBTTcbGC4WWDYFTTcYmC4RWDYDTTcamC4VWDYHTTcZmC4TWDYAzTcbmC4XWDYEzTcYWC4Q2DYCzTcaWC4U2DYGzTcZWC4S2DYBzTcbWC4W2DYFzTcY2C4R2DYDzTca2C4V2DYHzTcZ2C4T2A4ADTcb2C4X2A4EDQ8YGB4QGA4CDQ8aGB4UGA4GDQ8ZGB4SGA4BDQ8bGB4WGA4FDQ8YmB4RGA4DDQ8amB4VGA4HDQ8ZmB4TGA4AjQ8bmB4XGA4EjQ8YWB4QmA4CjQ8aWB4UmA4GjQ8ZWB4SmA4BjQ8bWB4WmA4FjQ8Y2B4RmA4DjQ8a2B4VmA4HjQ8Z2B4TmA4ATQ8b2B4XmA4ETS8YGB4QWA4CTS8aGB4UWA4GTS8ZGB4SWA4BTS8bGB4WWA4FTS8YmB4RWA4DTS8amB4VWA4HTS8ZmB4TWA4AzS8bmB4XWA4EzS8YWB4Q2A4CzS8aWB4U2A4GzS8ZWB4S2A4BzS8bWB4W2A4FzS8Y2B4R2A4DzS8a2B4V2A4HzS8Z2B4T2C4ADS8b2B4X2C4EDR8YGD4QGC4CDR8aGD4UGC4GDR8ZGD4SGC4BDR8bGD4WGC4FDR8YmD4RGC4DDR8amD4VGC4HDR8ZmD4TGC4AjR8bmD4XGC4EjR8YWD4QmC4CjR8aWD4UmC4GjR8ZWD4SmC4BjR8bWD4WmC4FjR8Y2D4RmC4DjR8a2D4VmC4HjR8Z2D4TmC4ATR8b2D4XmC4ETT8YGD4QWC4CTT8aGD4UWC4GTT8ZGD4SWC4BTT8bGD4WWC4FTT8YmD4RWC4DTT8amD4VWC4HTT8ZmD4TWC4AzT8bmD4XWC4EzT8YWD4Q2C4CzT8aWD4U2C4GzT8ZWD4S2C4BzT8bWD4W2C4FzT8Y2D4R2C4DzT8a2D4V2C4HzT8Z2D4T2B4ADT8r/r/fcP/NdKGB0HDAAaGAQSGh0DDgAaGAQWGh0HDQAaGgQSGR0DDwAaGgQWGR0HDIAaGQQSGx0DDoAaGQQWGx0HDYAaGwQSGJ0DD4AaGwQWGJ0HDEAaGIQSGp0DDkAaGIQWGp0HDUAaGoQSGZ0DD0AaGoQWGZ0HDMAaGYQSG50DDsAaGYQWG50HDcAaG4QSGF0DD8AaG4QWGF0HDCAaGEQSGl0DDiAaGEQWGl0HDSAaGkQSGV0DDyAaGkQWGV0HDKAaGUQSG10DDqAaGUQWG10HDaAaG0QSGN0DD6AaG0QWGN0HDGAaGMQSGt0DDmAaGMQWGt0HDWAaGsQSGd0DD2AaGsQWGd0HDOAaGcQSG90DDuAaGcQWG90HDeAaG8QSGD0DD+AaG8QWGD0HDBAaGCQSGj0DDhAaGCQWGj0HDRAaGiQSGT0DDxAaGiQWGT0HDJAaGSQSGz0DDpAaGSQWGz0HDZAaGyQSGL0DD5AaGyQWGL0HDFAaGKQSGr0DDlAaGKQWGr0HDVAaGqQSGb0DD1AaGqQWGb0HDNAaGaQSG70DDtAaGaQWG70HDdAaG6QSGH0DD9AaG6QWGH0HDDAaGGQSGn0DDjAaGGQWGn0HDTAaGmQSGX0DDzAaGmQWGX0HDLAaGWQSG30DDrAaGWQWG30HDbAaG2QSGP0DD7AaG2QWGP0HDHAaGOQSGv0DDnAaGOQWGv0HDXAaGuQSGf0DD3AaGuQWGf0HDPAaGeQSG/0DDvAaGeQWG/xXiDPMZGOYTGAYADfMbGOYXGAYEDQsYGBYQGAYCDQsaGBYUGAYGDQsZGBYSGAYBDQsbGBYWGAYFDYsYGBYRGAYDDYsaGBYVGAYHDYsZGBYTGIYADYsbGBYXGIYEDUsYGJYQGIYCDUsaGJYUGIYGDUsZGJYSGIYBDUsbGJYWGIYFDcsYGJYRGIYDDcsaGJYVGIYHDcsZGJYTGEYADcsbGJYXGEYEDSsYGFYQGEYCDSsaGFYUGEYGDSsZGFYSGEYBDSsbGFYWGEYFDasYGFYRGEYDDasaGFYVGEYHDasZGFYTGMYADasbGFYXGMYEDWsYGNYQGMYCDWsaGNYUGMYGDWsZGNYSGMYBDWsbGNYWGMYFDesYGNYRGMYDDesaGNYVGMYHDesZGNYTGCYADesbGNYXGCYEDRsYGDYQGCYCDRsaGDYUGCYGDRsZGDYSGCYBDRsbGDYWGCYFDZsYGDYRGCYDDZsaGDYVGCYHDZsZGDYTGKYADZsbGDYXGKYEDVsYGLYQGKYCDVsaGLYUGKYGDVsZGLYSGKYBDVsbGLYWGKYFDdsYGLYRGKYDDdsaGLYVGKYHDdsZGLYTGGYADdsbGLYXGGYEDTsYGHYQGGYCDTsaGHYUGGYGDTsZGHYSGGYBDTsbGHYWGGYFDbsYGHYRGGYDDbsaGHYVGGYHDbsZGHYTGOYADbsbGHYXGOYEDXsYGPYQGOYCDXsaGPYUGOYGDXsZGPYSGOYBDXsbGPYWGOYFDfsYGPYRGOYDDfsaGPYVGOYHDfsZGPYTGBYADfsbGPYXGBYEDQcYGA4QGBYCDQcaGA4UGBYGDQcZGA4SGBYBDQcbGA4WGBYFDYcYGA4RGBYDDYcaGA4VGBYHDYcZGA4TGJYADYcbGA4XGJYEDUcYGI4QGJYCDUcaGI4UGJYGDUcZGI4SGJYBDUcbGI4WGJYFDccYGI4RGJYDDccaGI4VGJYHDccZGI4TGFYADccbGI4XGFYEDScYGE4QGFYCDScaGE4UGFYGDScZGE4SGFYBDScbGE4WGFYFDacYGE4RGFYDDacaGE4VGFYHDacZGE4TGNYADacbGE4XGNYEDWcYGM4QGNYCDWcaGM4UGNYGDWcZGM4SGNYBDWcbGM4WGNYFDecYGM4RGNYDDecaGM4VGNYHDecZGM4TGDYADecbGM4XGDYEDRcYGC4QGDYCDRcaGC4UGDYGDRcZGC4SGDYBDRcbGC4WGDYFDZcYGC4RGDYDDZcaGC4VGDYHDZcZGC4TGLYADZcbGC4XGLYEDVcYGK4QGLYCDVcaGK4UGLYGDVcZGK4SGLYBDVcbGK4WGLYFDdcYGK4RGLYDDdca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2UDDrgaGXQWG2UHDbgaG3QSGOUDD7gaG3QWGOUHDHgaGPQSGuUDDngaGPQWGuUHDXgaGvQSGeUDD3gaGvQWGeUHDPgaGfQSG+UDDvgaGfQWG+UHDfgaG/QSGBUDD/gaG/QWGBUHDAQaGAwSGhUDDgQaGAwWGhUHDQQaGgwSGRUDDwQaGgwWGRUHDIQaGQwSGxUDDoQaGQwWGxUHDYQaGwwSGJUDD4QaGwwWGJUHDEQaGIwSGpUDDkQaGIwWGpUHDUQaGowSGZUDD0QaGowWGZUHDMQaGYwSG5UDDsQaGYwWG5UHDcQaG4wSGFUDD8QaG4wWGFUHDCQaGEwSGlUDDiQaGEwWGlUHDSQaGkwSGVUDDyQaGkwWGVUHDKQaGUwSG1UDDqQaGUwWG1UHDaQaG0wSGNUDD6QaG0wWGNUHDGQaGMwSGtUDDmQaGMwWGtUHDWQaGswSGdUDD2QaGswWGdUHDOQaGcwSG9UDDuQaGcwWG9UHDeQaG8wSGDUDD+QaG8wWGDUHDBQaGCwSGjUDDhQaGCwWGjUHDRQaGiwSGTUDDxQaGiwWGTUHDJQaGSwSGzUDDpQaGSwWGzUHDZQaGywSGLUDD5QaGywWGLUHDFQaGKwSGrUDDlQaGKwWGrUHDVQaGqwSGbUDD1QaGqwWGbUHDNQaGawSG7UDDtQaGawWG7UHDdQaG6wSGHUDD9QaG6wWGHUHDDQaGGwSGnUDDjQaGGwWGnUHDTQaGmwSGXUDDzQaGmwWGXUHDLQaGWwSG3UDDrQaGWwWG3UHDbQaG2wSGPUDD7QaG2wWGPUHDHQaGOwSGvUDDnQaGOwWGvUHDXQaGuwSGfUDD3QaGuwWGfUHDPQaGewSG/UDDvQaGewWG/UHDfQaG+wSGA0DD/QaG+wWGA0HDAwaGBwSGg0DDgwaGBwWGg0HDQwaGhwSGQ0DDwwaGhwWGQ0HDIwaGRwSGw0DDowaGRwWGw0HDYwaGxwSGI0DD4waGxwWGI0HDEwaGJwSGo0DDkwaGJwWGo0HDUwaGpwSGY0DD0waGpwWGY0HDMwaGZwSG40DDswaGZwWG40HDcwaG5wSGE0DD8waG5wWGE0HD/0fNPwSB0nVdlO57bNu2bdu2bdu2bdu2bdu27XNu/dW83Roz4puN7O4Y64lckZGdfcHA8ILAcBJoeNHA8KLAcDJoeMnA8JLAcApoeNnA8LLAcCpoeMXA8IrAcBpoeNXA8KrAcDpoeM3A8JrAcAZoeN3A8LrAcCZoeMPA8IbAcBZoeNPA8KbAcDZoeMvA8JbAcA5oeNvA8LbAcC5oeMfA8I7AcB5oeNfA8K7AcD5oeM/A8J7AcAFoeN/A8L7AcCFo+MDA8IHAcBFo+NDA8KHAcDFo+MjA8JHAcAlo+NjA8LHAcClo+MTA8InAcBlo+NTA8KnAcDlo+MzA8JnAcAVo+NzA8LnAcCVo+MLA8IXAcBVo+NLA8KXAcDVo+MrA8JXAcA1o+NrA8LXAcC1o+MbA8I3AcB1o+NbA8K3AcD1o+M7A8J3AcANo+N7A8L3AcCNo+MHA8IPAcBNo+NHA8KPAcDNo+MnA8JPAcAto+NnA8LPAcCto+MXA8IvAcBto+NXA8KvAcDto+M3A8JvAcAdo+N3A8LvAcCdo+MPA8IfAcBdo+NPA8KfAcDdo+MvA8JfAcA9o+NvA8LfAcC9o+MfA8I/AcB9o+NfA8K/AcD9o+M/A8J/A8ABo+F/N/33D/2ukDQ+ChgEMDAMIDA+BhgENDAMKDA+DhoEMDAMJDI+AhoENDAMLDI+ChkEMDIMIDI+BhkENDIMKDI+DhsEMDIMJDE+AhsENDIMLDE+ChiEMDEMIDE+BhiENDEMKDE+DhqEMDEMJDM+AhqENDEMLDM+ChmEMDMMIDM+BhmENDMMKDM+DhuEMDMMJDC+AhuENDMMLDC+ChhEMDCMIDC+BhhENDCMKDC+DhpEMDCMJDK+AhpENDCMLDK+ChlEMDKMIDK+BhlENDKMKDK+DhtEMDKMJDG+AhtENDKMLDG+ChjEMDGMIDG+BhjENDGMKDG+DhrEMDGMJDO+AhrENDGMLDO+ChnEMDOMIDO+BhnENDOMKDO+DhvEMDOMJDB+AhvENDOMLDB+ChgkMDBMIDB+BhgkNDBMKDB+DhokMDBMJDJ+AhokNDBMLDJ+ChkkMDJMIDJ+BhkkNDJMKDJ+DhskMDJMJDF+AhskNDJMLDF+ChikMDFMIDF+BhikNDFMKDF+DhqkMDFMJDN+AhqkNDFMLDN+ChmkMDNMIDN+BhmkNDNMKDN+DhukMDNMJDD+AhukNDNMLDD+ChhkMDDMIDD+BhhkNDDMKDD+DhpkMDDMJDL+AhpkNDDMLDL+ChlkMDLMIDL+BhlkNDLMKDL+DhtkMDLMJDH+AhtkNDLMLDH+ChjkMDHMIDH+BhjkNDHMKDH+DhrkMDHMJDP+AhrkNDHMLDP+ChnkMDPMIDP+BhnkNDPMKDP8rwhnmMzDMJzAMABrmNzDMLzAMCBoWMDAsIDAMBBoWNDAsKDAMDBoWMjAsJDAMAhoWNjAsLDAMChoWMTAsIjAMBhoWNTAsKjAMDhoWMzAsJjAMARoWNzAsLjAMCRqWMDAsITAMBRqWNDAsKTAMDRqWMjAsJTAMAxqWNjAsLTAMCxqWMTAsIzAMBxqWNTAsKzAMDxqWMzAsJzCMABqWNzAsLzCMCBpWMDCsIDCMBBpWNDCsKDCMDBpWMjCsJDCMAhpWNjCsLDCMChpWMTCsIjCMBhpWNTCsKjCMDhpWMzCsJjCMARpWNzCsLjCMCRrWMDCsITCMBRrWNDCsKTCMDRrWMjCsJTCMAxrWNjCsLTCMCxrWMTCsIzCMBxrWNTCsKzCMDxrWMzCsJzBMABrWNzCsLzBMCBo2MDBsIDBMBBo2NDBsKDBMDBo2MjBsJDBMAho2NjBsLDBMCho2MTBsIjBMBho2NTBsKjBMDho2MzBsJjBMARo2NzBsLjBMCRq2MDBsITBMBRq2NDBsKTBMDRq2MjBsJTBMAxq2NjBsLTBMCxq2MTBsIzBMBxq2NTBsKzBMDxq2MzBsJzDMABq2NzBsLzDMCBp2MDDsIDDMBBp2NDDsKDDMDBp2MjDsJDDMAhp2NjDsLDDMChp2MTDsIjDMBhp2NTDsKjDMDhp2MzDsJjDMARp2NzDsLjDMCRr2MDDsITDMBRr2NDDsKTDMDRr2MjDsJTDMAxr2NjDsLTDMCxr2MTDsIzDMBxr2NTDsKzDMDxr2MzDsJzAsABr2NzDsLzAsCBoOMDAcIDAsBBoONDAcKDAsDBoOMjAcJDAsAhoONjAcLDAsChoOMTAcIjAsBhoONTAcKjAsDhoOMzAcJjAsARoONzAcLjAsCRqOMDAcITAsBRqONDAcKTAsDRqOMjAcJTAsAxqONjAcLTAsCxqOMTAcIzAsBxqONTAcKzAsDxqOMzAcJzCsABqONzAcLzCsCBpOMDCcIDCsBBpONDCcKDCsDBpOMjCcJDCsAhpONjCcLDCsChpOMTCcIjCsBhpONTCcKjCsDhpOMzCcJjCsARpONzCcLjCsCRrOMDCcITCsBRrONDCcKTCsDRrOMjCcJTCsAxrONjCcLTCsCxrOMTCcIzCsBxrONTCcKzCsDxrOMzCcJzBsABrONzCcLzBsCBouMDBcIDBsBBouNDBcKDBsDBouMjBcJDBsAhouNjBcLDBsChouMTBcIjBsBhouNTBcKjBsDhouMzBcJjBsARouNzBcLjBsCRquMDBcITBsBRquNDBcKTBsDRquMjBcJTBsAxquNjBcLTBsCxquMTBcIzBsBxquNTBcKzBsDxquMzBcJzDsABquNzBcLzDsCBpuMDDcIDDsBBpuNDDcKDDsDBpuMjDcJDDsAhpuNjDcLDDsChpuMTDcIjDsBhpuNTDcKjDsDhpuMzDcJjDsARpuNzDcLjDsCRruMDDcITDsBRruNDDcKTDsDRruMjDcJTDsAxruNjDcLTDsCxruMTDcIzDsBxruNTDcKzDsDxruMzDcJzAcABruNzDcLzAcCBoeMDA8IDAcBBoeNDA8KDAcDBoeMjA8JDAcAhoeNjA8LDAcChoeMTA8IjAcBhoeNTA8KjAcDhoeMzA8JjAcARoeNzA8LjAcCRqeMDA8ITAcBRqeNDA8KTAcDRqeMjA8JTAcAxqeNjA8LTAcCxqeMTA8IzAcBxqeNTA8KzAcDxqeMzA8JzCcABqeNzA8LzCcCBpeMDC8IDCcBBpeNDC8KDCcDBpeMjC8JDCcAhpeNjC8LDCcChpeMTC8IjCcBhpeNTC8KjCcDhpeMzC8JjCcARpeNzC8LjCcCRreMDC8ITCcBRreNDC8KTCcDRreMjC8JTCcAxreNjC8LTCcCxreMTC8IzCcBxreNTC8KzCcDxreMzC8JzBcABreNzC8LzBcCBo+MDB8IDBcBBo+NDB8KDBcDBo+MjB8JDBcAho+NjB8LDBcCho+MTB8IjBcBho+NTB8KjBcDho+MzB8JjBcARo+NzB8LjBcCRq+MDB8ITBcBRq+NDB8KTBcDRq+MjB8JTBcAxq+NjB8LTBcCxq+MTB8IzBcBxq+NTB8KzBcDxq+MzB8JzDcABq+NzB8LzDcCBp+MDD8IDDcBBp+NDD8KDDcDBp+MjD8JDDcAhp+NjD8LDDcChp+MTD8IjDcBhp+NTD8KjDcDhp+MzD8JjDcARp+NzD8LjDcCRr+MDD8ITDcBRr+NDD8KTDcDRr+MjD8JTDcAxr+NjD8LTDcCxr+MTD8IzDcBxr+NTD8KzDcDxr+MzD8JzA8ABr+V+t/3/D/GmnDg6BhAAPDAALDQ6BhQAPDgALDw6BhIAPDQALDI6BhYAPDwALDo6BhEAPDIALDY6BhUAPDoALD46BhMAPDYALDE6BhcAPD4ALDk6BhCAPDEALDU6BhSAPDkALD06BhKAPDUALDM6BhaAPD0ALDs6BhGAPDMALDc6BhWAPDsALD86BhOAPDcALDC6BheAPD8ALDi6BhBAPDCALDS6BhRAPDiALDy6BhJAPDSALDK6BhZAPDyALDq6BhFAPDKALDa6BhVAPDqALD66BhNAPDaALDG6BhdAPD6ALDm6BhDAPDGALDW6BhTAPDmALD26BhLAPDWALDO6BhbAPD2ALDu6BhHAPDOALDe6BhXAPDuALD+6BhPAPDeALDB6BhfAPD+ALDh6BhAgPDBALDR6BhQgPDhALDx6BhIgPDRALDJ6BhYgPDxALDp6BhEgPDJALDZ6BhUgPDpALD56BhMgPDZALDF6BhcgPD5ALDl6BhCgPDFALDV6BhSgPDlALD16BhKgPDVALDN6BhagPD1ALDt6BhGgPDNALDd6BhWgPDtALD96BhOgPDdALDD6BhegPD9ALDj6BhBgPDDALDT6BhRgPDjALDz6BhJgPDTALDL6BhZgPDzALDr6BhFgPDLALDb6BhVgPDrALD76BhNgPDbALDH6BhdgPD7ALDn6BhDgPDHALDX6BhTgPDnALD36BhLgPDXALDP6BhbgPD3ALDv6BhHgPDPALDf6BhXgPDvALD/4pyhvkMDPMJDAOAhvkNDPMLDAOChgUMDAsIDAOBhgUNDAsKDAODhoUMDAsJDIOAhoUNDAsLDIOChkUMDIsIDIOBhkUNDIsKDIODhsUMDIsJDEOAhsUNDIsLDEOChiUMDEsIDEOBhiUNDEsKDEODhqUMDEsJDMOAhqUNDEsLDMOChmUMDMsIDMOBhmUNDMsKDMODhuUMDMsJDCOAhuUNDMsLDCOChhUMDCsIDCOBhhUNDCsKDCODhpUMDCsJDKOAhpUNDCsLDKOChlUMDKsIDKOBhlUNDKsKDKODhtUMDKsJDGOAhtUNDKsLDGOChjUMDGsIDGOBhjUNDGsKDGODhrUMDGsJDOOAhrUNDGsLDOOChnUMDOsIDOOBhnUNDOsKDOODhvUMDOsJDBOAhvUNDOsLDBOChg0MDBsIDBOBhg0NDBsKDBODho0MDBsJDJOAho0NDBsLDJOChk0MDJsIDJOBhk0NDJsKDJODhs0MDJsJDFOAhs0NDJsLDFOChi0MDFsIDFOBhi0NDFsKDFODhq0MDFsJDNOAhq0NDFsLDNOChm0MDNsIDNOBhm0NDNsKDNODhu0MDNsJDDOAhu0NDNsLDDOChh0MDDsIDDOBhh0NDDsKDDODhp0MDDsJDLOAhp0NDDsLDLOChl0MDLsIDLOBhl0NDLsKDLODht0MDLsJDHOAht0NDLsLDHOChj0MDHsIDHOBhj0NDHsKDHODhr0MDHsJDPOAhr0NDHsLDPOChn0MDPsIDPOBhn0NDPsKDPODhv0MDPsJDAuAhv0NDPsLDAuChgMMDAcIDAuBhgMNDAcKDAuDhoMMDAcJDIuAhoMNDAcLDIuChkMMDIcIDIuBhkMNDIcKDIuDhsMMDIcJDEuAhsMNDIcLDEuChiMMDEcIDEuBhiMNDEcKDEuDhqMMDEcJDMuAhqMNDEcLDMuChmMMDMcIDMuBhmMNDMcKDMuDhuMMDMcJDCuAhuMNDMcLDCuChhMMDCcIDCuBhhMNDCcKDCuDhpMMDCcJDKuAhpMNDCcLDKuChlMMDKcIDKuBhlMNDKcKDKuDhtMMDKcJDGuAhtMNDKcLDGuChjMMDGcIDGuBhjMNDGcKDGuDhrMMDGcJDOuAhrMNDGcLDOuChnMMDOcIDOuBhnMNDOcKDOuDhvMMDOcJDBuAhvMNDOcLDBuChgsMDBcIDBuBhgsNDBcKDBuDhosMDBcJDJuAhosNDBcLDJuChksMDJcIDJuBhksNDJcKDJuDhssMDJcJDFuAhssNDJcLDFuChisMDFcIDFuBhisNDFcKDFuDhqsMDFcJDNuAhqsNDFcLDNuChmsMDNcIDNuBhmsNDNcKDNuDhusMDNcJDDuAhusNDNcLDDuChhsMDDcIDDuBhhsNDDcKDDuDhpsMDDcJDLuAhpsNDDcLDLuChlsMDLcIDLuBhlsNDLcKDLuDhtsMDLcJDHuAhtsNDLcLDHuChjsMDHcIDHuBhjsNDHcKDHuDhrsMDHcJDPuAhrsNDHcLDPuChnsMDPcIDPuBhnsNDPcKDPuDhvsMDPcJDAeAhvsNDPcLDAeChgcMDA8IDAeBhgcNDA8KDAeDhocMDA8JDIeAhocNDA8LDIeChkcMDI8IDIeBhkcNDI8KDIeDhscM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LAQaDjQwHCgwLAwaDjIwHCQwLAIaDjYwHCwwLAoaDjEwHCIwLAYaDjUwHCowLA4aDjMwHCYwLAEaDjcwHC4wLAkajjAwHCEwLAUajjQwHCkwLA0ajjIwHCUwLAMajjYwHC0wLAsajjEwHCMwLAcajjUwHCswLA8ajjMwHCcwrAAajjcwHC8wrAgaTjAwnCAwrAQaTjQwnCgwrAwaTjIwnCQwrAIaTjYwnCwwrAoaTjEwnCIwrAYaTjUwnCowrA4aTjMwnCYwrAEaTjcwnC4wrAkazjAwnCEwrAUazjQwnCkwrA0azjIwnCUwrAMazjYwnC0wrAsazjEwnCMwrAcazjUwnCswrA8azjMwnCcwbAAazjcwnC8wbAgaLjAwXCAwbAQaLjQwXCgwbAwaLjIwXCQwbAIaLjYwXCwwbAoaLjEwXCIwbAYaLjUwXCowbA4aLjMwXCYwbAEaLjcwXC4wbAkarjAwXCEwbAUarjQwXCkwbA0arjIwXCUwbAMarjYwXC0wbAsarjEwXCMwbAcarjUwXCswbA8arjMwXCcw7AAarjcwXC8w7AgabjAw3CAw7AQabjQw3Cgw7AwabjIw3CQw7AIabjYw3Cww7AoabjEw3CIw7AYabjUw3Cow7A4abjMw3CYw7AEabjcw3C4w7Aka7jAw3CEw7AUa7jQw3Ckw7A0a7jIw3CUw7AMa7jYw3C0w7Asa7jEw3CMw7Aca7jUw3Csw7A8a7jMw3CcwHAAa7jcw3C8wHAgaHjAwPCAwHAQaHjQwPCgwHAwaHjIwPCQwHAIaHjYwPCwwHAoaHjEwPCIwHAYaHjUwPCowHA4aHjMwPCYwHAEaHjcwPC4wHAkanjAwPCEwHAUanjQwPCkwHA0anjIwPCUwHAManjYwPC0wHAsanjEwPCMwHAcanjUwPCswHA8anjMwPCcwnAAanjcwPC8wnAgaXjAwvCAwnAQaXjQwvCgwnAwaXjIwvCQwnAIaXjYwvCwwnAoaXjEwvCIwnAYaXjUwvCownA4aXjMwvCYwnAEaXjcwvC4wnAka3jAwvCEwnAUa3jQwvCkwnA0a3jIwvCUwnAMa3jYwvC0wnAsa3jEwvCMwnAca3jUwvCswnA8a3jMwvCcwXAAa3jcwvC8wXAgaPjAwfCAwXAQaPjQwfCgwXAwaPjIwfCQwXAIaPjYwfCwwXAoaPjEwfCIwXAYaPjUwfCowXA4aPjMwfCYwXAEaPjcwfC4wXAkavjAwfCEwXAUavjQwfCkwXA0avjIwfCUwXAMavjYwfC0wXAsavjEwfCMwXAcavjUwfCswXA8avjMwfCcw3AAavjcwfC8w3AgafjAw/CAw3AQafjQw/Cgw3AwafjIw/CQw3AIafjYw/Cww3AoafjEw/CIw3AYafjUw/Cow3A4afjMw/CYw3AEafjcw/C4w3Aka/jAw/CEw3AUa/jQw/Ckw3A0a/jIw/CUw3AMa/jYw/C0w3Asa/jEw/CMw3Aca/jUw/Csw3A8a/jMw/CcwPAAa/lfvf9/w/xppw4OgYQADwwACw0OgYUADw4ACw8OgYSADw0ACwyOgYWADw8ACw6OgYRADwyACw2OgYVADw6ACw+OgYTADw2ACwxOgYXADw+ACw5OgYQgDwxACw1OgYUgDw5ACw9OgYSgDw1ACwzOgYWgDw9ACw7OgYRgDwzACw3OgYVgDw7ACw/OgYTgDw3ACwwugYXgDw/ACw4ugYQQDwwgCw0ugYUQDw4gCw8ugYSQDw0gCwyugYWQDw8gCw6ugYRQDwygCw2ugYVQDw6gCw+ugYTQDw2gCwxugYXQDw+gCw5ugYQwDwxgCw1ugYUwDw5gCw9ugYSwDw1gCwzugYWwDw9gCw7ugYRwDwzgCw3ugYVwDw7gCw/ugYTwDw3gCwwegYXwDw/gCw4egYQIDwwQCw0egYUIDw4QCw8egYSIDw0QCwyegYWIDw8QCw6egYRIDwyQCw2egYVIDw6QCw+egYTIDw2QCwxegYXIDw+QCw5egYQoDwxQCw1egYUoDw5QCw9egYSoDw1QCwzegYWoDw9QCw7egYRoDwzQCw3egYVoDw7QCw/egYToDw3QCww+gYXoDw/QCw4+gYQYDwwwCw0+gYUYDw4wCw8+gYSYDw0wCwy+gYWYDw8wCw6+gYRYDwywCw2+gYVYDw6wCw++gYTYDw2wCwx+gYXYDw+wCw5+gYQ4DwxwCw1+gYU4Dw5wCw9+gYS4Dw1wCwz+gYW4Dw9wCw7+gYR4DwzwCw3+gYV4Dw7wCw/9Kcob5DAzzCQwDgIb5DQzzCwwDgoYFDAwLCAwDgYYFDQwLCgwDg4aFDAwLCQyDgIaFDQwLCwyDgoZFDAyLCAyDgYZFDQyLCgyDg4bFDAyLCQxDgIbFDQyLCwxDgoYlDAxLCAxDgYYlDQxLCgxDg4alDAxLCQzDgIalDQxLCwzDgoZlDAzLCAzDgYZlDQzLCgzDg4blDAzLCQwjgIblDQzLCwwjgoYVDAwrCAwjgYYVDQwrCgwjg4aVDAwrCQyjgIaVDQwrCwyjgoZVDAyrCAyjgYZVDQyrCgyjg4bVDAyrCQxjgIbVDQyrCwxjgoY1DAxrCAxjgYY1DQxrCgxjg4a1DAxrCQzjgIa1DQxrCwzjgoZ1DAzrCAzjgYZ1DQzrCgzjg4b1DAzrCQwTgIb1DQzrCwwTgoYNDAwbCAwTgYYNDQwbCgwTg4aNDAwbCQyTgIaNDQwbCwyTgoZNDAybCAyTgYZNDQybCgyTg4bNDAybCQxTgIbNDQybCwxTgoYtDAxbCAxTgYYtDQxbCgxTg4atDAxbCQzTgIatDQxbCwzTgoZtDAzbCAzTgYZtDQzbCgzTg4btDAzbCQwzgIbtDQzbCwwzgoYdDAw7CAwzgYYdDQw7Cgwzg4adDAw7CQyzgIadDQw7CwyzgoZdDAy7CAyzgYZdDQy7Cgyzg4bdDAy7CQxzgIbdDQy7CwxzgoY9DAx7CAxzgYY9DQx7Cgxzg4a9DAx7CQzzgIa9DQx7CwzzgoZ9DAz7CAzzgYZ9DQz7Cgzzg4b9DAz7CQwLgIb9DQz7CwwLgoYDDAwHCAwLgYYDDQwHCgwLg4aDDAwHCQyLgIaDDQwHCwyLgoZDDAyHCAyLgYZDDQyHCgyLg4bDDAyHCQxLgIbDDQyHCwxLgoYjDAxHCAxLgYYjDQxHCgxLg4ajDAxHCQzLgIajDQxHCwzLgoZjDAzHCAzLgYZjDQzHCgzLg4bjDAzHCQwrgIbjDQzHCwwrgoYTDAwnCAwrgYYTDQwnCgwrg4aTDAwnCQyrgIaTDQwnCwyrgoZTDAynCAyrgYZTDQynCgyrg4bTDAynCQxrgIbTDQynCwxrgoYzDAxnCAxrgYYzDQxnCgxrg4azDAxnCQzrgIazDQxnCwzrgoZzDAznCAzrgYZzDQznCgzrg4bzDAznCQwbgIbzDQznCwwbgoYLDAwXCAwbgYYLDQwXCgwbg4aLDAwXCQybgIaLDQwXCwybgoZLDAyXCAybgYZLDQyXCgybg4bLDAyXCQxbgIbLDQyXCwxbgoYrDAxXCAxbgYYrDQxXCgxbg4arDAxXCQzbgIarDQxXCwzbgoZr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DYcYGA4RGJYADYcaGA4VGJYEDYcZGA4TGJYCDYcbGA4XGJYGDUcYGI4QGJYBDUcaGI4UGJYFDUcZGI4SGJYDDUcbGI4WGJYHDccYGI4RGFYADccaGI4VGFYEDccZGI4TGFYCDccbGI4XGFYGDScYGE4QGFYBDScaGE4UGFYFDScZGE4SGFYDDScbGE4WGFYHDacYGE4RGNYADacaGE4VGNYEDacZGE4TGNYCDacbGE4XGNYGDWcYGM4QGNYBDWcaGM4UGNYFDWcZGM4SGNYDDWcbGM4WGNYHDecYGM4RGDYADecaGM4VGDYEDecZGM4TGDYCDecbGM4XGDYGDRcYGC4QGDYBDRcaGC4UGDYFDRcZGC4SGDYDDRcbGC4WGDYHDZcYGC4RGLYADZcaGC4VGLYEDZcZGC4TGLYCDZcbGC4XGLYGDVcYGK4QGLYBDVcaGK4UGLYFDVcZGK4SGLYDDVcbGK4WGLYHDdcYGK4RGHYADdcaGK4VGHYEDdcZGK4TGHYCDdcbGK4XGHYGDTcYGG4QGHYBDTcaGG4UGHYFDTcZGG4SGHYDDTcbGG4WGHYHDbcYGG4RGPYADbcaGG4VGPYEDbcZGG4TGPYCDbcbGG4XGPYGDXcYGO4QGPYBDXcaGO4UGPYFDXcZGO4SGPYDDXcbGO4WGPYHDfcYGO4RGA4ADfcaGO4VGA4EDfcZGO4TGA4CDfcbGO4XGA4GDQ8YGB4QGA4BDQ8aGB4UGA4FDQ8ZGB4SGA4DDQ8bGB4WGA4HDY8YGB4RGI4ADY8aGB4VGI4EDY8ZGB4TGI4CDY8bGB4XGI4GDU8YGJ4QGI4BDU8aGJ4UGI4FDU8ZGJ4SGI4DDU8bGJ4WGI4HDc8YGJ4RGE4ADc8aGJ4VGE4EDc8ZGJ4TGE4CDc8bGJ4XGE4GDS8YGF4QGE4BDS8aGF4UGE4FDS8ZGF4SGE4DDS8bGF4WGE4HDa8YGF4RGM4ADa8aGF4VGM4EDa8ZGF4TGM4CDa8bGF4XGM4GDW8YGN4QGM4BDW8aGN4UGM4FDW8ZGN4SGM4DDW8bGN4WGM4HDe8YGN4RGC4ADe8aGN4VGC4EDe8ZGN4TGC4CDe8bGN4XGC4GDR8YGD4QGC4BDR8aGD4UGC4FDR8ZGD4SGC4DDR8bGD4WGC4HDZ8YGD4RGK4ADZ8aGD4VGK4EDZ8ZGD4TGK4CDZ8bGD4XGK4GDV8YGL4QGK4BDV8aGL4UGK4FDV8ZGL4SGK4DDV8bGL4WGK4HDd8YGL4RGG4ADd8aGL4VGG4EDd8ZGL4TGG4CDd8bGL4XGG4GDT8YGH4QGG4BDT8aGH4UGG4FDT8ZGH4SGG4DDT8bGH4WGG4HDb8YGH4RGO4ADb8aGH4VGO4EDb8ZGH4TGO4CDb8bGH4XGO4GDX8YGP4QGO4BDX8aGP4UGO4FDX8ZGP4SGO4DDX8bGP4WGO4HDf8YGP4RGB4ADf8aGP4VGB4EDf8ZGP4TGB4CDf9r+r9v+H+NtOFh0DCAgWEAgeER0DCggWFAgeFR0DCQgWEggeEx0DCwgWFggeFx0DCIgWEQgeEJ0DCogWFQgeFJ0DCYgWEwgeEp0DC4gWFwgeFp0DCEgWEIgeEZ0DCkgWFIgeFZ0DCUgWEogeE50DC0gWFogeF50DCMgWEYgeEF0DCsgWFYgeFF0DCcgWE4geEl0DC8gWF4geFl0DCCgWEEgeEV0DCigWFEgeFV0DCSgWEkgeE10DCygWFkgeF10DCKgWEUgeEN0DCqgWFUgeFN0DCagWE0geEt0DC6gWF0geFt0DCGgWEMgeEd0DCmgWFMgeFd0DCWgWEsgeE90DC2gWFsgeF90DCOgWEcgeED0DCugWFcgeFD0DCegWE8geEj0DC+gWF8geFj0DCBgWECgeET0DChgWFCgeFT0DCRgWEigeEz0DCxgWFigeFz0DCJgWESgeEL0DCpgWFSgeFL0DCZgWEygeEr0DC5gWFygeFr0DCFgWEKgeEb0DClgWFKgeFb0DCVgWEqgeE70DC1gWFqgeF70DCNgWEageEH0DCtgWFageFH0DCdgWE6geEn0DC9gWF6geFn0DCDgWEGgeEX0DCjgWFGgeFX0DCTgWEmgeE30DCzgWFmgeF30DCLgWEWgeEP0DCrgWFWgeFP0DCbgWE2geEv0DC7gWF2geFv0DCHgWEOgeEf0DCngWFOgeFf0DCXgWEugeE/0DC3gWFugeF/FTjDPAaGeQSGAUDDvAaGeQWGAUHDfAaG+QSGgUDD/AaG+QWGgUHDAgaGBQSGQUDDggaGBQWGQUHDQgaGhQSGwUDDwgaGhQWGwUHDIgaGRQSGIUDDogaGRQWGIUHDYgaGxQSGoUDD4gaGxQWGoUHDEgaGJQSGYUDDkgaGJQWGYUHDUgaGpQSG4UDD0gaGpQWG4UHDMgaGZQSGEUDDsgaGZQWGEUHDcgaG5QSGkUDD8gaG5QWGkUHDCgaGFQSGUUDDigaGFQWGUUHDSgaGlQSG0UDDygaGlQWG0UHDKgaGVQSGMUDDqgaGVQWGMUHDagaG1QSGsUDD6gaG1QWGsUHDGgaGNQSGcUDDmgaGNQWGcUHDWgaGtQSG8UDD2gaGtQWG8UHDOgaGdQSGCUDDugaGdQWGCUHDegaG9QSGiUDD+gaG9QWGiUHDBgaGDQSGSUDDhgaGDQWGSUHDRgaGjQSGyUDDxgaGjQWGyUHDJgaGTQSGKUDDpgaGTQWGKUHDZgaGzQSGqUDD5gaGzQWGqUHDFgaGLQSGaUDDlgaGLQWGaUHDVgaGrQSG6UDD1gaGrQWG6UHDNgaGbQSGGUDDtgaGbQWGGUHDdgaG7QSGmUDD9gaG7QWGmUHDDgaGHQSGWUDDjgaGHQWGWUHDTgaGnQSG2UDDzgaGnQWG2UHDLgaGXQSGOUDDrgaGXQWGOUHDbgaG3QSGuUDD7gaG3QWGuUHDHgaGPQSGeUDDngaGPQWGeUHDXgaGvQSG+UDD3gaGvQWG+UHDPgaGfQSGBUDDvgaGfQWGBUHDfgaG/QSGhUDD/gaG/QWGhUHDAQaGAwSGRUDDgQaGAwWGRUHDQQaGgwSGxUDDwQaGgwWGxUHDIQaGQwSGJUDDoQaGQwWGJUHDYQaGwwSGpUDD4QaGwwWGpUHDEQaGIwSGZUDDkQaGIwWGZUHDUQaGowSG5UDD0QaGowWG5UHDMQaGYwSGFUDDsQaGYwWGFUHDcQaG4wSGlUDD8QaG4wWGlUHDCQaGEwSGVUDDiQaGEwWGVUHDSQaGkwSG1UDDyQaGkwWG1UHDKQaGUwSGNUDDqQaGUwWGNUHDaQaG0wSGtUDD6QaG0wWGtUHDGQaGMwSGdUDDmQaGMwWGdUHDWQaGswSG9UDD2QaGswWG9UHDOQaGcwSGDUDDuQaGcwWGDUHDeQaG8wSGjUDD+QaG8wWGjUHDBQaGCwSGTUDDhQaGCwWGTUHDRQaGiwSGzUDDxQaGiwWGzUHDJQaGSwSGLUDDpQaGSwWGLUHDZQaGywSGrUDD5QaGywWGrUHDFQaGKwSGbUDDlQaGKwWGbUHDVQaGqwSG7UDD1QaGqwWG7UHDNQaGawSGHUDDtQaGawWGHUHDdQaG6wSGnUDD9QaG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BQ1bGRi2EhimAw1bGxi2FhimBw3bGBi2ERhmAA3bGhi2FRhmBA3bGRi2ExhmAg3bGxi2FxhmBg07GBh2EBhmAQ07Ghh2FBhmBQ07GRh2EhhmAw07Gxh2FhhmBw27GBh2ERjmAA27Ghh2FRjmBA27GRh2ExjmAg27Gxh2FxjmBg17GBj2EBjmAQ17Ghj2FBjmBQ17GRj2EhjmAw17Gxj2FhjmBw37GBj2ERgWAA37Ghj2FRgWBA37GRj2ExgWAg37Gxj2FxgWBg0HGBgOEBgWAQ0HGhgOFBgWBQ0HGRgOEhgWAw0HGxgOFhgWBw2HGBgOERiWAA2HGhgOFRiWBA2HGRgOExiWAg2HGxgOFxiWBg1HGBiOEBiWAQ1HGhiOFBiWBQ1HGRiOEhiWAw1HGxiOFhiWBw3HGBiOERhWAA3HGhiOFRhWBA3HGRiOExhWAg3HGxiOFxhWBg0nGBhOEBhWAQ0nGhhOFBhWBQ0nGRhOEhhWAw0nGxhOFhhWBw2nGBhOERjWAA2nGhhOFRjWBA2nGRhOExjWAg2nGxhOFxjWBg1nGBjOEBjWAQ1nGhjOFBjWBQ1nGRjOEhjWAw1nGxjOFhjWBw3nGBjOERg2AA3nGhjOFRg2BA3nGRjOExg2Ag3nGxjOFxg2Bg0XGBguEBg2AQ0XGhguFBg2BQ0XGRguEhg2Aw0XGxguFhg2Bw2XGBguERi2AA2XGhguFRi2BA2XGRguExi2Ag2XGxguFxi2Bg1XGBiuEBi2AQ1XGhiuFBi2BQ1XGRiuEhi2Aw1XGxiuFhi2Bw3XGBiuERh2AA3XGhiuFRh2BA3XGRiuExh2Ag3XGxiuFxh2Bg03GBhuEBh2AQ03GhhuFBh2BQ03GRhuEhh2Aw03GxhuFhh2Bw23GBhuERj2AA23GhhuFRj2BA23GRhuExj2Ag23GxhuFxj2Bg13GBjuEBj2AQ13GhjuFBj2BQ13GRjuEhj2Aw13GxjuFhj2Bw33GBjuERgOAA33GhjuFRgOBA33GRjuExgOAg33GxjuFxgOBg0PGBgeEBgOAQ0PGhgeFBgOBQ0PGRgeEhgOAw0PGxgeFhgOBw2PGBgeERiOAA2PGhgeFRiOBA2PGRgeExiOAg2PGxgeFxiOBg1PGBieEBiOAQ1PGhieFBiOBQ1PGRieEhiOAw1PGxieFhiOBw3PGBieERhOAA3PGhieFRhO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hlMFhjVBw2kGhtMEhrVAw+kGhtMFhrVBwxkGhjMEhnVAw5kGhjMFhnVBw1kGhrMEhvVAw9kGhrMFhvVBwzkGhnMEhg1Aw7kGhnMFhg1Bw3kGhvMEho1Aw/kGhvMFho1BwwUGhgsEhk1Aw4UGhgsFhk1Bw0UGhosEhs1Aw8UGhosFhs1BwyUGhksEhi1Aw6UGhksFhi1Bw2UGhssEhq1Aw+UGhssFhq1BwxUGhisEhm1Aw5UGhisFhm1Bw1UGhqsEhu1Aw9UGhqsFhu1BwzUGhmsEhh1Aw7UGhmsFhh1Bw3UGhusEhp1Aw/UGhusFhp1Bww0GhhsEhl1Aw40GhhsFhl1Bw00GhpsEht1Aw80GhpsFht1Bwy0GhlsEhj1Aw60GhlsFhj1Bw20GhtsEhr1Aw+0GhtsFhr1Bwx0GhjsEhn1Aw50GhjsFhn1Bw10GhrsEhv1Aw90GhrsFhv1Bwz0GhnsEhgNAw70GhnsFhgNBw30GhvsEhoNAw/0GhvsFhoNBwwMGhgcEhkNAw4MGhgcFhkNBw0MGhocEhsNAw8MGhocFhsNBwyMGhkcEhiNAw6MGhkcFhiNBw2MGhscEhqNAw+MGhscFhqNBwxMGhicEhmNAw5MGhicFhmNBw1MGhqcEhuNAw9MGhqcFhuNBwzMGhmcEhhNAw7MGhmcFhhNBw3MGhucEhpNAw/MGhucFhpNBwwsGhhcEhlNAw4sGhhcFhlNBw0sGhpcEhtNAw8sGhpcFhtNBwysGhlcEhjNAw6sGhlcFhjNBw2sGhtcEhrNAw+sGhtcFhrNBwxsGhjcEhnNAw5sGhjcFhnNBw1sGhrcEhvNAw9sGhrcFhvNBwzsGhncEhgtAw7sGhncFhgtBw3sGhvcEhotAw/sGhvcFhotBwwcGhg8EhktAw4cGhg8FhktBw0cGho8EhstAw8cGho8FhstBwycGhk8EhitAw6cGhk8FhitBw2cGhs8EhqtAw+cGhs8FhqtBwxcGhi8EhmtAw5cGhi8FhmtBw1cGhq8EhutAw9cGhq8FhutBwzcGhm8EhhtAw7cGhm8FhhtBw3cGhu8EhptAw/cGhu8FhptBww8Ghh8EhltAw48Ghh8FhltBw08Ghp8EhttAw88Ghp8FhttBwy8Ghl8EhjtAw68Ghl8FhjtBw28Ght8EhrtAw+8Ght8FhrtBwx8Ghj8EhntAw58Ghj8FhntBw18Ghr8EhvtAw98Ghr8FhvtBwz8Ghn8EhgdAw78Ghn8FhgdBw38Ghv8EhodAw/9a/e8b/l8jbXgYNAxgYBhAYHgENAxoYBhQYHgUNAxkYBhIYHgMNAxsYBhYYHgcNAxiYBhEYHgCNAxqYBhUYHgSNAxmYBhMYHgKNAxuYBhcYHgaNAxhYBhCYHgGNAxpYBhSYHgWNAxlYBhKYHgONAxtYBhaYHgeNAxjYBhGYHgBNAxrYBhWYHgRNAxnYBhOYHgJNAxvYBheYHgZNIxgYBhBYHgFNIxoYBhRYHgVNIxkYBhJYHgNNIxsYBhZYHgdNIxiYBhFYHgDNIxqYBhVYHgTNIxmYBhNYHgLNIxuYBhdYHgbNIxhYBhDYHgHNIxpYBhTYHgXNIxlYBhLYHgPNIxtYBhbYHgfNIxjYBhHYPgANIxrYBhXYPgQNIxnYBhPYPgINIxvYBhfYPgYNExgYJhAYPgENExoYJhQYPgUNExkYJhIYPgMNExsYJhYYPgcNExiYJhEYPgCNExqYJhUYPgSNExmYJhMYPgKNExuYJhcYPgaNExhYJhCYPgGNExpYJhSYPgWNExlYJhKYPgONExtYJhaYPgeNExjYJhGYPgBNExrYJhWYPgRNExnYJhOYPgJNExvYJheYPgZNMxgYJhBYPgFNMxoYJhRYPgVNMxkYJhJYPgNNMxsYJhZYPgdNMxiYJhFYPgDNMxqYJhVYPgTNMxmYJhNYPgLNMxuYJhdYPgbNMxhYJhDYPgHNMxpYJhTYPgXNMxlYJhLYPgPNMxtYJhbYPhfVc4wj4FhHoFhANAwr4FhXoFhQNAwn4FhPoFhINAwv4FhfoFhYNCwgIFhAYFhENCwoIFhQYFhUNCwkIFhIYFhMNCwsIFhYYFhcNCwiIFhEYFhCNCwqIFhUYFhSNCwmIFhMYFhKNCwuIFhcYFhaNCwhIFhCYFhGNCwpIFhSYFhWNCwlIFhKYFhONCwtIFhaYFheNCwjIFhGYFhBNCwrIFhWYFhRNCwnIFhOYFhJNCwvIFheYFhZNCwgoFhBYFhFNCwooFhRYFhVNCwkoFhJYFhNNCwsoFhZYFhdNCwioFhFYFhDNCwqoFhVYFhTNCwmoFhNYFhLNCwuoFhdYFhbNCwhoFhDYFhHNCwpoFhTYFhXNCwloFhLYFhPNCwtoFhbYFhfNCwjoFhHYFhAtCwroFhXYFhQtCwnoFhPYFhItCwvoFhfYFhYtCwgYFhA4FhEtCwoYFhQ4FhUtCwkYFhI4FhMtCwsYFhY4FhctCwiYFhE4FhCtCwqYFhU4FhStCwmYFhM4FhKtCwuYFhc4FhatCwhYFhC4FhGtCwpYFhS4FhWtCwlYFhK4FhOtCwtYFha4FhetCwjYFhG4FhBtCwrYFhW4FhRtCwnYFhO4FhJtCwvYFhe4FhZtCwg4FhB4FhFtCwo4FhR4FhVtCwk4FhJ4FhNtCws4FhZ4FhdtCwi4FhF4FhDtCwq4FhV4FhTtCwm4FhN4FhLtCwu4Fhd4FhbtCwh4FhD4FhHtCwp4FhT4FhXtCwl4FhL4FhPtCwt4Fhb4FhftCwj4FhH4FhAdCwr4FhX4FhQdCwn4FhP4FhIdCwv4Fhf4FhYdBwgIHhAIFhEdBwoIHhQIFhUdBwkIHhIIFhMdBwsIHhYIFhcdBwiIHhEIFhCdBwqIHhUIFhSdBwmIHhMIFhKdBwuIHhcIFhadBwhIHhCIFhGdBwpIHhSIFhWdBwlIHhKIFhOdBwtIHhaIFhedBwjIHhGIFhBdBwrIHhWIFhRdBwnIHhOIFhJdBwvIHheIFhZdBwgoHhBIFhFdBwooHhRIFhVdBwkoHhJIFhNdBwsoHhZIFhddBwioHhFIFhDdBwqoHhVIFhTdBwmoHhNIFhLdBwuoHhdIFhbdBwhoHhDIFhHdBwpoHhTIFhXdBwloHhLIFhPdBwtoHhbIFhfdBwjoHhHIFhA9BwroHhXIFhQ9BwnoHhPIFhI9BwvoHhfIFhY9BwgYHhAoFhE9BwoYHhQoFhU9BwkYHhIoFhM9BwsYHhYoFhc9BwiYHhEoFhC9BwqYHhUoFhS9BwmYHhMoFhK9BwuYHhcoFha9BwhYHhCoFhG9BwpYHhSoFhW9BwlYHhKoFhO9BwtYHhaoFhe9BwjYHhGoFhB9BwrYHhWoFhR9BwnYHhOoFhJ9BwvYHheoFhZ9Bwg4HhBoFhF9Bwo4HhRoFhV9Bwk4HhJoFhN9Bws4HhZoFhd9Bwi4HhFoFhD9Bwq4HhVoFhT9Bwm4HhNoFhL9Bwu4HhdoFhb9Bwh4HhDoFhH9Bwp4HhToFhX9Bwl4HhLoFhP9Bwt4HhboFhf9Bwj4HhHoHhANBwr4HhXoHhQNBwn4HhPoHhINBwv4HhfoHhYNDwgIHhAYHhENDwoIHhQYHhUNDwkIHhIYHhMNDwsIHhYYHhcNDwiIHhEYHhCNDwqIHhUYHhSNDwmIHhMYHhKNDwuIHhcYHhaNDwhIHhCYHhGNDwpIHhSYHhWNDwlIHhKYHhONDwtIHhaYHheNDwjIHhGYHhBNDwrIHhWYHhRNDwnIHhOYHhJNDwvIHheYHhZNDwgoHhBYHhFNDwooHhRYHhVNDwkoHhJYHhNNDwsoHhZYHhdNDwioHhFYHhDNDwqoHhVYHhTNDwmoHhNYHhLNDwuoHhdYHhbNDwhoHhDYHhHNDwpoHhTYHhXNDwloHhLYHhPNDwtoHhbYHhfNDwjoHhHYHhAtDwroHhXYHhQtDwnoHhPYHhItDwvoHhfYHhYtDwgYHhA4HhEtDwoYHhQ4HhUtDwkYHhI4HhMtDwsYHhY4HhctDwiYHhE4HhCtDwqYHhU4HhStDwmYHhM4HhKtDwuYHhc4HhatDwhYHhC4HhGtDwpYHhS4HhWtDwlYHhK4HhOtDwtYHha4HhetDwjYHhG4HhBtDwrYHhW4HhRtDwnYHhO4HhJtDwvYHhe4HhZtDwg4HhB4HhFtDwo4HhR4HhVtDwk4HhJ4HhNtDws4HhZ4HhdtDwi4HhF4HhDtDwq4HhV4HhTtDwm4HhN4HhLtDwu4Hhd4HhbtDwh4HhD4HhHtDwp4HhT4HhXtDwl4HhL4HhPtDwt4Hhb4HhftDwj4HhH4HhAdDwr4HhX4HhQdDwn4HhP4HhIdDwv9b/+4b/10gbHgYNAxgYBhAYHgENAxoYBhQYHgUNAxkYBhIYHgMNAxsYBhYYHgcNgxgYBhEYngANgxoYBhUYngQNgxkYBhMYngINgxsYBhcYngYNQxgYhhAYngENQxoYhhQYngUNQxkYhhIYngMNQxsYhhYYngcNwxgYhhEYXgANwxoYhhUYXgQNwxkYhhMYXgINwxsYhhcYXgYNIxgYRhAYXgENIxoYRhQYXgUNIxkYRhIYXgMNIxsYRhYYXgcNoxgYRhEY3gANoxoYRhUY3gQNoxkYRhMY3gINoxsYRhcY3gYNYxgYxhAY3gENYxoYxhQY3gUNYxkYxhIY3gMNYxsYxhYY3gcN4xgYxhEYPgAN4xoYxhUYPgQN4xkYxhMYPgIN4xsYxhcYPgYNExgYJhAYPgENExoYJhQYPgUNExkYJhIYPgMNExsYJhYYPgcNkxgYJhEYvgANkxoYJhUYvgQNkxkYJhMYvgINkxsYJhcYvgYNUxgYphAYvgENUxoYphQYvgUNUxkYphIYvgMNUxsYphYYvgcN0xgYphEYfgAN0xoYphUYfgQN0xkYphMYfgIN0xsYphcYfgYNMxgYZhAYfgENMxoYZhQYfgUNMxkYZhIYfgMNMxsYZhYYfgcNsxgYZhEY/gANsxoYZhUY/gQNsxkYZhMY/gINsxsYZhcY/gYNcxgY5hAY/gENcxoY5hQY/gUNcxkY5hIY/gMNcxsY5hYY/leNM8xjYJhHYBgANMxrYJhXYBgQNMxnYJhPYBgINMxvYJhfYBgYNCxgYFhAYBgENCxoYFhQYBgUNCxkYFhIYBgMNCxsYFhYYBgcNCxiYFhEYBgCNCxqYFhUYBgSNCxmYFhMYBgKNCxuYFhcYBgaNCxhYFhCYBgGNCxpYFhSYBgWNCxlYFhKYBgONCxtYFhaYBgeNCxjYFhGYBgBNCxrYFhWYBgRNCxnYFhOYBgJNCxvYFheYBgZNKxgYFhBYBgFNKxoYFhRYBgVNKxkYFhJYBgNNKxsYFhZYBgdNKxiYFhFYBgDNKxqYFhVYBgTNKxmYFhNYBgLNKxuYFhdYBgbNKxhYFhDYBgHNKxpYFhTYBgXNKxlYFhLYBgPNKxtYFhbYBgfNKxjYFhHYJgANKxrYFhXYJgQNKxnYFhPYJgINKxvYFhfYJgYNGxgYNhAYJgENGxoYNhQYJgUNGxkYNhIYJgMNGxsYNhYYJgcNGxiYNhEYJgCNGxqYNhUYJgSNGxmYNhMYJgKNGxuYNhcYJgaNGxhYNhCYJgGNGxpYNhSYJgWNGxlYNhKYJgONGxtYNhaYJgeNGxjYNhGYJgBNGxrYNhWYJgRNGxnYNhOYJgJNGxvYNheYJgZNOxgYNhBYJgFNOxoYNhRYJgVNOxkYNhJYJgNNOxsYNhZYJgdNOxiYNhFYJgDNOxqYNhVYJgTNOxmYNhNYJgLNOxuYNhdYJgbNOxhYNhDYJgHNOxpYNhTYJgXNOxlYNhLYJgPNOxtYNhbYJgfNOxjYNhHYFgANOxrYNhXYFgQNOxnYNhPYFgINOxvYNhfYFgYNBxgYDhAYFgENBxoYDhQYFgUNBxkYDhIYFgMNBxsYDhYYFgcNBxiYDhEYFgCNBxqYDhUYFgSNBxmYDhMYFgKNBxuYDhcYFgaNBxhYDhCYFgGNBxpYDhSYFgWNBxlYDhKYFgONBxtYDhaYFgeNBxjYDhGYFgBNBxrYDhWYFgRNBxnYDhOYFgJNBxvYDheYFgZNJxgYDhBYFgFNJxoYDhRYFgVNJxkYDhJYFgNNJxsYDhZYFgdNJxiYDhFYFgDNJxqYDhVYFgTNJxmYDhNYFgLNJxuYDhdYFgbNJxhYDhDYFgHNJxpYDhTYFgXNJxlYDhLYFgPNJxtYDhbYFgfNJxjYDhHYNgANJxrYDhXYNgQNJxnYDhPYNgINJxvYDhfYNgYNFxgYLhAYNgENFxoYLhQYNgUNFxkYLhIYNgMNFxsYLhYYNgcNFxiYLhEYNgCNFxqYLhUYNgSNFxmYLhMYNgKNFxuYLhcYNgaNFxhYLhCYNgGNFxpYLhSYNgWNFxlYLhKYNgONFxtYLhaYNgeNFxjYLhGYNgBNFxrYLhWYNgRNFxnYLhOYNgJNFxvYLheYNgZNNxgYLhBYNgFNNxoYLhRYNgVNNxkYLhJYNgNNNxsYLhZYNgdNNxiYLhFYNgDNNxqYLhVYNgTNNxmYLhNYNgLNNxuYLhdYNgbNNxhYLhDYNgHNNxpYLhTYNgXNNxlYLhLYNgPNNxtYLhbYNgfNNxjYLhHYDgANNxrYLhXYDgQNNxnYLhPYDgINNxvYLhfYDgYNDxgYHhAYDgENDxoYHhQYDgUNDxkYHhIYDgMNDxsYHhYYDgcNDxiYHhEYDgCNDxqYHhUYDgSNDxmYHhMYDgKNDxuYHhcYDgaNDxhYHhCYDgGNDxpYHhSYDgWNDxlYHhKYDgONDxtYHhaYDgeNDxjYHhGYDgBNDxrYHhWYDgRNDxnYHhOYDgJNDxvYHheYDgZNLxgYHhBYDgFNLxoYHhRYDgVNLxkYHhJYDgNNLxsYHhZYDgdNLxiYHhFYDgDNLxqYHhVYDgTNLxmYHhNYDgLNLxuYHhdYDgbNLxhYHhDYDgHNLxpYHhTYDgXNLxlYHhLYDgPNLxtYHhbYDgfNLxjYHhHYLgANLxrYHhXYLgQNLxnYHhPYLgINLxvYHhfYLgYNHxgYPhAYLgENHxoYPhQYLgUNHxkYPhIYLgMNHxsYPhYYLgcNHxiYPhEYLgCNHxqYPhUYLgSNHxmYPhMYLgKNHxuYPhcYLgaNHxhYPhCYLgGNHxpYPhSYLgWNHxlYPhKYLgONHxtYPhaYLgeNHxjYPhGYLgBNHxrYPhWYLgRNHxnYPhOYLgJNHxvYPheYLgZNPxgYPhBYLgFNPxoYPhRYLgVNPxkYPhJYLgNNPxsYPhZYLgdNPxiYPhFYLgDNPxqYPhVYLgTNPxmYPhNYLgLNPxuYPhdYLgbNPxhYPhDYLgHNPxpYPhTYLgXNPxlYPhLYLgPNPxtYPhbYLgfNPxjYPhHYHgANPxrYPhXYHgQNPxnYPhPYHgINPyvzf++4f810oaHQcMABoYBBIZHQMOABoYBBYZHQcNABoaBBIbHQMPABoaBBYbHQcMgBoZBBIYnQMOgBoZBBYYnQcNgBobBBIanQMPgBobBBYanQcMQBoYhBIZnQMOQBoYhBYZnQcNQBoahBIbnQMPQBoahBYbnQcMwBoZhBIYXQMOwBoZhBYYXQcNwBobhBIaXQMPwBobhBYaXQcMIBoYRBIZXQMOIBoYRBYZXQcNIBoaRBIbXQMPIBoaRBYbXQcMoBoZRBIY3QMOoBoZRBYY3QcNoBobRBIa3QMPoBobRBYa3QcMYBoYxBIZ3QMOYBoYxBYZ3QcNYBoaxBIb3QMPYBoaxBYb3QcM4BoZxBIYPQMO4BoZxBYYPQcN4BobxBIaPQMP4BobxBYaPQcMEBoYJBIZPQMOEBoYJBYZPQcNEBoaJBIbPQMPEBoaJBYbPQcMkBoZJBIYvQMOkBoZJBYYvQcNkBobJBIavQMPkBobJBYavQcMUBoYpBIZvQMOUBoYpBYZvQcNUBoapBIbvQMPUBoapBYbvQcM0BoZpBIYfQMO0BoZpBYYfQcN0BobpBIafQMP0BobpBYafQcMMBoYZBIZfQMOMBoYZBYZfQcNMBoaZBIbfQMPMBoaZBYbfQcMsBoZZBIY/QMOsBoZZBYY/QcNsBobZBIa/QMPsBobZBYa/QcMcBob5qvCG/4JxhjkNDIvkERgm4wxzGRjmEOzyH3CXc/+PGxb7fwz/7/n/P/f/69x5uLkzKOb+L/x///2/d0zB5wYIzxnmNdi/vIL9Cwga5nP4lgoMA4GG+Q0M8wsMA4OGBQwMCwgMg4CGBQ0MCwoMg4KGhQwMCwkMg4GGhQ0MCwsMg4OGRRz+zwSGIUDDogaGRQWGIUHDYgaGxQSGoUDD4gaGxQWGoUHDEgaGJQSGYUDDkgaGJQWGYUHDUgaGpQSG4UDD0gaGpQWG4UHDMgaGZQSGEUDDsgaGZQWGEUHDcgaG5QSGkUDD8gaG5QWGkUHDCgaGFQSGUUDDigaGFQWGUUHDSgaGlQSG0UDDygaGlQWG0UHDKgaGVQSGMUDDqgaGVQWGMUHDagaG1QSGsUDD6gaG1QWGsUHDGgaGNQSGcUDDmgaGNQWGcUHDWgaGtQSG8UDD2gaGtQWG8UHDOgaGdQSGCUDDugaGdQWGCUHDegaG9QSGiUDD+gaG9QWGiUHDBgaGDQSGSUDDhgaGDQWGSUHDRgaGjQSGyUDDxgaGjQWGyUHDJgaGTQSGKUDDpgaGTQWGKUHDZgaGzQSGqUDD5gaGzQWGqUHDFgaGLQSGaUDDlgaGLQWGaUHDVgaGrQSG6UDD1gaGrQWG6UHDNgaGbQSGGUDDtgaGbQWGGUHDdgaG7QSGmUDD9gaG7QWGmUHDDgaGHQSGWUDDjgaGHQWGWUHDTgaGnQSG2UDDzgaGnQWG2UHDLgaGXQSGOUDDrgaGXQWGOUHDbgaG3QSGuUDD7gaG3QWGuUHDHgaGPQSGeUDDngaGPQWGeUHDXgaGvQSG+UDD3gaGvQWG+UHDPgaGfQSGBUDDvgaGfQWGBUHDfgaG/QSGhUDD/gaG/QWGhUHDAQaGAwSGRUDDgQaGAwWGRUHDQQaGgwSGxUDDwQaGgwWGxUHDIQaGQwSGJUDDoQaGQwWGJUHDYQaGwwSGpUDD4QaGwwWGpUHDEQaGIwSGZUDDkQaGIwWGZUHDUQaGowSG5UDD0QaGowWG5UHDMQaGYwSGFUDDsQaGYwWGFUHDcQaG4wSGlUDD8QaG4wWGlUHDCQaGEwSGVUDDiQaGEwWGVUHDSQaGkwSG1UDDyQaGkwWG1UHDKQaGUwSGNUDDqQaGUwWGNUHDaQaG0wSGtUDD6QaG0wWGtUHDGQaGMwSGdUDDmQaGMwWGdUHDWQaGswSG9UDD2QaGswWG9UHDOQaGcwSGDUDDuQaGcwWGDUHDeQaG8wSGjUDD+QaG8wWGjUHDBQaGCwSGTUDDhQaGCwWGTUHDRQaGiwSGzUDDxQaGiwWGzUHDJQaGSwSGLUDDpQaGSwWGLUHDZQaGywSGrUDD5QaGywWGrUHDFQaGKwSGbUDDlQaGKwWGbUHDVQaGqwSG7UDD1QaGqwWG7UHDNQaGawSGHUDDtQaGawWGHUHDdQaG6wSGnUDD9QaG6wWGnUHDDQaGGwSGXUDD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TjAwnCAwrAIaTjQwnCgwrAoaTjIwnCQwrAYaTjYwnCwwrA4aTjEwnCIwrAEaTjUwnCowrAkaTjMwnCYwrAUaTjcwnC4wrA0azjAwnCEwrAMazjQwnCkwrAsazjIwnCUwrAcazjYwnC0wrA8azjEwnCMwbAAazjUwnCswbAgazjMwnCcwbAQazjcwnC8wbAwaLjAwXCAwbAIaLjQwXCgwbAoaLjIwXCQwbAYaLjYwXCwwbA4aLjEwXCIwbAEaLjUwXCowbAkaLjMwXCYwbAUaLjcwXC4wbA0arjAwXCEwbAMarjQwXCkwbAsarjIwXCUwbAcarjYwXC0wbA8arjEwXCMw7AAarjUwXCsw7AgarjMwXCcw7AQarjcwXC8w7AwabjAw3CAw7AIabjQw3Cgw7AoabjIw3CQw7AYabjYw3Cww7A4abjEw3CIw7AEabjUw3Cow7AkabjMw3CYw7AUabjcw3C4w7A0a7jAw3CEw7AMa7jQw3Ckw7Asa7jIw3CUw7Aca7jYw3C0w7A8a7jEw3CMwHAAa7jUw3CswHAga7jMw3CcwHAQa7jcw3C8wHAwaHjAwPCAwHAIaHjQwPCgwHAoaHjIwPCQwHAYaHjYwPCwwHA4aHjEwPCIwHAEaHjUwPCowHAkaHjMwPCYwHAUaHjcwPC4wHA0anjAwPCEwHAManjQwPCkwHAsanjIwPCUwHAcanjYwPC0wHA8anjEwPCMwnAAanjUwPCswnAganjMwPCcwnAQanjcwPC8wnAwaXjAwvCAwnAIaXjQwvCgwnAoaXjIwvCQwnAYaXjYwvCwwnA4aXjEwvCIwnAEaXjUwvCownAkaXjMwvCYwnAUaXjcwvC4wnA0a3jAwvCEwnAMa3jQwvCkwnAsa3jIwvCUwnAca3jYwvC0wnA8a3jEwvCMwXAAa3jUwvCswXAga3jMwvCcwXAQa3jcwvC8wXAwaPjAwfCAwXAIaPjQwfCgwXAoaPjIwfCQwXAYaPjYwfCwwXA4aPjEwfCIwXAEaPjUwfCowXAkaPjMwfCYwXAUaPjcwfC4wXA0avjAwfCEwXAMavjQwfCkwXAsavjIwfCUwXAcavjYwfC0wXA8avjEwfCMw3AAavjUwfCsw3AgavjMwfCcw3AQavjcwfC8w3AwafjAw/CAw3AIafjQw/Cgw3AoafjIw/CQw3AYafjYw/Cww3A4a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hoMNDAcLDIuDhkMMDIcIDEuAhkMNDIcKDEuChsMMDIcJDEuBhsMNDIcLDEuDhiMMDEcIDMuAhiMNDEcKDMuChqMMDEcJDMuBhqMNDEcLDMuDhmMMDMcIDCuAhmMNDMcKDCuChuMMDMcJDCuBhuMNDMcLDCuDhhMMDCcIDKuAhhMNDCcKDKuChpMMDCcJDKuBhpMNDCcLDKuDhlMMDKcIDGuAhlMNDKcKDGuChtMMDKcJDGuBhtMNDKcLDGuDhjMMDGcIDOuAhjMNDGcKDOuChrMMDGcJDOuBhrMNDGcLDOuDhnMMDOcIDBuAhnMNDOcKDBuChvMMDOcJDBuBhvMNDOcLDBuDhgsMDBcIDJuAhgsNDBcKDJuChosMDBcJDJuBhosNDBcLDJuDhksMDJcIDFuAhksNDJcKDFuChssMDJcJDFuBhssNDJcLDFuDhisMDFcIDNuAhisNDFcKDNuChqsMDFcJDNuBhqsNDFcLDNuDhmsMDNcIDDuAhmsNDNcKDDuChusMDNcJDDuBhusNDNcLDDuDhhsMDDcIDLuAhhsNDDcKDLuChpsMDDcJDLuBhpsNDDcLDLuDhlsMDLcIDHuAhlsNDLcKDHuChtsMDLcJDHuBhtsNDLcLDHuDhjsMDHcIDPuAhjsNDHcKDPuChrsMDHcJDPuBhrsNDHcLDPuDhnsMDPcIDAeAhnsNDPcKDAeChvsMDPcJDAeBhvsNDPcLDAeDhgcMDA8IDIeAhgcNDA8KDIeChocMDA8JDIeBhocNDA8LDIeDhkcMDI8IDEeAhkcNDI8KDEeChscMDI8JDEeBhscNDI8LDEeDhicMDE8IDMeAhicNDE8KDMeChqcMDE8JDMeBhqcNDE8LDMeDhmcMDM8IDCeAhmcNDM8KDCeChucMDM8JDCeBhucNDM8LDCeDhhcMDC8IDKeAhhcNDC8KDKeChpcMDC8JDKeBhpcNDC8LDKeDhlcMDK8IDGeAhlcNDK8KDGeChtcMDK8JDGeBhtcNDK8LDGeDhjcMDG8IDOeAhjcNDG8KDOeChrcMDG8JDOeBhrcNDG8LDOeDhncMDO8IDBeAhncNDO8KDBeChvcMDO8JDBeBhvcNDO8LDBeDhg8MDB8IDJeAhg8NDB8KDJeCho8MDB8JDJeBho8NDB8LDJeDhk8MDJ8IDFeAhk8NDJ8KDFeChs8MDJ8JDFeB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hsMEhoVAw+EGhsMFhoVBwxEGhiMEhkVAw5EGhiMFhkVBw1EGhqMEhsVAw9EGhqMFhsVBwzEGhmMEhiVAw7EGhmMFhiVBw3EGhuMEhqVAw/EGhuMFhqVBwwkGhhMEhmVAw4kGhhMFhmVBw0kGhpMEhuVAw8kGhpMFhuVBwykGhlMEhhVAw6kGhlMFhhVBw2kGhtMEhpVAw+kGhtMFhpVBwxkGhjMEhlVAw5kGhjMFhlVBw1kGhrMEhtVAw9kGhrMFhtVBwzkGhnMEhjVAw7kGhnMFhjVBw3kGhvMEhrVAw/kGhvMFhrVBwwUGhgsEhnVAw4UGhgsFhnVBw0UGhosEhvVAw8UGhosFhvVBwyUGhksEhg1Aw6UGhksFhg1Bw2UGhssEho1Aw+UGhssFho1BwxUGhisEhk1Aw5UGhisFhk1Bw1UGhqsEhs1Aw9UGhqsFhs1BwzUGhmsEhi1Aw7UGhmsFhi1Bw3UGhusEhq1Aw/UGhusFhq1Bww0GhhsEhm1Aw40GhhsFhm1Bw00GhpsEhu1Aw80GhpsFhu1Bwy0GhlsEhh1Aw60GhlsFhh1Bw20GhtsEhp1Aw+0GhtsFhp1Bwx0GhjsEhl1Aw50GhjsFhl1Bw10GhrsEht1Aw90GhrsFht1Bwz0GhnsEhj1Aw70GhnsFhj1Bw30GhvsEhr1Aw/0GhvsFhr1BwwMGhgcEhn1Aw4MGhgcFhn1Bw0MGhocEhv1Aw8MGhocFhv1BwyMGhkcEhgNAw6MGhkcFhgNBw2MGhscEhoNAw+MGhscFhoNBwxMGhicEhkNAw5MGhicFhkNBw1MGhqcEhsNAw9MGhqcFhsNBwzMGhmcEhiNAw7MGhmcFhiNBw3MGhucEhqNAw/MGhucFhqNBwwsGhhcEhmNAw4sGhhcFhmNBw0sGhpcEhuNAw8sGhpcFhuNBwysGhlcEhhNAw6sGhlcFhhNBw2sGhtcEhpNAw+sGhtcFhpNBwxsGhjcEhlNAw5sGhjcFhlNBw1sGhrcEhtNAw9sGhrcFhtNBwzsGhncEhjNAw7sGhncFhjNBw3sGhvcEhrNAw/sGhvcFhrNBwwcGhg8EhnNAw4cGhg8FhnNBw0cGho8EhvNAw8cGho8FhvNBwycGhk8EhgtAw6cGhk8FhgtBw2cGhs8EhotAw+cGhs8FhotBwxcGhi8EhktAw5cGhi8FhktBw1cG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MTBsIzBMCRq2NTBsKzBMBRq2MzBsJzBMDRq2NzBsLzBMAxp2MDDsIDBMCxp2NDDsKDBMBxp2MjDsJDBMDxp2NjDsLDDMABp2MTDsIjDMCBp2NTDsKjDMBBp2MzDsJjDMDBp2NzDsLjDMAhr2MDDsITDMChr2NDDsKTDMBhr2MjDsJTDMDhr2NjDsLTDMARr2MTDsIzDMCRr2NTDsKzD8FzTsZ2DYT2CYCzTsb2DYX2CYGzQcYGA4QGCYBzQcaGA4UGCYFzQcZGA4SGCYDzQcbGA4WGCYHzQcYmA4RGBYADQcamA4VGBYEDQcZmA4TGBYCDQcbmA4XGBYGDQcYWA4QmBYBDQcaWA4UmBYFDQcZWA4SmBYDDQcbWA4WmBYHDQcY2A4RmBYAjQca2A4VmBYEjQcZ2A4TmBYCjQcb2A4XmBYGjScYGA4QWBYBjScaGA4UWBYFjScZGA4SWBYDjScbGA4WWBYHjScYmA4RWBYATScamA4VWBYETScZmA4TWBYCTScbmA4XWBYGTScYWA4Q2BYBTScaWA4U2BYFTScZWA4S2BYDTScbWA4W2BYHTScY2A4R2BYAzSca2A4V2BYEzScZ2A4T2BYCzScb2A4X2BYGzRcYGC4QGBYBzRcaGC4UGBYFzRcZGC4SGBYDzRcbGC4WGBYHzRcYmC4RGDYADRcamC4VGDYEDRcZmC4TGDYCDRcbmC4XGDYGDRcYWC4QmDYBDRcaWC4UmDYFDRcZWC4SmDYDDRcbWC4WmDYHDRcY2C4RmDYAjRca2C4VmDYEjRcZ2C4TmDYCjRcb2C4XmDYGjTcYGC4QWDYBjTcaGC4UWDYFjTcZGC4SWDYDjTcbGC4WWDYHjTcYmC4RWDYATTcamC4VWDYETTcZmC4TWDYCTTcbmC4XWDYGTTcYWC4Q2DYBTTcaWC4U2DYFTTcZWC4S2DYDTTcbWC4W2DYHTTcY2C4R2DYAzTca2C4V2DYEzTcZ2C4T2DYCzTcb2C4X2DYGzQ8YGB4QGDYBzQ8aGB4UGDYFzQ8ZGB4SGDYDzQ8bGB4WGDYHzQ8YmB4RGA4ADQ8amB4VGA4EDQ8ZmB4TGA4CDQ8bmB4XGA4GDQ8YWB4QmA4BDQ8aWB4UmA4FDQ8ZWB4SmA4DDQ8bWB4WmA4HDQ8Y2B4RmA4AjQ8a2B4VmA4EjQ8Z2B4TmA4CjQ8b2B4XmA4GjS8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UmBYHDQcZWA4SmBYAjQcbWA4WmBYEjQcY2A4RmBYCjQca2A4VmBYGjQcZ2A4TmBYBjQcb2A4XmBYFjScYGA4QWBYDjScaGA4UWBYHjScZGA4SWBYATScbGA4WWBYETScYmA4RWBYCTScamA4VWBYGTScZmA4TWBYBTScbmA4XWBYFTScYWA4Q2BYDTScaWA4U2BYHTScZWA4S2BYAzScbWA4W2BYEzScY2A4R2BYCzSca2A4V2BYGzScZ2A4T2BYBzScb2A4X2BYFzRcYGC4QGBYDzRcaGC4UGBYHzRcZGC4SGDYADRcbGC4WGDYEDRcYmC4RGDYCDRcamC4VGDYGDRcZmC4TGDYBDRcbmC4XGDYFDRcYWC4QmDYDDRcaWC4UmDYHDRcZWC4SmDYAjRcbWC4WmDYEjRcY2C4RmDYCjRca2C4VmDYGjRcZ2C4TmDYBjRcb2C4XmDYFjTcYGC4QWDYDjTcaGC4UWDYHjTcZGC4SWDYATTcbGC4WWDYETTcYmC4RWDYCTTcamC4VWDYGTTcZmC4TWDYBTTcbmC4XWDYFTTcYWC4Q2DYDTTcaWC4U2DYHTTcZWC4S2DYAzTcbWC4W2DYEzTcY2C4R2DYCzTca2C4V2DYGzTcZ2C4T2DYBzTcb2C4X2DYFzQ8YGB4QGDYDzQ8aGB4UGDYHzQ8ZGB4SGA4ADQ8bGB4WGA4EDQ8YmB4RGA4CDQ8amB4VGA4GDQ8ZmB4TGA4BDQ8bmB4XGA4FDQ8YWB4QmA4DDQ8aWB4UmA4HDQ8ZWB4SmA4AjQ8bWB4WmA4EjQ8Y2B4RmA4CjQ8a2B4VmA4GjQ8Z2B4TmA4BjQ8b2B4XmA4FjS8YGB4QWA4DjS8aGB4UWA4HjS8ZGB4SWA4ATS8bGB4WWA4ETS8YmB4RWA4CTS8amB4VWA4GTS8ZmB4TWA4BTS8bmB4XWA4FTS8YWB4Q2A4DTS8aWB4U2A4HTS8ZWB4S2A4AzS8bWB4W2A4EzS8Y2B4R2A4CzS8a2B4V2A4GzS8Z2B4T2A4BzS8b2B4X2A4FzR8YGD4QGA4DzR8aGD4UGA4HzR8ZGD4SGC4ADR8bGD4WGC4EDR8YmD4RGC4CDR8amD4VGC4GDR8ZmD4TGC4BDR8bmD4XGC4FDR8YWD4QmC4DDR8aWD4UmC4HDR8ZWD4SmC4AjR8bWD4WmC4EjR8Y2D4RmC4CjR8a2D4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hgUEhv9Aw4IGhgUFhv9l4QwLGRgWEhgGAA0LGxgWFhgGBA2LGBgWERgGAg2LGhgWFRgGBg2LGRgWExgGAQ2LGxgWFxgGBQ1LGBiWEBgGAw1LGhiWFBgGBw1LGRiWEhiGAA1LGxiWFhiGBA3LGBiWERiGAg3LGhiWFRiGBg3LGRiWExiGAQ3LGxiWFxiGBQ0rGBhWEBiGAw0rGhhWFBiGBw0rGRhWEhhGAA0rGxhWFhhGBA2rGBhWERhGAg2rGhhWFRhGBg2rGRhWExhGAQ2rGxhWFxhGBQ1rGBjWEBhGAw1rGhjWFBhGBw1rGRjWEhjGAA1rGxjWFhjGBA3rGBjWERjGAg3rGhjWFRjGBg3rGRjWExjGAQ3rGxjWFxjGBQ0bGBg2EBjGAw0bGhg2FBjGBw0bGRg2EhgmAA0bGxg2FhgmBA2bGBg2ERgmAg2bGhg2FRgmBg2bGRg2ExgmAQ2bGxg2FxgmBQ1bGBi2EBgmAw1bGhi2FBgmBw1bGRi2EhimAA1bGxi2FhimBA3bGBi2ERimAg3bGhi2FRimBg3bGRi2EximAQ3bGxi2FximBQ07GBh2EBimAw07Ghh2FBimBw07GRh2EhhmAA07Gxh2FhhmBA27GBh2ERhmAg27Ghh2FRhmBg27GRh2ExhmAQ27Gxh2FxhmBQ17GBj2EBhmAw17Ghj2FBhmBw17GRj2EhjmAA17Gxj2FhjmBA37GBj2ERjmAg37Ghj2FRjmBg37GRj2ExjmAQ37Gxj2FxjmBQ0HGBgOEBjmAw0HGhgOFBjmBw0HGRgOEhgWAA0HGxgOFhgWBA2HGBgOERgWAg2HGhgOFRgWBg2HGRgOExgWAQ2HGxgOFxgWBQ1HGBiOEBgWAw1HGhiOFBgWBw1HGRiOEhiWAA1HGxiOFhiWBA3HGBiOERiWAg3HGhiOFRiWBg3HGRiOExiWAQ3HGxiOFxiWBQ0nGBhOEBiWAw0nGhhOFBiWBw0nGRhOEhhWAA0nGxhOFhhWBA2nGBhOERhWAg2nGhhOFRhWBg2nGRhOExhWAQ2nGxhOFxhWBQ1nGBjOEBhWAw1nGhjOFBhWBw1nGRjOEhjWAA1nGxjOFhjWBA3nGBjOERjWAg3nGhjOFRjWBg3nGRjOExjWAQ3nGxjOFxjWBQ0XGBguEBjWAw0XGhguFBjWBw0XGRguEhg2AA0XGxguFhg2BA2X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hilBwzYGhm0EhqlAw7YGhm0FhqlBw3YGhu0EhmlAw/YGhu0FhmlBww4Ghh0EhulAw44Ghh0FhulBw04Ghp0EhhlAw84Ghp0FhhlBwy4Ghl0EhplAw64Ghl0FhplBw24Ght0EhllAw+4Ght0FhllBwx4Ghj0EhtlAw54Ghj0FhtlBw14Ghr0EhjlAw94Ghr0FhjlBwz4Ghn0EhrlAw74Ghn0FhrlBw34Ghv0EhnlAw/4Ghv0FhnlBwwEGhgMEhvlAw4EGhgMFhvlBw0EGhoMEhgVAw8EGhoMFhgVBwyEGhkMEhoVAw6EGhkMFhoVBw2EGhsMEhkVAw+EGhsMFhkVBwxEGhiMEhsVAw5EGhiMFhsVBw1EGhqMEhiVAw9EGhqMFhiVBwzEGhmMEhqVAw7EGhmMFhqVBw3EGhuMEhmVAw/EGhuMFhmVBwwkGhhMEhuVAw4kGhhMFhuVBw0kGhpMEhhVAw8kGhpMFhhVBwykGhlMEhpVAw6kGhlMFhpVBw2kGhtMEhlVAw+kGhtMFhlVBwxkGhjMEhtVAw5kGhjMFhtVBw1kGhrMEhjVAw9kGhrMFhjVBwzkGhnMEhrVAw7kGhnMFhrVBw3kGhvMEhnVAw/kGhvMFhnVBwwUGhgsEhvVAw4UGhgsFhvVBw0UGhosEhg1Aw8UGhosFhg1BwyUGhksEho1Aw6UGhksFho1Bw2UGhssEhk1Aw+UGhssFhk1BwxUGhisEhs1Aw5UGhisFhs1Bw1UGhqsEhi1Aw9UGhqsFhi1BwzUGhmsEhq1Aw7UGhmsFhq1Bw3UGhusEhm1Aw/UGhusFhm1Bww0GhhsEhu1Aw40GhhsFhu1Bw00GhpsEhh1Aw80GhpsFhh1Bwy0GhlsEhp1Aw60GhlsFhp1Bw20GhtsEhl1Aw+0GhtsFhl1Bwx0GhjsEht1Aw50GhjsFht1Bw10GhrsEhj1Aw90GhrsFhj1Bwz0GhnsEhr1Aw70GhnsFhr1Bw30GhvsEhn1Aw/0GhvsFhn1BwwMGhgcEhv1Aw4MGhgcFhv1Bw0MGhocEhgNAw8MGhocFhgNBwyMGhkcEhoNAw6MGhkcFhoNBw2MGhscEhkNAw+MGhscFhkNBwxMGhicEhsNAw5MGhicFhsNBw1MGhqcEhiNAw9MGhqcFhiNBwzMGhmcEhqNAw7MGhmcFhqNBw3MGhucEhmNAw/MGhucF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jjQwHCkwLAkajjIwHCUwLAUajjYwHC0wLA0ajjEwHCMwLAMajjUwHCswLAsajjMwHCcwLAcajjcwHC8wLA8aTjAwnCAwrAAaTjQwnCgwrAgaTjIwnCQwrAQaTjYwnCwwrAwaTjEwnCIwrAIaTjUwnCowrAoaTjMwnCYwrAYaTjcwnC4wrA4azjAwnCEwrAEazjQwnCkwrAkazjIwnCUwrAUazjYwnC0wrA0azjEwnCMwrAMazjUwnCswrAsazjMwnCcwrAcazjcwnC8wrA8aLjAwXCAwbAAaLjQwXCgwbAgaLjIwXCQwbAQaLjYwXCwwbAwaLjEwXCIwbAIaLjUwXCowbAoaLjMwXCYwbAYaLjcwXC4wbA4arjAwXCEwbAEarjQwXCkwbAkarjIwXCUwbAUarjYwXC0wbA0arjEwXCMwbAMarjUwXCswbAsarjMwXCcwbAcarjcwXC8wbA8abjAw3CAw7AAabjQw3Cgw7AgabjIw3CQw7AQabjYw3Cww7AwabjEw3CIw7AIabjUw3Cow7AoabjMw3CYw7AYabjcw3C4w7A4a7jAw3CEw7AEa7jQw3Ckw7Aka7jIw3CUw7AUa7jYw3C0w7A0a7jEw3CMw7AMa7jUw3Csw7Asa7jMw3Ccw7Aca7jcw3C8w7A8aHjAwPCAwHAAaHjQwPCgwHAgaHjIwPCQwHAQaHjYwPCwwHAwaHjEwPCIwHAIaHjUwPCowHAoaHjMwPCYwHAYaHjcwPC4wHA4anjAwPCEwHAEanjQwPCkwHAkanjIwPCUwHAUanjYwPC0wHA0anjEwPCMwHAManjUwPCswHAsanjMwPCcwHAcanjcwPC8wHA8aXjAwvCAwnAAaXjQwvCgwnAgaXjIwvCQwnAQaXjYwvCwwnAwaXjEwvCIwnAIaXjUwvCownAoaXjMwvCYwnAYaXjcwvC4wnA4a3jAwvCEwnAEa3jQwvCkwnAka3jIwvCUwnAUa3jYwvC0wnA0a3jEwvCMwnAMa3jUwvCswnAsa3jMwvCcwnAca3jcwvC8wnA8aPjAwfCAwXAAaPjQwfCgwXAgaPjIwfCQwXAQaPjYwfCwwXAwaPjEwfCIwXAIaPjUwfCowXAoaPjMwfCYwXAYaPjcwfC4wXA4avjAwfCEwXAEavjQwfCkwXAkavjIwfCUwXAUavjYwfC0wXA0avjEwfCMwXAMavjUwfCswXAsavjMwfCcwXAcavjcwfC8wXA8afjAw/CAw3AAafjQw/Cgw3AgafjIw/CQw3AQafjYw/Cww3AwafjEw/CIw3AIafjUw/Cow3AoafjMw/CYw3AYafjcw/C4w3A4a/jAw/CEw3AEa/jQw/Ckw3Aka/jIw/CUw3AUa/jYw/C0w3A0a/jEw/CMw3AMa/jUw/Csw3Asa/jMw/Ccw3Aca/jfsf9/w/xppw/2gYQADwwACwwOgYUADw4ACw4OgYSADw0ACw0OgYWADw8ACw8OgYRADwyACwyOgYVADw6ACw6OgYTADw2ACw2OgYXADw+ACw+OgYQgDwxACwxOgYUgDw5ACw5OgYSgDw1ACw1OgYWgDw9ACw9OgYRgDwzACwzOgYVgDw7ACw7OgYTgDw3ACw3OgYXgDw/ACw/OgYQQDwwgCwwugYUQDw4gCw4ugYSQDw0gCw0ugYWQDw8gCw8ugYRQDwygCwyugYVQDw6gCw6ugYTQDw2gCw2ugYXQDw+gCw+ugYQwDwxgCwxugYUwDw5gCw5ugYSwDw1gCw1ugYWwDw9gCw9ugYRwDwzgCwzugYVwDw7gCw7ugYTwDw3gCw3ugYXwDw/gCw/ugYQIDwwQCwwegYUIDw4QCw4egYSIDw0QCw0egYWIDw8QCw8egYRIDwyQCwyegYVIDw6QCw6egYTIDw2QCw2egYXIDw+QCw+egYQoDwxQCwxegYUoDw5QCw5egYSoDw1QCw1egYWoDw9QCw9egYRoDwzQCwzegYVoDw7QCw7egYToDw3QCw3egYXoDw/QCw/egYQYDwwwCww+gYUYDw4wCw4+gYSYDw0wCw0+gYWYDw8wCw8+gYRYDwywCwy+gYVYDw6wCw6+gYTYDw2wCw2+gYXYDw+wCw++gYQ4DwxwCwx+gYU4Dw5wCw5+gYS4Dw1wCw1+gYW4Dw9wCw9+gYR4DwzwCwz+gYV4Dw7wCw7+gYT4Dw3wCw3+gYX4Dw/wCw/9CcoYFDAwLCAwDgIYFDQwLCgwDgoaFDAwLCQwDgYaFDQwLCwwDg4ZFDAyLCAyDgIZFDQyLCgyDgobFDAyLCQyDgYbFDQyLCwyDg4YlDAxLCAxDgIYlDQxLCgxDgoalDAxLCQxDgYalDQxLCwxDg4ZlDAzLCAzDgIZlDQzLCgzDgoblDAzLCQzDgYblDQzLCwzDg4YVDAwrCAwjgIYVDQwrCgwjgoaVDAwrCQwjgYaVDQwrCwwjg4ZVDAyrCAyjgIZVDQyrCgyjgobVDAyrCQyjgYbVDQyrCwyjg4Y1DAxrCAxjgIY1DQxrCgxjgoa1DAxrCQxjgYa1DQxrCwxjg4Z1DAzrCAzjgIZ1DQzrCgzjgob1DAzrCQzjgYb1DQzrCwzjg4YNDAwbCAwTgIYNDQwbCgwTgoaNDAwbCQwTgYaNDQwbCwwTg4ZNDAybCAyTgIZNDQybCgyTgobNDAybCQyTgYbNDQybCwyTg4YtDAxbCAxTgIYtDQxbCgxTgoatDAxbCQxTgYatDQxbCwxTg4ZtDAzbCAzTgIZtDQzbCgzTgobtDAzbCQzTgYbtDQzbCwzTg4YdDAw7CAwzgIYdDQw7CgwzgoadDAw7CQwzgYadDQw7Cwwzg4ZdDAy7CAyzgIZdDQy7CgyzgobdDAy7CQyzgYbdDQy7Cwyzg4Y9DAx7CAxzgIY9DQx7Cgxzgoa9DAx7CQxzgYa9DQx7Cwxzg4Z9DAz7CAzzgIZ9DQz7Cgzzgob9DAz7CQzzgYb9DQz7Cwzzg4YDDAwHCAwLgIYDDQwHCgwLgoaDDAwHCQwLgYaDDQwHCwwLg4ZDDAyHCAyLgIZDDQyHCgyLgobDDAyHCQyLgYbDDQyHCwyLg4YjDAxHCAxLgIYjDQxHCgxLgoajDAxHCQxLgYajDQxHCwxLg4ZjDAzHCAzLgIZjDQzHCgzLgobjDAzHCQzLgYbjDQzHCwzLg4YTDAwnCAwrgIYTDQwnCgwrgoaTDAwnCQwrgYaTDQwnCwwrg4ZTDAynCAyrgIZTDQynCgyrgobTDAynCQyrgYbTDQynCwyrg4YzDAxnCAxrgIYzDQxnCgxrgoazDAxnCQxrgYazDQxnCwxrg4ZzDAznCAzrgIZzDQznCgzrgobzDAznCQzrgYbzDQznCwzrg4YLDAwXCAwbgIYLDQwXCgwbgoaLDAwXCQwbgYaLDQwXCwwbg4ZLDAyXCAybgIZLDQyXCgybgobLDAyXCQybgYbLDQyXCwybg4YrDAxXCAxbgIYrDQxXCgxbgoarDAxXCQxbgYarDQxXCwxbg4ZrDAzXCAzbgIZrDQzXCgzbgobrDAzXCQzbgYbrDQzXCwzbg4YbDAw3CAw7gIYbDQw3Cgw7goabDAw3CQw7gYabDQw3Cww7g4ZbDAy3CAy7gIZbDQy3Cgy7gobbDAy3CQy7gYbbDQy3Cwy7g4Y7DAx3CAx7gIY7DQx3Cgx7goa7DAx3CQx7gYa7DQx3Cwx7g4Z7DAz3CAz7gIZ7DQz3Cgz7gob7DAz3CQz7gYb7DQz3Cwz7g4YHDAwPCAwHgIYHDQwPCgwHgoaHDAwPCQwHgYaHDQwPCwwHg4ZHDAyPCAyHgIZHDQyPCgyHgobHDAyPCQyHgYbHDQyPCwyHg4YnDAxPCAxHgIYnDQxPCgxHgoanDAxPCQxHgYanDQxPCwxHg4ZnDAzPCAzHgIZnDQzPCgzHgobnDAzPCQzHgYbnDQzPCwzHg4YXDAwvCAwngIYXDQwvCgwngoaXDAwvCQwngYaXDQwvCwwng4ZXDAyvCAyngIZXDQyvCgyngobXDAyvCQyngYbXDQyvCwyng4Y3DAxvCAxngIY3DQxvCgxngoa3DAxvCQxngYa3DQxvCwxng4Z3DAzvCAzngIZ3DQzvCgzngob3DAzvCQzngYb3DQzvCwzng4YPDAwfCAwXgIYPDQwfCgwXgoaPDAwfCQwXgYaPDQwfCwwXg4ZPDAyfCAyXgIZPDQyfCgyXgobPDAyfCQyXgYbPDQyfCwyXg4YvDAxfCAxXgIYvDQxfCgxXgoavDAxfCQxXgYavDQxfCwxXg4ZvDAzfCAzXgIZvDQzfCgzXgobvDAzfCQzXgYbvDQzfCwzXg4YfDAw/CAw3gIYfDQw/Cgw3goafDAw/CQw3gYafDQw/Cww3g4ZfDAy/CAy3gIZfDQy/Cgy3gobfDAy/CQy3gYbfDQy/Cwy3g4Y/DAx/CAx3gIY/DQx/Cgx3goa/DAx/CQx3gYa/DQx/Cwx3g4Z/DAz/CAz3gIZ/DQz/Cgz3gob/DAz/CQz3gYb/Df/fN/y/RtpwP2gYwMAwgMDwAGgY0MAwoMDwIGgYyMAwkMDwEGgY2MAwsMDwMGgYxMAwiMDwCGgY1MAwqMDwKGgYzMAwmMDwGGgY3MAwuMDwOGgYwsAwhMDwBGgY0sAwpMDwJGgYysAwlMDwFGgY2sAwtMDwNGgYxsAwjMDwDGgY1sAwrMDwLGgYzsAwnMDwHGgY3sAwvMDwPGgYwcAwgsDwAmgY0cAwosDwImgYycAwksDwEmgY2cAwssDwMmgYxcAwisDwCmgY1cAwqsDwKmgYzcAwmsDwGmgY3cAwusDwOmgYw8AwhsDwBmgY08AwpsDwJmgYy8AwlsDwFmgY28AwtsDwNmgYx8AwjsDwDmgY18AwrsDwLmgYz8AwnsDwHmgY38AwvsDwPmiYwMAwgcDwAWiY0MAwocDwIWiYyMAwkcDwEWiY2MAwscDwMWiYxMAwicDwCWiY1MAwqcDwKWiYzMAwmcDwGWiY3MAwucDwOWiYwsAwhcDwBWiY0sAwpcDwJWiYysAwlcDwFWiY2sAwtcDwNWiYxsAwjcDwDWiY1sAwrcDwLWiYzsAwncDwHWiY3sAwvcDwPWiYwcAwg8DwA2iY0cAwo8DwI2iYycAwk8DwE2iY2cAws8DwM2iYxcAwi8DwC2iY1cAwq8DwK2iYzcAwm8DwG2iY3cAwu8DwO2iYw8Awh8DwB2iY08Awp8DwJ2iYy8Awl8DwF2iY28Awt8DwN2iYx8Awj8DwD2iY18Awr8DwL2iYz8Awn8DwH2iY38Awv8Dwv1CcYQEDwwICwwCgYUEDw4ICw4CgYSEDw0ICw0CgYWEDw8ICw8CgYREDwyICwyCgYVEDw6ICw6CgYTEDw2ICw2CgYXEDw+ICw+CgYQkDwxICwxCgYUkDw5ICw5CgYSkDw1ICw1CgYWkDw9ICw9CgYRkDwzICwzCgYVkDw7ICw7CgYTkDw3ICw3CgYXkDw/ICw/CgYQUDwwoCwwigYUUDw4oCw4igYSUDw0oCw0igYWUDw8oCw8igYRUDwyoCwyigYVUDw6oCw6igYTUDw2oCw2igYXUDw+oCw+igYQ0DwxoCwxigYU0Dw5oCw5igYS0Dw1oCw1igYW0Dw9oCw9igYR0DwzoCwzigYV0Dw7oCw7igYT0Dw3oCw3igYX0Dw/oCw/igYQMDwwYCwwSgYUMDw4YCw4SgYSMDw0YCw0SgYWMDw8YCw8SgYRMDwyYCwySgYVMDw6YCw6SgYTMDw2YCw2SgYXMDw+YCw+SgYQsDwxYCwxSgYUsDw5YCw5SgYSsDw1YCw1SgYWsDw9YCw9SgYRsDwzYCwzSgYVsDw7YCw7SgYTsDw3YCw3SgYXsDw/YCw/SgYQcDww4CwwygYUcDw44Cw4ygYScDw04Cw0ygYWcDw84Cw8ygYRcDwy4CwyygYVcDw64Cw6ygYTcDw24Cw2ygYXcDw+4Cw+ygYQ8Dwx4CwxygYU8Dw54Cw5ygYS8Dw14Cw1ygYW8Dw94Cw9ygYR8Dwz4CwzygYV8Dw74Cw7ygYT8Dw34Cw3ygYX8Dw/4Cw/yg4QADwwECwwKg4UADw4ECw4Kg4SADw0ECw0Kg4WADw8ECw8Kg4RADwyECwyKg4VADw6ECw6Kg4TADw2ECw2Kg4XADw+ECw+Kg4QgDwxECwxKg4UgDw5ECw5Kg4SgDw1ECw1Kg4WgDw9ECw9Kg4RgDwzECwzKg4VgDw7ECw7Kg4TgDw3ECw3Kg4XgDw/ECw/Kg4QQDwwkCwwqg4UQDw4kCw4qg4SQDw0kCw0qg4WQDw8kCw8qg4RQDwykCwyqg4VQDw6kCw6qg4TQDw2kCw2qg4XQDw+kCw+qg4QwDwxkCwxqg4UwDw5kCw5qg4SwDw1kCw1qg4WwDw9kCw9qg4RwDwzkCwzqg4VwDw7kCw7qg4TwDw3kCw3qg4XwDw/kCw/qg4QIDwwUCwwag4UIDw4UCw4ag4SIDw0UCw0ag4WIDw8UCw8ag4RIDwyUCwyag4VIDw6UCw6ag4TIDw2UCw2ag4XIDw+UCw+ag4QoDwxUCwxag4UoDw5UCw5ag4SoDw1UCw1ag4WoDw9UCw9ag4RoDwzUCwzag4VoDw7UCw7ag4ToDw3UCw3ag4XoDw/UCw/ag4QYDww0Cww6g4UYDw40Cw46g4SYDw00Cw06g4WYDw80Cw86g4RYDwy0Cwy6g4VYDw60Cw66g4TYDw20Cw26g4XYDw+0Cw+6g4Q4Dwx0Cwx6g4U4Dw50Cw56g4S4Dw10Cw16g4W4Dw90Cw96g4R4Dwz0Cwz6g4V4Dw70Cw76g4T4Dw30Cw36g4X4Dw/0Cw/6g4QEDwwMCwwGg4UEDw4MCw4Gg4SEDw0MCw0Gg4WEDw8MCw8Gg4REDwyMCwyGg4VEDw6MCw6Gg4TEDw2MCw2Gg4XEDw+MCw+Gg4QkDwxMCwxGg4UkDw5MCw5Gg4SkDw1MCw1Gg4WkDw9MCw9Gg4RkDwzMCwzGg4VkDw7MCw7Gg4TkDw3MCw3Gg4XkDw/MCw/Gg4QUDwwsCwwmg4UUDw4sCw4mg4SUDw0sCw0mg4WUDw8sCw8mg4RUDwysCwymg4VUDw6sCw6mg4TUDw2sCw2mg4XUDw+sCw+mg4Q0DwxsCwxmg4U0Dw5sCw5mg4S0Dw1sCw1mg4W0Dw9sCw9mg4R0DwzsCwzmg4V0Dw7sCw7mg4T0Dw3sCw3mg4X0Dw/sCw/mg4QMDwwcCwwWg4UMDw4cCw4Wg4SMDw0cCw0Wg4WMDw8cCw8Wg4RMDwycCwyWg4VMDw6cCw6Wg4TMDw2cCw2Wg4XMDw+cCw+Wg4QsDwxcCwxWg4UsDw5cCw5Wg4SsDw1cCw1Wg4WsDw9cCw9Wg4RsDwzcCwzWg4VsDw7cCw7Wg4TsDw3cCw3Wg4XsDw/cCw/Wg4QcDww8Cww2g4UcDw48Cw42g4ScDw08Cw02g4WcDw88Cw82g4RcDwy8Cwy2g4VcDw68Cw62g4TcDw28Cw22g4XcDw+8Cw+2g4Q8Dwx8Cwx2g4U8Dw58Cw52g4S8Dw18Cw12g4W8Dw98Cw92g4R8Dwz8Cwz2g4V8Dw78Cw72g4T8Dw38Cw32g4X8j/vcN/6+RNtwPGgYwMAwgMDwAGgY0MAwoMDwIGgYyMAwkMDwEGgY2MAwsMDwMGgYxMAwiMDwCGgY1MAwqMDwKGgYzMAwmMDwGGgY3MAwuMDwOGoYwMAwhMDwBGoY0MAwpMDwJGoYyMAwlMDwFGoY2MAwtMDwNGoYxMAwjMDwDGoY1MAwrMDwLGoYzMAwnMDwHGoY3MAwvMDwPGkYwMIwgMLwAGkY0MIwoMLwIGkYyMIwkMLwEGkY2MIwsMLwMGkYxMIwiMLwCGkY1MIwqMLwKGkYzMIwmMLwGGkY3MIwuMLwOGsYwMIwhMLwBGsY0MIwpMLwJGsYyMIwlMLwFGsY2MIwtMLwNGsYxMIwjMLwDGsY1MIwrMLwLGsYzMIwnMLwHGsY3MIwvMLwPGiYwMEwgMHwAGiY0MEwoMHwIGiYyMEwkMHwEGiY2MEwsMHwMGiYxMEwiMHwCGiY1MEwqMHwKGiYzMEwmMHwGGiY3MEwuMHwOGqYwMEwhMHwBGqY0MEwpMHwJGqYyMEwlMHwFGqY2MEwtMHwNGqYxMEwjMHwDGqY1MEwrMHwLGqYzMEwnMHwHGqY3MEwvMHwPGmYwMMwgMPwAGmY0MMwoMPwIGmYyMMwkMPwEGmY2MMwsMPwMGmYxMMwiMPwCGmY1MMwqMPwKGmYzMMwmMPwGGmY3MMwuMPwOGuYwMMwhMPwBGuY0MMwpMPwJGuYyMMwlMPwFGuY2MMwtMPwNGuYxMMwjMPwDGuY1MMwrMPwLGuYzMMwnMPwHGuY3MMwvMPwvNGdYwMCwgMAwAGhY0MCwoMAwIGhYyMCwkMAwEGhY2MCwsMAwMGhYxMCwiMAwCGhY1MCwqMAwKGhYzMCwmMAwGGhY3MCwuMAwOGhYwsCwhMAwBGhY0sCwpMAwJGhYysCwlMAwFGhY2sCwtMAwNGhYxsCwjMAwDGhY1sCwrMAwLGhYzsCwnMAwHGhY3sCwvMAwPGhYwcCwgsAwAmhY0cCwosAwImhYycCwksAwEmhY2cCwssAwMmhYxcCwisAwCmhY1cCwqsAwKmhYzcCwmsAwGmhY3cCwusAwOmhYw8CwhsAwBmhY08CwpsAwJmhYy8CwlsAwFmhY28CwtsAwNmhYx8CwjsAwDmhY18CwrsAwLmhYz8CwnsAwHmhY38CwvsAwPmjYwMCwgcAwAWjY0MCwocAwIWjYyMCwkcAwEWjY2MCwscAwMWjYxMCwicAwCWjY1MCwqcAwKWjYzMCwmcAwGWjY3MCwucAwOWjYwsCwhcAwBWjY0sCwpcAwJWjYysCwlcAwFWjY2sCwtcAwNWjYxsCwjcAwDWjY1sCwrcAwLWjYzsCwncAwHWjY3sCwvcAwPWjYwcCwg8AwA2jY0cCwo8AwI2jYycCwk8AwE2jY2cCws8AwM2jYxcCwi8AwC2jY1cCwq8AwK2jYzcCwm8AwG2jY3cCwu8AwO2jYw8Cwh8AwB2jY08Cwp8AwJ2jYy8Cwl8AwF2jY28Cwt8AwN2jYx8Cwj8AwD2jY18Cwr8AwL2jYz8Cwn8AwH2jY38Cwv8AwP2g4wMBwgMCwAGg40MBwoMCwIGg4yMBwkMCwEGg42MBwsMCwMGg4xMBwiMCwCGg41MBwqMCwKGg4zMBwmMCwGGg43MBwuMCwOGg4wsBwhMCwBGg40sBwpMCwJGg4ysBwlMCwFGg42sBwtMCwNGg4xsBwjMCwDGg41sBwrMCwLGg4zsBwnMCwHGg43sBwvMCwPGg4wcBwgsCwAmg40cBwosCwImg4ycBwksCwEmg42cBwssCwMmg4xcBwisCwCmg41cBwqsCwKmg4zcBwmsCwGmg43cBwusCwOmg4w8BwhsCwBmg408BwpsCwJmg4y8BwlsCwFmg428BwtsCwNmg4x8BwjsCwDmg418BwrsCwLmg4z8BwnsCwHmg438BwvsCwPmi4wMBwgcCwAWi40MBwocCwIWi4yMBwkcCwEWi42MBwscCwMWi4xMBwicCwCWi41MBwqcCwKWi4zMBwmcCwGWi43MBwucCwOWi4wsBwhcCwBWi40sBwpcCwJWi4ysBwlcCwFWi42sBwtcCwNWi4xsBwjcCwDWi41sBwrcCwLWi4zsBwncCwHWi43sBwvcCwPWi4wcBwg8CwA2i40cBwo8CwI2i4ycBwk8CwE2i42cBws8CwM2i4xcBwi8CwC2i41cBwq8CwK2i4zcBwm8CwG2i43cBwu8CwO2i4w8Bwh8CwB2i408Bwp8CwJ2i4y8Bwl8CwF2i428Bwt8CwN2i4x8Bwj8CwD2i418Bwr8CwL2i4z8Bwn8CwH2i438Bwv8CwP2h4wMDwgMBwAGh40MDwoMBwIGh4yMDwkMBwEGh42MDwsMBwMGh4xMDwiMBwCGh41MDwqMBwKGh4zMDwmMBwGGh43MDwuMBwOGh4wsDwhMBwBGh40sDwpMBwJGh4ysDwlMBwFGh42sDwtMBwNGh4xsDwjMBwDGh41sDwrMBwLGh4zsDwnMBwHGh43sDwvMBwPGh4wcDwgsBwAmh40cDwosBwImh4ycDwksBwEmh42cDwssBwMmh4xcDwisBwCmh41cDwqsBwKmh4zcDwmsBwGmh43cDwusBwOmh4w8DwhsBwBmh408DwpsBwJmh4y8DwlsBwFmh428DwtsBwNmh4x8DwjsBwDmh418DwrsBwLmh4z8DwnsBwHmh438DwvsBwPmj4wMDwgcBwAWj40MDwocBwIWj4yMDwkcBwEWj42MDwscBwMWj4xMDwicBwCWj41MDwqcBwKWj4zMDwmcBwGWj43MDwucBwOWj4wsDwhcBwBWj40sDwpcBwJWj4ysDwlcBwFWj42sDwtcBwNWj4xsDwjcBwDWj41sDwrcBwLWj4zsDwncBwHWj43sDwvcBwPWj4wcDwg8BwA2j40cDwo8BwI2j4ycDwk8BwE2j42cDws8BwM2j4xcDwi8BwC2j41cDwq8BwK2j4zcDwm8BwG2j43cDwu8BwO2j4w8Dwh8BwB2j408Dwp8BwJ2j4y8Dwl8BwF2j428Dwt8BwN2j4x8Dwj8BwD2j418Dwr8BwL2j4z8Dwn8BwH2j438j/fcP/a6QN94OGAQwMAwgMD4CGAQ0MAwoMD4KGgQwMAwkMD4GGgQ0MAwsMD4OGQQwMgwgMj4CGQQ0MgwoMj4KGwQwMgwkMj4GGwQ0MgwsMj4OGIQwMQwgMT4CGIQ0MQwoMT4KGoQwMQwkMT4GGoQ0MQwsMT4OGYQwMwwgMz4CGYQ0MwwoMz4KG4QwMwwkMz4GG4Q0MwwsMz4OGEQwMIwgML4CGEQ0MIwoML4KGkQwMIwkML4GGkQ0MIwsML4OGUQwMowgMr4CGUQ0MowoMr4KG0QwMowkMr4GG0Q0MowsMr4OGMQwMYwgMb4CGMQ0MYwoMb4KGsQwMYwkMb4GGsQ0MYwsMb4OGcQwM4wgM74CGcQ0M4woM74KG8QwM4wkM74GG8Q0M4wsM74OGCQwMEwgMH4CGCQ0MEwoMH4KGiQwMEwkMH4GGiQ0MEwsMH4OGSQwMkwgMn4CGSQ0MkwoMn4KGyQwMkwkMn4GGyQ0MkwsMn4OGKQwMUwgMX4CGKQ0MUwoMX4KGqQwMUwkMX4GGqQ0MUwsMX4OGaQwM0wgM34CGaQ0M0woM34KG6QwM0wkM34GG6Q0M0wsM34OGGQwMMwgMP4CGGQ0MMwoMP4KGmQwMMwkMP4GGmQ0MMwsMP4OGWQwMswgMv4CGWQ0MswoMv4KG2QwMswkMv4GG2Q0MswsMv4OGOQwMcwgMf4CGOQ0McwoMf4KGuQwMcwkMf4GGuQ0McwsMf4OGeQwM8wgM/4CGeQ0M8woM/4KG+QwM8wkM/4GG+Q0M8wsM/wvDGRYwMCwgMAwAGhY0MCwoMAwIGhYyMCwkMAwEGhY2MCwsMAwMGhYxMCwiMAwCGhY1MCwqMAwKGhYzMCwmMAwGGhY3MCwuMAwOGpYwMCwhMAwBGpY0MCwpMAwJGpYyMCwlMAwFGpY2MCwtMAwNGpYxMCwjMAwDGpY1MCwrMAwLGpYzMCwnMAwHGpY3MCwvMAwPGlYwMKwgMIwAGlY0MKwoMIwIGlYyMKwkMIwEGlY2MKwsMIwMGlYxMKwiMIwCGlY1MKwqMIwKGlYzMKwmMIwGGlY3MKwuMIwOGtYwMKwhMIwBGtY0MKwpMIwJGtYyMKwlMIwFGtY2MKwtMIwNGtYxMKwjMIwDGtY1MKwrMIwLGtYzMKwnMIwHGtY3MKwvMIwPGjYwMGwgMEwAGjY0MGwoMEwIGjYyMGwkMEwEGjY2MGwsMEwMGjYxMGwiMEwCGjY1MGwqMEwKGjYzMGwmMEwGGjY3MGwuMEwOGrYwMGwhMEwBGrY0MGwpMEwJGrYyMGwlMEwFGrY2MGwtMEwNGrYxMGwjMEwDGrY1MGwrMEwLGrYzMGwnMEwHGrY3MGwvMEwPGnYwMOwgMMwAGnY0MOwoMMwIGnYyMOwkMMwEGnY2MOwsMMwMGnYxMOwiMMwCGnY1MOwqMMwKGnYzMOwmMMwGGnY3MOwuMMwOGvYwMOwhMMwBGvY0MOwpMMwJGvYyMOwlMMwFGvY2MOwtMMwNGvYxMOwjMMwDGvY1MOwrMMwLGvYzMOwnMMwHGvY3MOwvMMwPGg4wMBwgMCwAGg40MBwoMCwIGg4yMBwkMCwEGg42MBwsMCwMGg4xMBwiMCwCGg41MBwqMCwKGg4zMBwmMCwGGg43MBwuMCwOGo4wMBwhMCwBGo40MBwpMCwJGo4yMBwlMCwFGo42MBwtMCwNGo4xMBwjMCwDGo41MBwrMCwLGo4zMBwnMCwHGo43MBwvMCwPGk4wMJwgMKwAGk40MJwoMKwIGk4yMJwkMKwEGk42MJwsMKwMGk4xMJwiMKwCGk41MJwqMKwKGk4zMJwmMKwGGk43MJwuMKwOGs4wMJwhMKwBGs40MJwpMKwJGs4yMJwlMKwFGs42MJwtMKwNGs4xMJwjMKwDGs41MJwrMKwLGs4zMJwnMKwHGs43MJwvMKwPGi4wMFwgMGwAGi40MFwoMGwIGi4yMFwkMGwEGi42MFwsMGwMGi4xMFwiMGwCGi41MFwqMGwKGi4zMFwmMGwGGi43MFwuMGwOGq4wMFwhMGwBGq40MFwpMGwJGq4yMFwlMGwFGq42MFwtMGwNGq4xMFwjMGwDGq41MFwrMGwLGq4zMFwnMGwHGq43MFwvMGwPGm4wMNwgMOwAGm40MNwoMOwIGm4yMNwkMOwEGm42MNwsMOwMGm4xMNwiMOwCGm41MNwqMOwKGm4zMNwmMOwGGm43MNwuMOwOGu4wMNwhMOwBGu40MNwpMOwJGu4yMNwlMOwFGu42MNwtMOwNGu4xMNwjMOwDGu41MNwrMOwLGu4zMNwnMOwHGu43MNwvMOwPGh4wMDwgMBwAGh40MDwoMBwIGh4yMDwkMBwEGh42MDwsMBwMGh4xMDwiMBwCGh41MDwqMBwKGh4zMDwmMBwGGh43MDwuMBwOGp4wMDwhMBwBGp40MDwpMBwJGp4yMDwlMBwFGp42MDwtMBwNGp4xMDwjMBwDGp41MDwrMBwLGp4zMDwnMBwHGp43MDwvMBwPGl4wMLwgMJwAGl40MLwoMJwIGl4yMLwkMJwEGl42MLwsMJwMGl4xMLwiMJwCGl41MLwqMJwKGl4zMLwmMJwGGl43MLwuMJwOGt4wMLwhMJwBGt40MLwpMJwJGt4yMLwlMJwFGt42MLwtMJwNGt4xMLwjMJwDGt41MLwrMJwLGt4zMLwnMJwHGt43MLwvMJwPGj4wMHwgMFwAGj40MHwoMFwIGj4yMHwkMFwEGj42MHwsMFwMGj4xMHwiMFwCGj41MHwqMFwKGj4zMHwmMFwGGj43MHwuMFwOGr4wMHwhMFwBGr40MHwpMFwJGr4yMHwlMFwFGr42MHwtMFwNGr4xMHwjMFwDGr41MHwrMFwLGr4zMHwnMFwHGr43MHwvMFwPGn4wMPwgMNwAGn40MPwoMNwIGn4yMPwkMNwEGn42MPwsMNwMGn4xMPwiMNwCGn41MPwqMNwKGn4zMPwmMNwGGn43MPwuMNwOGv4wMPwhMNwBGv40MPwpMNwJGv4yMPwlMNwFGv42MPwtMNwNGv4xMPwjMNwDGv41MPwrMNwLGv4zMPwnMNwHGv436n/f8P8aacP9oGEAA8MAAsMDoGFAA8OAAsODoGEgA8NAAsNDoGFgA8PAAsPDoGEQA8MgAsMjoGFQA8OgAsOjoGEwA8NgAsNjoGFwA8PgAsPjoGEIA8MQAsMToGFIA8OQAsOToGEoA8NQAsNToGFoA8PQAsPToGEYA8MwAsMzoGFYA8OwAsOzoGE4A8NwAsNzoGF4A8PwAsPzoGEEA8MIAsMLoGFEA8OIAsOLoGEkA8NIAsNLoGFkA8PIAsPLoGEUA8MoAsMroGFUA8OoAsOroGE0A8NoAsNroGF0A8PoAsProGEMA8MYAsMboGFMA8OYAsOboGEsA8NYAsNboGFsA8PYAsPboGEcA8M4AsM7oGFcA8O4AsO7oGE8A8N4AsN7oGF8A8P4AsP7oGECA8MEAsMHoGFCA8OEAsOHoGEiA8NEAsNHoGFiA8PEAsPHoGESA8MkAsMnoGFSA8OkAsOnoGEyA8NkAsNnoGFyA8PkAsPnoGEKA8MUAsMXoGFKA8OUAsOXoGEqA8NUAsNXoGFqA8PUAsPXoGEaA8M0AsM3oGFaA8O0AsO3oGE6A8N0AsN3oGF6A8P0AsP3oGEGA8MMAsMPoGFGA8OMAsOPoGEmA8NMAsNPoGFmA8PMAsPPoGEWA8MsAsMvoGFWA8OsAsOvoGE2A8NsAsNvoGF2A8PsAsPvoGEOA8McAsMfoGFOA8OcAsOfoGEuA8NcAsNfoGFuA8PcAsPfoGEeA8M8AsM/oGFeA8O8AsO/oGE+A8N8AsN/oGF+A8P8AsP/wnKGBQwMCwgMA4CGBQ0MCwoMA4KGhQwMCwkMA4GGhQ0MCwsMA4OGRQwMiwgMg4CGRQ0MiwoMg4KGxQwMiwkMg4GGxQ0MiwsMg4OGJQwMSwgMQ4CGJQ0MSwoMQ4KGpQwMSwkMQ4GGpQ0MSwsMQ4OGZQwMywgMw4CGZQ0MywoMw4KG5QwMywkMw4GG5Q0MywsMw4OGFQwMKwgMI4CGFQ0MKwoMI4KGlQwMKwkMI4GGlQ0MKwsMI4OGVQwMqwgMo4CGVQ0MqwoMo4KG1QwMqwkMo4GG1Q0MqwsMo4OGNQwMawgMY4CGNQ0MawoMY4KGtQwMawkMY4GGtQ0MawsMY4OGdQwM6wgM44CGdQ0M6woM44KG9QwM6wkM44GG9Q0M6wsM44OGDQwMGwgME4CGDQ0MGwoME4KGjQwMGwkME4GGjQ0MGwsME4OGTQwMmwgMk4CGTQ0MmwoMk4KGzQwMmwkMk4GGzQ0MmwsMk4OGLQwMWwgMU4CGLQ0MWwoMU4KGrQwMWwkMU4GGrQ0MWwsMU4OGbQwM2wgM04CGbQ0M2woM04KG7QwM2wkM04GG7Q0M2wsM04OGHQwMOwgMM4CGHQ0MOwoMM4KGnQwMOwkMM4GGnQ0MOwsMM4OGXQwMuwgMs4CGXQ0MuwoMs4KG3QwMuwkMs4GG3Q0MuwsMs4OGPQwMewgMc4CGPQ0MewoMc4KGvQwMewkMc4GGvQ0MewsMc4OGfQwM+wgM84CGfQ0M+woM84KG/QwM+wkM84GG/Q0M+wsM84OGAwwMBwgMC4CGAw0MBwoMC4KGgwwMBwkMC4GGgw0MBwsMC4OGQwwMhwgMi4CGQw0MhwoMi4KGwwwMhwkMi4GGww0MhwsMi4OGIwwMRwgMS4CGIw0MRwoMS4KGowwMRwkMS4GGow0MRwsMS4OGYwwMxwgMy4CGYw0MxwoMy4KG4wwMxwkMy4GG4w0MxwsMy4OGEwwMJwgMK4CGEw0MJwoMK4KGkwwMJwkMK4GGkw0MJwsMK4OGUwwMpwgMq4CGUw0MpwoMq4KG0wwMpwkMq4GG0w0MpwsMq4OGMwwMZwgMa4CGMw0MZwoMa4KGswwMZwkMa4GGsw0MZwsMa4OGcwwM5wgM64CGcw0M5woM64KG8wwM5wkM64GG8w0M5wsM64OGCwwMFwgMG4CGCw0MFwoMG4KGiwwMFwkMG4GGiw0MFwsMG4OGSwwMlwgMm4CGSw0MlwoMm4KGywwMlwkMm4GGyw0MlwsMm4OGKwwMVwgMW4CGKw0MVwoMW4KGqwwMVwkMW4GGqw0MVwsMW4OGawwM1wgM24CGaw0M1woM24KG6wwM1wkM24GG6w0M1wsM24OGGwwMNwgMO4CGGw0MNwoMO4KGmwwMNwkMO4GGmw0MNwsMO4OGWwwMtwgMu4CGWw0MtwoMu4KG2wwMtwkMu4GG2w0MtwsMu4OGOwwMdwgMe4CGOw0MdwoMe4KGuwwMdwkMe4GGuw0MdwsMe4OGewwM9wgM+4CGew0M9woM+4KG+wwM9wkM+4GG+w0M9wsM+4OGBwwMDwgMB4CGBw0MDwoMB4KGhwwMDwkMB4GGhw0MDwsMB4OGRwwMjwgMh4CGRw0MjwoMh4KGxwwMjwkMh4GGxw0MjwsMh4OGJwwMTwgMR4CGJw0MTwoMR4KGpwwMTwkMR4GGpw0MTwsMR4OGZwwMzwgMx4CGZw0MzwoMx4KG5wwMzwkMx4GG5w0MzwsMx4OGFwwMLwgMJ4CGFw0MLwoMJ4KGlwwMLwkMJ4GGlw0MLwsMJ4OGVwwMrwgMp4CGVw0MrwoMp4KG1wwMrwkMp4GG1w0MrwsMp4OGNwwMbwgMZ4CGNw0MbwoMZ4KGtwwMbwkMZ4GGtw0MbwsMZ4OGdwwM7wgM54CGdw0M7woM54KG9wwM7wkM54GG9w0M7wsM54OGDwwMHwgMF4CGDw0MHwoMF4KGjwwMHwkMF4GGjw0MHwsMF4OGTwwMnwgMl4CGTw0MnwoMl4KGzwwMnwkMl4GGzw0MnwsMl4OGLwwMXwgMV4CGLw0MXwoMV4KGrwwMXwkMV4GGrw0MXwsMV4OGbwwM3wgM14CGbw0M3woM14KG7wwM3wkM14GG7w0M3wsM14OGHwwMPwgMN4CGHw0MPwoMN4KGnwwMPwkMN4GGnw0MPwsMN4OGXwwMvwgMt4CGXw0MvwoMt4KG3wwMvwkMt4GG3w0MvwsMt4OGPwwMfwgMd4CGPw0MfwoMd4KGvwwMfwkMd4GGvw0MfwsMd4OGfwwM/wgM94CGfw0M/woM94KG/wwM/wkM94GG/43+3zf8v0bacD9oGMDAMIDA8ABoGNDAMKDA8CBoGMjAMJDA8BBoGNjAMLDA8DBoGMTAMIjA8AhoGNTAMKjA8ChoGMzAMJjA8BhoGNzAMLjA8DhoGMLAMITA8ARoGNLAMKTA8CRoGMrAMJTA8BRoGNrAMLTA8DRoGMbAMIzA8AxoGNbAMKzA8CxoGM7AMJzA8BxoGN7AMLzA8DxoGMHAMILA8AJoGNHAMKLA8CJoGMnAMJLA8BJoGNnAMLLA8DJoGMXAMIrA8ApoGNXAMKrA8CpoGM3AMJrA8BpoGN3AMLrA8DpoGMPAMIbA8AZoGNPAMKbA8CZoGMvAMJbA8BZoGNvAMLbA8DZoGMfAMI7A8A5oGNfAMK7A8C5oGM/AMJ7A8B5oGN/AML7A8D5omMDAMIHA8AFomNDAMKHA8CFomMjAMJHA8BFomNjAMLHA8DFomMTAMInA8AlomNTAMKnA8ClomMzAMJnA8BlomNzAMLnA8DlomMLAMIXA8AVomNLAMKXA8CVomMrAMJXA8BVomNrAMLXA8DVomMbAMI3A8A1omNbAMK3A8C1omM7AMJ3A8B1omN7AML3A8D1omMHAMIPA8ANomNHAMKPA8CNomMnAMJPA8BNomNnAMLPA8DNomMXAMIvA8AtomNXAMKvA8CtomM3AMJvA8BtomN3AMLvA8DtomMPAMIfA8AdomNPAMKfA8CdomMvAMJfA8BdomNvAMLfA8DdomMfAMI/A8A9omNfAMK/A8C9omM/AMJ/A8B9omN/AML/A8L9wnGEBA8MCAsMAoGFBA8OCAsOAoGEhA8NCAsNAoGFhA8PCAsPAoGERA8MiAsMgoGFRA8OiAsOgoGExA8NiAsNgoGFxA8PiAsPgoGEJA8MSAsMQoGFJA8OSAsOQoGEpA8NSAsNQoGFpA8PSAsPQoGEZA8MyAsMwoGFZA8OyAsOwoGE5A8NyAsNwoGF5A8PyAsPwoGEFA8MKAsMIoGFFA8OKAsOIoGElA8NKAsNIoGFlA8PKAsPIoGEVA8MqAsMooGFVA8OqAsOooGE1A8NqAsNooGF1A8PqAsPooGENA8MaAsMYoGFNA8OaAsOYoGEtA8NaAsNYoGFtA8PaAsPYoGEdA8M6AsM4oGFdA8O6AsO4oGE9A8N6AsN4oGF9A8P6AsP4oGEDA8MGAsMEoGFDA8OGAsOEoGEjA8NGAsNEoGFjA8PGAsPEoGETA8MmAsMkoGFTA8OmAsOkoGEzA8NmAsNkoGFzA8PmAsPkoGELA8MWAsMUoGFLA8OWAsOUoGErA8NWAsNUoGFrA8PWAsPUoGEbA8M2AsM0oGFbA8O2AsO0oGE7A8N2AsN0oGF7A8P2AsP0oGEHA8MOAsMMoGFHA8OOAsOMoGEnA8NOAsNMoGFnA8POAsPMoGEXA8MuAsMsoGFXA8OuAsOsoGE3A8NuAsNsoGF3A8PuAsPsoGEPA8MeAsMcoGFPA8OeAsOcoGEvA8NeAsNcoGFvA8PeAsPcoGEfA8M+AsM8oGFfA8O+AsO8oGE/A8N+AsN8oGF/A8P+AsP8oOEAA8MBAsMCoOFAA8OBAsOCoOEgA8NBAsNCoOFgA8PBAsPCoOEQA8MhAsMioOFQA8OhAsOioOEwA8NhAsNioOFwA8PhAsPioOEIA8MRAsMSoOFIA8ORAsOSoOEoA8NRAsNSoOFoA8PRAsPSoOEYA8MxAsMyoOFYA8OxAsOyoOE4A8NxAsNyoOF4A8PxAsPyoOEEA8MJAsMKoOFEA8OJAsOKoOEkA8NJAsNKoOFkA8PJAsPKoOEUA8MpAsMqoOFUA8OpAsOqoOE0A8NpAsNqoOF0A8PpAsPqoOEMA8MZAsMaoOFMA8OZAsOaoOEsA8NZAsNaoOFsA8PZAsPaoOEcA8M5AsM6oOFcA8O5AsO6oOE8A8N5AsN6oOF8A8P5AsP6oOECA8MFAsMGoOFCA8OFAsOGoOEiA8NFAsNGoOFiA8PFAsPGoOESA8MlAsMmoOFSA8OlAsOmoOEyA8NlAsNmoOFyA8PlAsPmoOEKA8MVAsMWoOFKA8OVAsOWoOEqA8NVAsNWoOFqA8PVAsPWoOEaA8M1AsM2oOFaA8O1AsO2oOE6A8N1AsN2oOF6A8P1AsP2oOEGA8MNAsMOoOFGA8ONAsOOoOEmA8NNAsNOoOFmA8PNAsPOoOEWA8MtAsMuoOFWA8OtAsOuoOE2A8NtAsNuoOF2A8PtAsPuoOEOA8MdAsMeoOFOA8OdAsOeoOEuA8NdAsNeoOFuA8PdAsPeoOEeA8M9AsM+oOFeA8O9AsO+oOE+A8N9AsN+oOF+A8P9AsP+oOEBA8MDAsMBoOFBA8ODAsOBoOEhA8NDAsNBoOFhA8PDAsPBoOERA8MjAsMhoOFRA8OjAsOhoOExA8NjAsNhoOFxA8PjAsPhoOEJA8MTAsMRoOFJA8OTAsORoOEpA8NTAsNRoOFpA8PTAsPRoOEZA8MzAsMxoOFZA8OzAsOxoOE5A8NzAsNxoOF5A8PzAsPxoOEFA8MLAsMJoOFFA8OLAsOJoOElA8NLAsNJoOFlA8PLAsPJoOEVA8MrAsMpoOFVA8OrAsOpoOE1A8NrAsNpoOF1A8PrAsPpoOENA8MbAsMZoOFNA8ObAsOZoOEtA8NbAsNZoOFtA8PbAsPZoOEdA8M7AsM5oOFdA8O7AsO5oOE9A8N7AsN5oOF9A8P7AsP5oOEDA8MHAsMFoOFDA8OHAsOFoOEjA8NHAsNFoOFjA8PHAsPFoOETA8MnAsMloOFTA8OnAsOloOEzA8NnAsNloOFzA8PnAsPloOELA8MXAsMVoOFLA8OXAsOVoOErA8NXAsNVoOFrA8PXAsPVoOEbA8M3AsM1oOFbA8O3AsO1oOE7A8N3AsN1oOF7A8P3AsP1oOEHA8MPAsMNoOFHA8OPAsONoOEnA8NPAsNNoOFnA8PPAsPNoOEXA8MvAsMtoOFXA8OvAsOtoOE3A8NvAsNtoOF3A8PvAsPtoOEPA8MfAsMdoOFPA8OfAsOdoOEvA8NfAsNdoOFvA8PfAsPdoOEfA8M/AsM9oOFfA8O/AsO9oOE/A8N/AsN9oOF/Y/73Df+vkTbcDxoGMDAMIDA8ABoGNDAMKDA8CBoGMjAMJDA8BBoGNjAMLDA8DBoGMTAMIjA8AhoGNTAMKjA8ChoGMzAMJjA8BhoGNzAMLjA8DhqGMDAMITA8ARqGNDAMKTA8CRqGMjAMJTA8BRqGNjAMLTA8DRqGMTAMIzA8AxqGNTAMKzA8CxqGMzAMJzA8BxqGNzAMLzA8DxpGMDCMIDC8ABpGNDCMKDC8CBpGMjCMJDC8BBpGNjCMLDC8DBpGMTCMIjC8AhpGNTCMKjC8ChpGMzCMJjC8BhpGNzCMLjC8DhrGMDCMITC8ARrGNDCMKTC8CRrGMjCMJTC8BRrGNjCMLTC8DRrGMTCMIzC8AxrGNTCMKzC8CxrGMzCMJzC8BxrGNzCMLzC8DxomMDBMIDB8ABomNDBMKDB8CBomMjBMJDB8BBomNjBMLDB8DBomMTBMIjB8AhomNTBMKjB8ChomMzBMJjB8BhomNzBMLjB8DhqmMDBMITB8ARqmNDBMKTB8CRqmMjBMJTB8BRqmNjBMLTB8DRqmMTBMIzB8AxqmNTBMKzB8CxqmMzBMJzB8BxqmNzBMLzB8DxpmMDDMIDD8ABpmNDDMKDD8CBpmMjDMJDD8BBpmNjDMLDD8DBpmMTDMIjD8AhpmNTDMKjD8ChpmMzDMJjD8BhpmNzDMLjD8DhrmMDDMITD8ARrmNDDMKTD8CRrmMjDMJTD8BRrmNjDMLTD8DRrmMTDMIzD8AxrmNTDMKzD8Cxrm+x83/Fvtv//+/980+O6/apxhfoMd5hfs8L/qnGEBA8MCAsMAoGFBA8OCAsOAoGEhA8NCAsNAoGFhA8PCAsPAoGERA8MiAsMgoGFRA8OiAsOgoGExA8NiAsNgoGFxA8PiAsPgoGEJA8MSAsMQoGFJA8OSAsOQoGEpA8NSAsNQoGFpA8PSAsPQoGEZA8MyAsMwoGFZA8OyAsOwoGE5A8NyAsNwoGF5A8PyAsPwoGEFA8MKAsMIoGFFA8OKAsOIoGElA8NKAsNIoGFlA8PKAsPIoGEVA8MqAsMooGFVA8OqAsOooGE1A8NqAsNooGF1A8PqAsPooGENA8MaAsMYoGFNA8OaAsOYoGEtA8NaAsNYoGFtA8PaAsPYoGEdA8M6AsM4oGFdA8O6AsO4oGE9A8N6AsN4oGF9A8P6AsP4oGEDA8MGAsMEoGFDA8OGAsOEoGEjA8NGAsNEoGFjA8PGAsPEoGETA8MmAsMkoGFTA8OmAsOkoGEzA8NmAsNkoGFzA8PmAsPkoGELA8MWAsMUoGFLA8OWAsOUoGErA8NWAsNUoGFrA8PWAsPUoGEbA8M2AsM0oGFbA8O2AsO0oGE7A8N2AsN0oGF7A8P2AsP0oGEHA8MOAsMMoGFHA8OOAsOMoGEnA8NOAsNMoGFnA8POAsPMoGEXA8MuAsMsoGFXA8OuAsOsoGE3A8NuAsNsoGF3A8PuAsPsoGEPA8MeAsMcoGFPA8OeAsOcoGEvA8NeAsNcoGFvA8PeAsPcoGEfA8M+AsM8oGFfA8O+AsO8oGE/A8N+AsN8oGF/A8P+AsP8oOEAA8MBAsMCoOFAA8OBAsOCoOEgA8NBAsNCoOFgA8PBAsPCoOEQA8MhAsMioOFQA8OhAsOioOEwA8NhAsNioOFwA8PhAsPioOEIA8MRAsMSoOFIA8ORAsOSoOEoA8NRAsNSoOFoA8PRAsPSoOEYA8MxAsMyoOFYA8OxAsOyoOE4A8NxAsNyoOF4A8PxAsPyoOEEA8MJAsMKoOFEA8OJAsOKoOEkA8NJAsNKoOFkA8PJAsPKoOEUA8MpAsMqoOFUA8OpAsOqoOE0A8NpAsNqoOF0A8PpAsPqoOEMA8MZAsMaoOFMA8OZAsOaoOEsA8NZAsNaoOFsA8PZAsPaoOEcA8M5AsM6oOFcA8O5AsO6oOE8A8N5AsN6oOF8A8P5AsP6oOECA8MFAsMGoOFCA8OFAsOGoOEiA8NFAsNGoOFiA8PFAsPGoOESA8MlAsMmoOFSA8OlAsOmoOEyA8NlAsNmoOFyA8PlAsPmoOEKA8MVAsMWoOFKA8OVAsOWoOEqA8NVAsNWoOFqA8PVAsPWoOEaA8M1AsM2oOFaA8O1AsO2oOE6A8N1AsN2oOF6A8P1AsP2oOEGA8MNAsMOoOFGA8ONAsOOoOEmA8NNAsNOoOFmA8PNAsPOoOEWA8MtAsMuoOFWA8OtAsOuoOE2A8NtAsNuoOF2A8PtAsPuoOEOA8MdAsMeoOFOA8OdAsOeoOEuA8NdAsNeoOFuA8PdAsPeoOEeA8M9AsM+oOFeA8O9AsO+oOE+A8N9AsN+oOF+A8P9AsP+oOEBA8MDAsMBoOFBA8ODAsOBoOEhA8NDAsNBoOFhA8PDAsPBoOERA8MjAsMhoOFRA8OjAsOhoOExA8NjAsNhoOFxA8PjAsPhoOEJA8MTAsMRoOFJA8OTAsORoOEpA8NTAsNRoOFpA8PTAsPRoOEZA8MzAsMxoOFZA8OzAsOxoOE5A8NzAsNxoOF5A8PzAsPxoOEFA8MLAsMJoOFFA8OLAsOJoOElA8NLAsNJoOFlA8PLAsPJoOEVA8MrAsMpoOFVA8OrAsOpoOE1A8NrAsNpoOF1A8PrAsPpoOENA8MbAsMZoOFNA8ObAsOZoOEtA8NbAsNZoOFtA8PbAsPZoOEdA8M7AsM5oOFdA8O7AsO5oOE9A8N7AsN5oOF9A8P7AsP5oOEDA8MHAsMFoOFDA8OHAsOFoOEjA8NHAsNFoOFjA8PHAsPFoOETA8MnAsMloOFTA8OnAsOloOEzA8NnAsNloOFzA8PnAsPloOELA8MXAsMVoOFLA8OXAsOVoOErA8NXAsNVoOFrA8PXAsPVoOEbA8M3AsM1oOFbA8O3AsO1oOE7A8N3AsN1oOF7A8P3AsP1oOEHA8MPAsMNoOFHA8OPAsONoOEnA8NPAsNNoOFnA8PPAsPNoOEXA8MvAsMtoOFXA8OvAsOtoOE3A8NvAsNtoOF3A8PvAsPtoOEPA8MfAsMdoOFPA8OfAsOdoOEvA8NfAsNdoOFvA8PfAsPdoOEfA8M/AsM9oOFfA8O/AsO9oOE/A8N/AsN9oOF/Y//3Df+vkTbcDxoGMDAMIDA8ABoGNDAMKDA8CBoGMjAMJDA8BBoGNjAMLDA8DBoGMTAMIjA8AhoGNTAMKjA8ChoGMzAMJjA8BhoGNzAMLjA8DhqGMDAMITA8ARqGNDAMKTA8CRqGMjAMJTA8BRqGNjAMLTA8DRqGMTAMIzA8AxqGNTAMKzA8CxqGMzAMJzA8BxqGNzAMLzA8DxpGMDCMIDC8ABpGNDCMKDC8CBpGMjCMJDC8BBpGNjCMLDC8DBpGMTCMIjC8AhpGNTCMKjC8ChpGMzCMJjC8BhpGNzCMLjC8DhrGMDCMITC8ARrGNDCMKTC8CRrGMjCMJTC8BRrGNjCMLTC8DRrGMTCMIzC8AxrGNTCMKzC8CxrGMzCMJzC8BxrGNzCMLzC8DxomMDBMIDB8ABomNDBMKDB8CBomMjBMJDB8BBomNjBMLDB8DBomMTBMIjB8AhomNTBMKjB8ChomMzBMJjB8BhomNzBMLjB8DhqmMDBMITB8ARqmNDBMKTB8CRqmMjBMJTB8BRqmNjBMLTB8DRqmMTBMIzB8AxqmNTBMKzB8CxqmMzBMJzB8BxqmNzBMLzB8DxpmMDDMIDD8ABpmNDDMKDD8CBpmMjDMJDD8BBpmNjDMLDD8DBpmMTDMIjD8AhpmNTDMKjD8ChpmMzDMJjD8BhpmNzDMLjD8DhrmMDDMITD8ARrmNDDMKTD8CRrmMjDMJTD8BRrmNjDMLTD8DRrmMTDMIzD8AxrmNTDMKzD8CxrmMzDMJzD8BxrmNzDMLzD8rwZnWMDAsIDAMABoWNDAsKDAMCBoWMjAsJDAMBBoWNjAsLDAMDBoWMTAsIjAMAhoWNTAsKjAMChoWMzAsJjAMBhoWNzAsLjAMDhoWMLAsITAMARoWNLAsKTAMCRoWMrAsJTAMBRoWNrAsLTAMDRoWMbAsIzAMAxoWNbAsKzAMCxoWM7AsJzAMBxoWN7AsLzAMDxoWMHAsILAMAJoWNHAsKLAMCJoWMnAsJLAMBJoWNnAsLLAMDJoWMXAsIrAMApoWNXAsKrAMCpoWM3AsJrAMBpoWN3AsLrAMDpoWMPAsIbAMAZoWNPAsKbAMCZoWMvAsJbAMBZoWNvAsLbAMDZoWMfAsI7AMA5oWNfAsK7AMC5oWM/AsJ7AMB5oWN/AsL7AMD5o2MDAsIHAMAFo2NDAsKHAMCFo2MjAsJHAMBFo2NjAsLHAMDFo2MTAsInAMAlo2NTAsKnAMClo2MzAsJnAMBlo2NzAsLnAMDlo2MLAsIXAMAVo2NLAsKXAMCVo2MrAsJXAMBVo2NrAsLXAMDVo2MbAsI3AMA1o2NbAsK3AMC1o2M7AsJ3AMB1o2N7AsL3AMD1o2MHAsIPAMANo2NHAsKPAMCNo2MnAsJPAMBNo2NnAsLPAMDNo2MXAsIvAMAto2NXAsKvAMCto2M3AsJvAMBto2N3AsLvAMDto2MPAsIfAMAdo2NPAsKfAMCdo2MvAsJfAMBdo2NvAsLfAMDdo2MfAsI/AMA9o2NfAsK/AMC9o2M/AsJ/AMB9o2N/AsL/AMD9oOMDAcIDAsABoONDAcKDAsCBoOMjAcJDAsBBoONjAcLDAsDBoOMTAcIjAsAhoONTAcKjAsChoOMzAcJjAsBhoONzAcLjAsDhoOMLAcITAsARoONLAcKTAsCRoOMrAcJTAsBRoONrAcLTAsDRoOMbAcIzAsAxoONbAcKzAsCxoOM7AcJzAsBxoON7AcLzAsDxoOMHAcILAsAJoONHAcKLAsCJoOMnAcJLAsBJoONnAcLLAsDJoOMXAcIrAsApoONXAcKrAsCpoOM3AcJrAsBpoON3AcLrAsDpoOMPAcIbAsAZoONPAcKbAsCZoOMvAcJbAsBZoONvAcLbAsDZoOMfAcI7AsA5oONfAcK7AsC5oOM/AcJ7AsB5oON/AcL7AsD5ouMDAcIHAsAFouNDAcKHAsCFouMjAcJHAsBFouNjAcLHAsDFouMTAcInAsAlouNTAcKnAsClouMzAcJnAsBlouNzAcLnAsDlouMLAcIXAsAVouNLAcKXAsCVouMrAcJXAsBVouNrAcLXAsDVouMbAcI3AsA1ouNbAcK3AsC1ouM7AcJ3AsB1ouN7AcL3AsD1ouMHAcIPAsANouNHAcKPAsCNouMnAcJPAsBNouNnAcLPAsDNouMXAcIvAsAtouNXAcKvAsCtouM3AcJvAsBtouN3AcLvAsDtouMPAcIfAsAdouNPAcKfAsCdouMvAcJfAsBdouNvAcLfAsDdouMfAcI/AsA9ouNfAcK/AsC9ouM/AcJ/AsB9ouN/AcL/AsD9oeMDA8IDAcABoeNDA8KDAcCBoeMjA8JDAcBBoeNjA8LDAcDBoeMTA8IjAcAhoeNTA8KjAcChoeMzA8JjAcBhoeNzA8LjAcDhoeMLA8ITAcARoeNLA8KTAcCRoeMrA8JTAcBRoeNrA8LTAcDRoeMbA8IzAcAxoeNbA8KzAcCxoeM7A8JzAcBxoeN7A8LzAcDxoeMHA8ILAcAJoeNHA8KLAcCJoeMnA8JLAcBJoeNnA8LLAcDJoeMXA8IrAcApoeNXA8KrAcCpoeM3A8JrAcBpoeN3A8LrAcDpoeMPA8IbAcAZoeNPA8KbAcCZoeMvA8JbAcBZoeNvA8LbAcDZoeMfA8I7AcA5oeNfA8K7AcC5oeM/A8J7AcB5oeN/A8L7AcD5o+MDA8IHAcAFo+NDA8KHAcCFo+MjA8JHAcBFo+NjA8LHAcDFo+MTA8InAcAlo+NTA8KnAcClo+MzA8JnAcBlo+NzA8LnAcDlo+MLA8IXAcAVo+NLA8KXAcCVo+MrA8JXAcBVo+NrA8LXAcDVo+MbA8I3AcA1o+NbA8K3AcC1o+M7A8J3AcB1o+N7A8L3AcD1o+MHA8IPAcANo+NHA8KPAcCNo+MnA8JPAcBNo+NnA8LPAcDNo+MXA8IvAcAto+NXA8KvAcCto+M3A8JvAcBto+N3A8LvAcDto+MPA8IfAcAdo+NPA8KfAcCdo+MvA8JfAcBdo+NvA8LfAcDdo+MfA8I/AcA9o+NfA8K/AcC9o+M/A8J/AcB9o+N+4/33D/2ukDfeDhgEMDAMIDA+AhgENDAMKDA+ChoEMDAMJDA+BhoENDAMLDA+DhkEMDIMIDI+AhkENDIMKDI+ChsEMDIMJDI+BhsENDIMLDI+DhiEMDEMIDE+AhiENDEMKDE+ChqEMDEMJDE+BhqENDEMLDE+DhmEMDMMIDM+AhmENDMMKDM+ChuEMDMMJDM+BhuENDMMLDM+DhhEMDCMIDC+AhhENDCMKDC+ChpEMDCMJDC+BhpENDCMLDC+DhlEMDKMIDK+AhlENDKMKDK+ChtEMDKMJDK+BhtENDKMLDK+DhjEMDGMIDG+AhjENDGMKDG+ChrEMDGMJDG+BhrENDGMLDG+DhnEMDOMIDO+AhnENDOMKDO+ChvEMDOMJDO+BhvENDOMLDO+DhgkMDBMIDB+AhgkNDBMKDB+ChokMDBMJDB+BhokNDBMLDB+DhkkMDJMIDJ+AhkkNDJMKDJ+ChskMDJMJDJ+BhskNDJMLDJ+DhikMDFMIDF+AhikNDFMKDF+ChqkMDFMJDF+BhqkNDFMLDF+DhmkMDNMIDN+AhmkNDNMKDN+ChukMDNMJDN+BhukNDNMLDN+DhhkMDDMIDD+AhhkNDDMKDD+ChpkMDDMJDD+BhpkNDDMLDD+DhlkMDLMIDL+AhlkNDLMKDL+ChtkMDLMJDL+BhtkNDLMLDL+DhjkMDHMIDH+AhjkNDHMKDH+ChrkMDHMJDH+BhrkNDHMLDH+DhnkMDPMIDP+AhnkNDPMKDP+ChvkMDPMJDP+BhvkNDPMLDP+ryRkWMDAsIDAMABoWNDAsKDAMCBoWMjAsJDAMBBoWNjAsLDAMDBoWMTAsIjAMAhoWNTAsKjAMChoWMzAsJjAMBhoWNzAsLjAMDhqWMDAsITAMARqWNDAsKTAMCRqWMjAsJTAMBRqWNjAsLTAMDRqWMTAsIzAMAxqWNTAsKzAMCxqWMzAsJzAMBxqWNzAsLzAMDxpWMDCsIDCMABpWNDCsKDCMCBpWMjCsJDCMBBpWNjCsLDCMDBpWMTCsIjCMAhpWNTCsKjCMChpWMzCsJjCMBhpWNzCsLjCMDhrWMDCsITCMARrWNDCsKTCMCRrWMjCsJTCMBRrWNjCsLTCMDRrWMTCsIzCMAxrWNTCsKzCMCxrWMzCsJzCMBxrWNzCsLzCMDxo2MDBsIDBMABo2NDBsKDBMCBo2MjBsJDBMBBo2NjBsLDBMDBo2MTBsIjBMAho2NTBsKjBMCho2MzBsJjBMBho2NzBsLjBMDhq2MDBsITBMARq2NDBsKTBMCRq2MjBsJTBMBRq2NjBsLTBMDRq2MTBsIzBMAxq2NTBsKzBMCxq2MzBsJzBMBxq2NzBsLzBMDxp2MDDsIDDMABp2NDDsKDDMCBp2MjDsJDDMBBp2NjDsLDDMDBp2MTDsIjDMAhp2NTDsKjDMChp2MzDsJjDMBhp2NzDsLjDMDhr2MDDsITDMARr2NDDsKTDMCRr2MjDsJTDMBRr2NjDsLTDMDRr2MTDsIzDMAxr2NTDsKzDMCxr2MzDsJzDMBxr2NzDsLzDMDxoOMDAcIDAsABoONDAcKDAsCBoOMjAcJDAsBBoONjAcLDAsDBoOMTAcIjAsAhoONTAcKjAsChoOMzAcJjAsBhoONzAcLjAsDhqOMDAcITAsARqONDAcKTAsCRqOMjAcJTAsBRqONjAcLTAsDRqOMTAcIzAsAxqONTAcKzAsCxqOMzAcJzAsBxqONzAcLzAsDxpOMDCcIDCsABpONDCcKDCsCBpOMjCcJDCsBBpONjCcLDCsDBpOMTCcIjCsAhpONTCcKjCsChpOMzCcJjCsBhpONzCcLjCsDhrOMDCcITCsARrONDCcKTCsCRrOMjCcJTCsBRrONjCcLTCsDRrOMTCcIzCsAxrONTCcKzCsCxrOMzCcJzCsBxrONzCcLzCsDxouMDBcIDBsABouNDBcKDBsCBouMjBcJDBsBBouNjBcLDBsDBouMTBcIjBsAhouNTBcKjBsChouMzBcJjBsBhouNzBcLjBsDhquMDBcITBsARquNDBcKTBsCRquMjBcJTBsBRquNjBcLTBsDRquMTBcIzBsAxquNTBcKzBsCxquMzBcJzBsBxquNzBcLzBsDxpuMDDcIDDsABpuNDDcKDDsCBpuMjDcJDDsBBpuNjDcLDDsDBpuMTDcIjDsAhpuNTDcKjDsChpuMzDcJjDsBhpuNzDcLjDsDhruMDDcITDsARruNDDcKTDsCRruMjDcJTDsBRruNjDcLTDsDRruMTDcIzDsAxruNTDcKzDsCxruMzDcJzDsBxruNzDcLzDsDxoeMDA8IDAcABoeNDA8KDAcCBoeMjA8JDAcBBoeNjA8LDAcDBoeMTA8IjAcAhoeNTA8KjAcChoeMzA8JjAcBhoeNzA8LjAcDhqeMDA8ITAcARqeNDA8KTAcCRqeMjA8JTAcBRqeNjA8LTAcDRqeMTA8IzAcAxqeNTA8KzAcCxqeMzA8JzAcBxqeNzA8LzAcDxpeMDC8IDCcABpeNDC8KDCcCBpeMjC8JDCcBBpeNjC8LDCcDBpeMTC8IjCcAhpeNTC8KjCcChpeMzC8JjCcBhpeNzC8LjCcDhreMDC8ITCcARreNDC8KTCcCRreMjC8JTCcBRreNjC8LTCcDRreMTC8IzCcAxreNTC8KzCcCxreMzC8JzCcBxreNzC8LzCcDxo+MDB8IDBcABo+NDB8KDBcCBo+MjB8JDBcBBo+NjB8LDBcDBo+MTB8IjBcAho+NTB8KjBcCho+MzB8JjBcBho+NzB8LjBcDhq+MDB8ITBcARq+NDB8KTBcCRq+MjB8JTBcBRq+NjB8LTBcDRq+MTB8IzBcAxq+NTB8KzBcCxq+MzB8JzBcBxq+NzB8LzBcDxp+MDD8IDDcABp+NDD8KDDcCBp+MjD8JDDcBBp+NjD8LDDcDBp+MTD8IjDcAhp+NTD8KjDcChp+MzD8JjDcBhp+NzD8LjDcDhr+MDD8ITDcARr+NDD8KTDcCRr+MjD8JTDcBRr+NjD8LTDcDRr+MTD8IzDcAxr+NTD8KzDcCxr+MzD8JzDcBxr+N/5/3/D/GmnD/aBhAAPDAALDA6BhQAPDgALDg6BhIAPDQALDQ6BhYAPDwALDw6BhEAPDIALDI6BhUAPDoALDo6BhMAPDYALDY6BhcAPD4ALD46BhCAPDEALDE6BhSAPDkALDk6BhKAPDUALDU6BhaAPD0ALD06BhGAPDMALDM6BhWAPDsALDs6BhOAPDcALDc6BheAPD8ALD86BhBAPDCALDC6BhRAPDiALDi6BhJAPDSALDS6BhZAPDyALDy6BhFAPDKALDK6BhVAPDqALDq6BhNAPDaALDa6BhdAPD6ALD66BhDAPDGALDG6BhTAPDmALDm6BhLAPDWALDW6BhbAPD2ALD26BhHAPDOALDO6BhXAPDuALDu6BhPAPDeALDe6BhfAPD+ALD+6BhAgPDBALDB6BhQgPDhALDh6BhIgPDRALDR6BhYgPDxALDx6BhEgPDJALDJ6BhUgPDpALDp6BhMgPDZALDZ6BhcgPD5ALD56BhCgPDFALDF6BhSgPDlALDl6BhKgPDVALDV6BhagPD1ALD16BhGgPDNALDN6BhWgPDtALDt6BhOgPDdALDd6BhegPD9ALD96BhBgPDDALDD6BhRgPDjALDj6BhJgPDTALDT6BhZgPDzALDz6BhFgPDLALDL6BhVgPDrALDr6BhNgPDbALDb6BhdgPD7ALD76BhDgPDHALDH6BhTgPDnALDn6BhLgPDXALDX6BhbgPD3ALD36BhHgPDPALDP6BhXgPDvALDv6BhPgPDfALDf6BhfgPD/ALD/2pxhgUMDAsIDAOAhgUNDAsKDAOChoUMDAsJDAOBhoUNDAsLDAODhkUMDIsIDIOAhkUNDIsKDIOChsUMDIsJDIOBhsUNDIsLDIODhiUMDEsIDEOAhiUNDEsKDEOChqUMDEsJDEOBhqUNDEsLDEODhmUMDMsIDMOAhmUNDMsKDMOChuUMDMsJDMOBhuUNDMsLDMODhhUMDCsIDCOAhhUNDCsKDCOChpUMDCsJDCOBhpUNDCsLDCODhlUMDKsIDKOAhlUNDKsKDKOChtUMDKsJDKOBhtUNDKsLDKODhjUMDGsIDGOAhjUNDGsKDGOChrUMDGsJDGOBhrUNDGsLDGODhnUMDOsIDOOAhnUNDOsKDOOChvUMDOsJDOOBhvUNDOsLDOODhg0MDBsIDBOAhg0NDBsKDBOCho0MDBsJDBOBho0NDBsLDBODhk0MDJsIDJOAhk0NDJsKDJOChs0MDJsJDJOBhs0NDJsLDJODhi0MDFsIDFOAhi0NDFsKDFOChq0MDFsJDFOBhq0NDFsLDFODhm0MDNsIDNOAhm0NDNsKDNOChu0MDNsJDNOBhu0NDNsLDNODhh0MDDsIDDOAhh0NDDsKDDOChp0MDDsJDDOBhp0NDDsLDDODhl0MDLsIDLOAhl0NDLsKDLOCht0MDLsJDLOBht0NDLsLDLODhj0MDHsIDHOAhj0NDHsKDHOChr0MDHsJDHOBhr0NDHsLDHODhn0MDPsIDPOAhn0NDPsKDPOChv0MDPsJDPOBhv0NDPsLDPODhgMMDAcIDAuAhgMNDAcKDAuChoMMDAcJDAuBhoMNDAcLDAuDhkMMDIcIDIuAhkMNDIcKDIuChsMMDIcJDIuBhsMNDIcLDIuDhiMMDEcIDEuAhiMNDEcKDEuChqMMDEcJDEuBhqMNDEcLDEuDhmMMDMcIDMuAhmMNDMcKDMuChuMMDMcJDMuBhuMNDMcLDMuDhhMMDCcIDCuAhhMNDCcKDCuChpMMDCcJDCuBhpMNDCcLDCuDhlMMDKcIDKuAhlMNDKcKDKuChtMMDKcJDKuBhtMNDKcLDKuDhjMMDGcIDGuAhjMNDGcKDGuChrMMDGcJDGuBhrMNDGcLDGuDhnMMDOcIDOuAhnMNDOcKDOuChvMMDOcJDOuBhvMNDOcLDOuDhgsMDBcIDBuAhgsNDBcKDBuChosMDBcJDBuBhosNDBcLDBuDhksMDJcIDJuAhksNDJcKDJuChssMDJcJDJuBhssNDJcLDJuDhisMDFcIDFuAhisNDFcKDFuChqsMDFcJ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NjUwbCowTAoaNjMwbCYwTAYaNjcwbC4wTA4atjAwbCEwTAEatjQwbCkwTAkatjIwbCUwTAUatjYwbC0wTA0atjEwbCMwTAMatjUwbCswTAsatjMwbCcwTAcatjcwbC8wTA8adjAw7CAwzAAadjQw7CgwzAgadjIw7CQwzAQadjYw7CwwzAwadjEw7CIwzAIadjUw7CowzAoadjMw7CYwzAYadjcw7C4wzA4a9jAw7CEwzAEa9jQw7CkwzAka9jIw7CUwzAUa9jYw7C0wzA0a9jEw7CMwzAMa9jUw7CswzAsa9jMw7CcwzAca9jcw7C8wzA8aDjAwHCAwLAAaDjQwHCgwLAgaDjIwHCQwLAQaDjYwHCwwLAwaDjEwHCIwLAIaDjUwHCowLAoaDjMwHCYwLAYaDjcwHC4wLA4ajjAwHCEwLAEajjQwHCkwLAkajjIwHCUwLAUajjYwHC0wLA0ajjEwHCMwLAMajjUwHCswLAsajjMwHCcwLAcajjcwHC8wLA8aTjAwnCAwrAAaTjQwnCgwrAgaTjIwnCQwrAQaTjYwnCwwrAwaTjEwnCIwrAIaTjUwnCowrAoaTjMwnCYwrAYaTjcwnC4wrA4azjAwnCEwrAEazjQwnCkwrAkazjIwnCUwrAUazjYwnC0wrA0azjEwnCMwrAMazjUwnCswrAsazjMwnCcwrAcazjcwnC8wrA8aLjAwXCAwbAAaLjQwXCgwbAgaLjIwXCQwbAQaLjYwXCwwbAwaLjEwXCIwbAIaLjUwXCowbAoaLjMwXCYwbAYaLjcwXC4wbA4arjAwXCEwbAEarjQwXCkwbAkarjIwXCUwbAUarjYwXC0wbA0arjEwXCMwbAMarjUwXCswbAsarjMwXCcwbAcarjcwXC8wbA8abjAw3CAw7AAabjQw3Cgw7AgabjIw3CQw7AQabjYw3Cww7AwabjEw3CIw7AIabjUw3Cow7AoabjMw3CYw7AYabjcw3C4w7A4a7jAw3CEw7AEa7jQw3Ckw7Aka7jIw3CUw7AUa7jYw3C0w7A0a7jEw3CMw7AMa7jUw3Csw7Asa7jMw3Ccw7Aca7jcw3C8w7A8aHjAwPCAwHAAaHjQwPCgwHAgaHjIwPCQwHAQaHjYwPCwwHAwaHjEwPCIwHAIaHjUwPCowHAoaHjMwPCYwHAYaHjcwPC4wHA4anjAwPCEwHAEa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CAwrgIYTDQwnCgwrgoaTDAwnCQwrgYaTDQwnCwwrg4ZTDAynCAyrgIZTDQynCgyrgobTDAynCQyrgYbTDQynCwyrg4YzDAxnCAxrgIYzDQxnCgxrgoazDAxnCQxrgYazDQxnCwxrg4ZzDAznCAzrgIZzDQznCgzrgobzDAznCQzrgYbzDQznCwzrg4YLDAwXCAwbgIYLDQwXCgwbgoaLDAwXCQwbgYaLDQwXCwwbg4ZLDAyXCAybgIZLDQyXCgybgobLDAyXCQybgYbLDQyXCwybg4YrDAxXCAxbgIYrDQxXCgxbgoarDAxXCQxbgYarDQxXCwxbg4ZrDAzXCAzbgIZrDQzXCgzbgobrDAzXCQzbgYbrDQzXCwzbg4YbDAw3CAw7gIYbDQw3Cgw7goabDAw3CQw7gYabDQw3Cww7g4ZbDAy3CAy7gIZbDQy3Cgy7gobbDAy3CQy7gYbbDQy3Cwy7g4Y7DAx3CAx7gIY7DQx3Cgx7goa7DAx3CQx7gYa7DQx3Cwx7g4Z7DAz3CAz7gIZ7DQz3Cgz7gob7DAz3CQz7gYb7DQz3Cwz7g4YHDAwPCAwHgIYHDQwPCgwHgoaHDAwPCQwHgYaHDQwPCwwHg4ZHDAyPCAyHgIZHDQyPCgyHgobHDAyPCQyHgYbHDQyPCwyHg4YnDAxPCAxHgIYnDQxPCgxHgoanDAxPCQxHgYanDQxPCwxHg4ZnDAzPCAzHgIZnDQzPCgzHgobnDAzPCQzHgYbnDQzPCwzHg4YXDAwvCAwngIYXDQwvCgwngoaXDAwvCQwngYaXDQwvCwwng4ZXDAyvCAyngIZXDQyvCgyngobXDAyvCQyngYbXDQyvCwyng4Y3DAxvCAxngIY3DQxvCgxngoa3DAxvCQxngYa3DQxvCwxng4Z3DAzvCAzngIZ3DQzvCgzngob3DAzvCQzngYb3DQzvCwzng4YPDAwfCAwXgIYPDQwfCgwXgoaPDAwfCQwXgYaPDQwfCwwXg4ZPDAyfCAyXgIZPDQyfCgyXgobPDAyfCQyXgYbPDQyfCwyXg4YvDAxfCAxXgIYvDQxfCgxXgoavDAxfCQxXgYavDQxfCwxXg4ZvDAzfCAzXgIZvDQzfCgzXgobvDAzfCQzXgYbvDQzfCwzXg4YfDAw/CAw3gIYfDQw/Cgw3goafDAw/CQw3gYafDQw/Cww3g4ZfDAy/CAy3gIZfDQy/Cgy3gobfDAy/CQy3gYbfDQy/Cwy3g4Y/DAx/CAx3gIY/DQx/Cgx3goa/DAx/CQx3gYa/DQx/Cwx3g4Z/DAz/CAz3gIZ/DQz/Cgz3gob/DAz/CQz3gYb/TfnfN/y/RtpwP2gYwMAwgMDwAGgY0MAwoMDwIGgYyMAwkMDwEGgY2MAwsMDwMGgYxMAwiMDwCGgY1MAwqMDwKGgYzMAwmMDwGGgY3MAwuMDwOGgYwsAwhMDwBGgY0sAwpMDwJGgYysAwlMDwFGgY2sAwtMDwNGgYxsAwjMDwDGgY1sAwrMDwLGgYzsAwnMDwHGgY3sAwvMDwPGgYwcAwgsDwAmgY0cAwosDwImgYycAwksDwEmgY2cAwssDwMmgYxcAwisDwCmgY1cAwqsDwKmgYzcAwmsDwGmgY3cAwusDwOmgYw8AwhsDwBmgY08AwpsDwJmgYy8AwlsDwFmgY28AwtsDwNmgYx8AwjsDwDmgY18AwrsDwLmgYz8AwnsDwHmgY38AwvsDwPmiYwMAwgcDwAWiY0MAwocDwIWiYyMAwkcDwEWiY2MAwscDwMWiYxMAwicDwCWiY1MAwqcDwKWiYzMAwmcDwGWiY3MAwucDwOWiYwsAwhcDwBWiY0sAwpcDwJWiYysAwlcDwFWiY2sAwtcDwNWiYxsAwjcDwDWiY1sAwrcDwLWiYzsAwncDwHWiY3sAwvcDwPWiYwcAwg8DwA2iY0cAwo8DwI2iYycAwk8DwE2iY2cAws8DwM2iYxcAwi8DwC2iY1cAwq8DwK2iYzcAwm8DwG2iY3cAwu8DwO2iYw8Awh8DwB2iY08Awp8DwJ2iYy8Awl8DwF2iY28Awt8DwN2iYx8Awj8DwD2iY18Awr8DwL2iYz8Awn8DwH2iY38Awv8Dwv/qcYQEDwwICwwCgYUEDw4ICw4CgYSEDw0ICw0CgYWEDw8ICw8CgYREDwyICwyCgYVEDw6ICw6CgYTEDw2ICw2CgYXEDw+ICw+CgYQkDwxICwxCgYUkDw5ICw5CgYSkDw1ICw1CgYWkDw9ICw9CgYRkDwzICwzCgYVkDw7ICw7CgYTkDw3ICw3CgYXkDw/ICw/CgYQUDwwoCwwigYUUDw4oCw4igYSUDw0oCw0igYWUDw8oCw8igYRUDwyoCwyigYVUDw6oCw6igYTUDw2oCw2igYXUDw+oCw+igYQ0DwxoCwxigYU0Dw5oCw5igYS0Dw1oCw1igYW0Dw9oCw9igYR0DwzoCwzj1OcO6BoZ1BYZxQcN6Bob1BIbxQMP6Bob1BYbxQcMGBoYNBIYJQMOGBoYNBYYJQcNGBoaNBIaJQMPGBoaNBYaJQcMmBoZNBIZJQMOmBoZNBYZJQcNmBobNBIbJQMPmBobNBYbJQcMWBoYtBIYpQMOWBoYtBYYpQcNWBoatBIapQMPWBoatBYapQcM2BoZtBIZpQMO2BoZtBYZpQcN2BobtBIbpQMP2BobtBYbpQcMOBoYdBIYZQMOOBoYdBYYZQcNOBoadBIaZQMPOBoadBYaZQcMuBoZdBIZZQMOuBoZdBYZZQcNuBobdBIbZQMPuBobdBYbZQcMeBoY9BIY5QMOeBoY9BYY5QcNeBoa9BIa5QMPeBoa9BYa5QcM+BoZ9BIZ5QMO+BoZ9BYZ5QcN+Bob9BIb5QMP+Bob9BYb5QcMBBoYDBIYFQMOBBoYDBYYFQcNBBoaDBIaFQMPBBoaDBYaFQcMhBoZDBIZFQMOhBoZDBYZFQcNhBobDBIbFQMPhBobDBYbFQcMRBoYjBIYlQMORBoYjBYYlQcNRBoajBIalQMPRBoajBYalQcMxBoZjBIZlQMOxBoZjBYZlQcNxBobjBIblQMPxBobjBYblQcMJBoYTBIYVQMOJBoYTBYYVQcNJBoaTBIaVQMPJBoaTBYaVQcMpBoZTBIZVQMOpBoZTBYZVQcNpBobTBIbVQMPpBobTBYbVQcMZBoYzBIY1QMOZBoYzBYY1QcNZBoazBIa1QMPZBoazBYa1QcM5BoZzBIZ1QMO5BoZzBYZ1QcN5BobzBIb1QMP5BobzBYb1QcMFBoYLBIYNQMOFBoYLBYYNQcNFBoaLBIaNQMPFBoaLBYaNQcMlBoZLBIZNQMOlBoZLBYZNQcNlBobLBIbNQMPlBobLBYbNQcMVBoYrBIYtQMOVBoYrBYYtQcNVBoarBIatQMPVBoarBYatQcM1BoZrBIZtQMO1BoZrBYZtQcN1BobrBIbtQMP1BobrBYbtQcMNBoYbBIYdQMONBoYbBYYdQcNNBoabBIadQMPNBoabBYadQcMtBoZbBIZdQMOtBoZbBYZdQcNtBobbBIbdQMPtBobbBYbdQcMdBoY7BIY9QMOdBoY7BYY9QcNdBoa7BIa9QMPdBoa7BYa9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BhpWNzCsLjCMDhrWMDCsITCMARrWNDCsKTCMCRrWMjCsJTCMBRrWNjCsLTCMDRrWMTCsIzCMAxrWNTCsKzCMCxrWMzCsJzCMBxrWNzCsLzCMDxo2MDBsIDBMABo2NDBsKDBMCBo2MjBsJDBMBBo2NjBsLDBMDBo2MTBsIjBMAho2NTBsKjBMCho2MzBsJjBMBho2NzBsLjBMDhq2MDBsITBMARq2NDBsKTBMCRq2MjBsJTBMBRq2NjBsLTBMDRq2MTBsIzBMAxq2NTBsKzBMCxq2MzBsJzBMBxq2NzBsLzBMDxp2MDDsIDDMABp2NDDsKDDMCBp2MjDsJDDMBBp2NjDsLDDMDBp2MTDsIjDMAhp2NTDsKjDMChp2MzDsJjDMBhp2NzDsLjDMDhr2MDDsITDMARr2NDDsKTDMCRr2MjDsJTDMBRr2NjDsLTDMDRr2MTDsIzDMAxr2NTDsKzDMCxr2MzDsJzDMBxr2NzDsLzDMDxoOMDAcIDAsABoONDAcKDAsCBoOMjAcJDAsBBoONjAcLDAsDBoOMTAcIjAsAhoONTAcKjAsChoOMzAcJjAsBhoONzAcLjAsDhqOMDAcITAsARqONDAcKTAsCRqOMjAcJTAsBRqONjAcLTAsDRqOMTAcIzAsAxqONTAcKzAsCxqOMzAcJzAsBxqONzAcLzAsDxpOMDCcIDCsABpONDCcKDCsCBpOMjCcJDCsBBpONjCcLDCsDBpOMTCcIjCsAhpONTCcKjCsChpOMzCcJjCsBhpONzCcLjCsDhrOMDCcITCsARrONDCcKTCsCRrOMjCcJTCsBRrONjCcLTCsDRrOMTCcIzCsAxrONTCcKzCsCxrOMzCcJzCsBxrONzCcLzCsDxouMDBcIDBsABouNDBcKDBsCBouMjBcJDBsBBouNjBcLDBsDBouMTBcIjBsAhouNTBcKjBsChouMzBcJjBsBhouNzBcLjBsDhquMDBcITBsARquNDBcKTBsCRquMjBcJTBsBRquNjBcLTBsDRquMTBcIzBsAxquNTBcKzBsCxquMzBcJzBsBxquNzBcLzBsDxpuMDDcIDDsABpuNDDcKDDsCBpuMjDcJDDsBBpuNjDcLDDsDBpuMTDcIjDsAhpuNTDcKjDsChpuMzDcJjDsBhpuNzDcLjDsDhruMDDcITDsARruNDDcKTDsCRruMjDcJTDsBRruNjDcLTDsDRruMTDcIzDsAxruNTDcKzDsCxruMzDcJzDsBxruNzDcLzDsDxoeMDA8IDAcABoeNDA8KDAcCBoeMjA8JDAcBBoeNjA8LDAcDBoeMTA8IjAcAhoeNTA8KjAcChoeMzA8JjAcBhoeNzA8LjAcDhqeMDA8ITAcARqeNDA8KTAcCRqeMjA8JTAcBRqeNjA8LTAcDRqeMTA8IzAcAxqeNTA8KzAcCxqeMzA8JzAcBxqeNzA8LzAcDxpeMDC8IDCcABpeNDC8KDCcCBpeMjC8JDCcBBpeNjC8LDCcDBpeMTC8IjCcAhpeNTC8KjCcChpeMzC8JjCcBhpeNzC8LjCcDhreMDC8ITCcARreNDC8KTCcCRreMjC8JTCcBRreNjC8LTCcDRreMTC8IzCcAxreNTC8KzCcCxreMzC8JzCcBxreNzC8LzCcDxo+MDB8IDBcABo+NDB8KDBcCBo+MjB8JDBcBBo+NjB8LDBcDBo+MTB8IjBcAho+NTB8KjBcCho+MzB8JjBcBho+NzB8LjBcDhq+MDB8ITBcARq+NDB8KTBcCRq+MjB8JTBcBRq+NjB8LTBcDRq+MTB8IzBcAxq+NTB8KzBcCxq+MzB8JzBcBxq+NzB8LzBcDxp+MDD8IDDcABp+NDD8KDDcCBp+MjD8JDDcBBp+NjD8LDDcDBp+MTD8IjDcAhp+NTD8KjDcChp+MzD8JjDcBhp+NzD8LjDcDhr+MDD8ITDcARr+NDD8KTDcCRr+MjD8JTDcBRr+NjD8LTDcDRr+MTD8IzDcAxr+NTD8KzDcCxr+MzD8JzDcBxr+N+d/3/D/GmnD/aBhAAPDAALDA6BhQAPDgALDg6BhIAPDQALDQ6BhYAPDwALDw6BhEAPDIALDI6BhUAPDoALDo6BhMAPDYALDY6BhcAPD4ALD46BhCAPDEALDE6BhSAPDkALDk6BhKAPDUALDU6BhaAPD0ALD06BhGAPDMALDM6BhWAPDsALDs6BhOAPDcALDc6BheAPD8ALD86BhBAPDCALDC6BhRAPDiALDi6BhJAPDSALDS6BhZAPDyALDy6BhFAPDKALDK6BhVAPDqALDq6BhNAPDaALDa6BhdAPD6ALD66BhDAPDGALDG6BhTAPDmALDm6BhLAPDWALDW6BhbAPD2ALD26BhHAPDOALDO6BhXAPDuALDu6BhPAPDeALDe6BhfAPD+ALD+6BhAgPDBALDB6BhQgPDhALDh6BhIgPDRALDR6BhYgPDxALDx6BhEgPDJALDJ6BhUgPDpALDp6BhMgPDZALDZ6BhcgPD5ALD56BhCgPDFALDF6BhSgPDlALDl6BhKgPDVALDV6BhagPD1ALD16BhGgPDNALDN6BhWgPDtALDt6BhOgPDdALDd6BhegPD9ALD96BhBgPDDALDD6BhRgPDjALDj6BhJgPDTALDT6BhZgPDzALDz6BhFgPDLALDL6BhVgPDrALDr6BhNgPDbALDb6BhdgPD7ALD76BhDgPDHALDH6BhTgPDnALDn6BhLgPDXALDX6Bh7v9xwz///1n/n7uW4HP/goZ5DN7DPIL38B9omNfAMK/A8L/mnGE+A8N8AsMAoGF+A8P8AsOAoGEBA8MCAsNAoGFBA8OCAsPAoGEhA8NCAsMgoGFhA8PCAsOgoGERA8MiAsNgoGFRA8OiAsPgoGExA8NiAsMQoGFxA8PiAsOQoGEJA8MSAsNQoGFJA8OSAsPQoGEpA8NSAsMwoGFpA8PSAsOwoGEZA8MyAsNwoGFZA8OyAsPwoGE5A8NyAsMIoGF5A8PyAsOIoGEFA8MKAsNIoGFFA8OKAsPIoGElA8NKAsMooGFlA8PKAsOooGEVA8MqAsNooGFVA8OqAsPooGE1A8NqAsMYoGF1A8PqAsOYoGENA8MaAsNYoGFNA8OaAsPYoGEtA8NaAsM4oGFtA8PaAsO4oGEdA8M6AsN4oGFdA8O6AsP4oGE9A8N6AsMEoGF9A8P6AsOEoGEDA8MGAsNEoGFDA8OGAsPEoGEjA8NGAsMkoGFjA8PGAsOkoGETA8MmAsNkoGFTA8OmAsPkoGEzA8NmAsMUoGFzA8PmAsOUoGELA8MWAsNUoGFLA8OWAsPUoGErA8NWAsM0oGFrA8PWAsO0oGEbA8M2AsN0oGFbA8O2AsP0oGE7A8N2AsMMoGF7A8P2AsOMoGEHA8MOAsNMoGFHA8OOAsPMoGEnA8NOAsMsoGFnA8POAsOsoGEXA8MuAsNsoGFXA8OuAsPsoGE3A8NuAsMcoGF3A8PuAsOcoGEPA8MeAsNcoGFPA8OeAsPcoGEvA8NeAsM8oGFvA8PeAsO8oGEfA8M+AsN8oGFfA8O+AsP8oGE/A8N+AsMCoGF/A8P+AsOCoOEAA8MBAsNCoOFAA8OBAsPCoOEgA8NBAsMioOFgA8PBAsOioOEQA8MhAsNioOFQA8OhAsPioOEwA8NhAsMSoOFwA8PhAsOSoOEIA8MRAsNSoOFIA8ORAsPSoOEoA8NRAsMyoOFoA8PRAsOyoOEYA8MxAsNyoOFYA8OxAsPyoOE4A8NxAsMKoOF4A8PxAsOKoOEEA8MJAsNKoOFEA8OJAsPKoOEkA8NJAsMqoOFkA8PJAsOqoOEUA8MpAsNqoOFUA8OpAsPqoOE0A8NpAsMaoOF0A8PpAsOaoOEMA8MZAsNaoOFMA8OZAsPaoOEsA8NZAsM6oOFsA8PZAsO6oOEcA8M5AsN6oOFcA8O5AsP6oOE8A8N5AsMGoOF8A8P5AsOGoOECA8MFAsNGoOFCA8OFAsPGoOEiA8NFAsMmoOFiA8PFAsOmoOESA8MlAsNmoOFSA8OlAsPmoOEyA8NlAsMWoOFyA8PlAsOWoOEKA8MVAsNWoOFKA8OVAsPWoOEqA8NVAsM2oOFqA8PVAsO2oOEaA8M1AsN2oOFaA8O1AsP2oOE6A8N1AsMOoOF6A8P1AsOOoOEGA8MNAsNOoOFGA8ONAsPOoOEmA8NNAsMuoOFmA8PNAsOuoOEWA8MtAsNuoOFWA8OtAsPuoOE2A8NtAsMeoOF2A8PtAsOeoOEOA8MdAsNeoOFOA8OdAsPeoOEuA8NdAsM+oOFuA8PdAsO+oOEeA8M9AsN+oOFeA8O9AsP+oOE+A8N9AsMBoOF+A8P9AsOBoOEBA8MDAsNBoOFBA8ODAsPBoOEhA8NDAsMhoOFhA8PDAsOhoOERA8MjAsNhoOFRA8OjAsPhoOExA8NjAsMRoOFxA8PjAsORoOEJA8MTAsNRoOFJA8OTAsPRoOEpA8NTAsMxoOFpA8PTAsOxoOEZA8MzAsNxoOFZA8OzAsPxoOE5A8NzAsMJoOF5A8PzAsOJoOEFA8MLAsNJoOFFA8OLAsPJoOElA8NLAsMpoOFlA8PLAsOpoOEVA8MrAsNpoOFVA8OrAsPpoOE1A8NrAsMZoOF1A8PrAsOZoOENA8MbAsNZoOFNA8ObAsPZoOEtA8NbAsM5oOFtA8PbAsO5oOEdA8M7AsN5oOFdA8O7AsP5oOE9A8N7AsMFoOF9A8P7AsOFoOEDA8MHAsNFoOFDA8OHAsPFoOEjA8NHAsMloOFjA8PHAsOloOETA8MnAsNloOFTA8OnAsPloOEzA8NnAsMVoOFzA8PnAsOVoOELA8MXAsNVoOFLA8OXAsPVoOErA8NXAsM1oOFrA8PXAsO1oOEbA8M3AsN1oOFbA8O3AsP1oOE7A8N3AsMNoOF7A8P3AsONoOEHA8MPAsNNoOFHA8OPAsPNoOEnA8NPAsMtoOFnA8PPAsOtoOEXA8MvAsNtoOFXA8OvAsPtoOE3A8NvAsMdoOF3A8PvAsOdoOEPA8MfAsNdoOFPA8OfAsPdoOEvA8NfAsM9oOFvA8PfAsO9oOEfA8M/AsN9oOFfA8O/AsP9oOE/A8N/AsMDoOF/c//3Df+vkTY8CBoGMDAMIDA8BBoGNDAMKDA8DBoGMjAMJDA8AhoGNjAMLDA8ChoGMTAMIjA8BhoGNTAMKjA8DhoGMzAMJjA8ARoGNzAMLjA8CRqGMDAMITA8BRqGNDAMKTA8DRqGMjAMJTA8AxqGNjAMLTA8CxqGMTAMIzA8BxqGNTAMKzA8DxqGMzAMJzC8ABqGNzAMLzC8CBpGMDCMIDC8BBpGNDCMKDC8DBpGMjCMJDC8AhpGNjCMLDC8ChpGMTCMIjC8BhpGNTCMKjC8DhpGMzCMJjC8ARpGNzCMLjC8CRrGMDCMITC8BRrGNDCMKTC8DRrGMjCMJTC8AxrGNjCMLTC8CxrGMTCMIzC8BxrGNTCMKzC8DxrGMzCMJzB8ABrGNzCMLzB8CBomMDBMIDB8BBomNDBMKDB8DBomMjBMJDB8AhomNjBMLDB8ChomMTBMIjB8BhomNTBMKjB8DhomMzBMJjB8ARomNzBMLjB8CRqmMDBMITB8BRqmNDBMKTB8DRqmMjBMJTB8AxqmNjBMLTB8CxqmMTBMIzB8BxqmNTBMKzB8DxqmMzBMJzD8ABqmNzBMLzD8CBpmMDDMIDD8BBpmNDDMKDD8DBpmMjDMJDD8AhpmNjDMLDD8ChpmMTDMIjD8BhpmNTDMKjD8DhpmMzDMJjD8ARpmNzDMLjD8CRrmMDDMITD8BRrmNDDMKTD8DRrmMjDMJTD8AxrmNjDMLTD8CxrmMTDMIzD8BxrmNTDMKzD8rwVnmM/AMJ/AMABomN/AML/AMCBoWMDAsIDAMBBoWNDAsKDAMDBoWMjAsJDAMAhoWNjAsLDAMChoWMTAsIjAMBhoWNTAsKjAMDhoWMzAsJjAMARoWNzAsLjAMCRoWMLAsITAMBRoWNLAsKTAMDRoWMrAsJTAMAxoWNrAsLTAMCxoWMbAsIzAMBxoWNbAsKzAMDxoWM7AsJzAMAJoWN7AsLzAMCJoWMHAsILAMBJoWNHAsKLAMDJoWMnAsJLAMApoWNnAsLLAMCpoWMXAsIrAMBpoWNXAsKrAMDpoWM3AsJrAMAZoWN3AsLrAMCZoWMPAsIbAMBZoWNPAsKbAMDZoWMvAsJbAMA5oWNvAsLbAMC5oWMfAsI7AMB5oWNfAsK7AMD5oWM/AsJ7AMAFoWN/AsL7AMCFo2MDAsIHAMBFo2NDAsKHAMDFo2MjAsJHAMAlo2NjAsLHAMClo2MTAsInAMBlo2NTAsKnAMDlo2MzAsJnAMAVo2NzAsLnAMCVo2MLAsIXAMBVo2NLAsKXAMDVo2MrAsJXAMA1o2NrAsLXAMC1o2MbAsI3AMB1o2NbAsK3AMD1o2M7AsJ3AMANo2N7AsL3AMCNo2MHAsIPAMBNo2NHAsKPAMDNo2MnAsJPAMAto2NnAsLPAMCto2MXAsIvAMBto2NXAsKvAMDto2M3AsJvAMAdo2N3AsLvAMCdo2MPAsIfAMBdo2NPAsKfAMDdo2MvAsJfAMA9o2NvAsLfAMC9o2MfAsI/AMB9o2NfAsK/AMD9o2M/AsJ/AsABo2N/AsL/AsCBoOMDAcIDAsBBoONDAcKDAsDBoOMjAcJDAsAhoONjAcLDAsChoOMTAcIjAsBhoONTAcKjAsDhoOMzAcJjAsARoONzAcLjAsCRoOMLAcITAsBRoONLAcKTAsDRoOMrAcJTAsAxoONrAcLTAsCxoOMbAcIzAsBxoONbAcKzAsDxoOM7AcJzAsAJoON7AcLzAsCJoOMHAcILAsBJoONHAcKLAsDJoOMnAcJLAsApoONnAcLLAsCpoOMXAcIrAsBpoONXAcKrAsDpoOM3AcJrAsAZoON3AcLrAsCZoOMPAcIbAsBZoONPAcKbAsDZoOMvAcJbAsA5oONvAcLbAsC5oOMfAcI7AsB5oONfAcK7AsD5oOM/AcJ7AsAFoON/AcL7AsCFouMDAcIHAsBFouNDAcKHAsDFouMjAcJHAsAlouNjAcLHAsClouMTAcInAsBlouNTAcKnAsDlouMzAcJnAsAVouNzAcLnAsCVouMLAcIXAsBVouNLAcKXAsDVouMrAcJXAsA1ouNrAcLXAsC1ouMbAcI3AsB1ouNbAcK3AsD1ouM7AcJ3AsANouN7AcL3AsCNouMHAcIPAsBNouNHAcKPAsDNouMnAcJPAsAtouNnAcLPAsCtouMXAcIvAsBtouNXAcKvAsDtouM3AcJvAsAdouN3AcLvAsCdouMPAcIfAsBdouNPAcKfAsDdouMvAcJfAsA9ouNvAcLfAsC9ouMfAcI/AsB9ouNfAcK/AsD9ouM/AcJ/AcABouN/AcL/AcCBoeMDA8IDAcBBoeNDA8KDAcDBoeMjA8JDAcAhoeNjA8LDAcChoeMTA8IjAcBhoeNTA8KjAcDhoeMzA8JjAcARoeNzA8LjAcCRoeMLA8ITAcBRoeNLA8KTAcDRoeMrA8JTAcAxoeNrA8LTAcCxoeMbA8IzAcBxoeNbA8KzAcDxoeM7A8JzAcAJoeN7A8LzAcCJoeMHA8ILAcBJoeNHA8KLAcDJoeMnA8JLAcApoeNnA8LLAcCpoeMXA8IrAcBpoeNXA8KrAcDpoeM3A8JrAcAZoeN3A8LrAcCZoeMPA8IbAcBZoeNPA8KbAcDZoeMvA8JbAcA5oeNvA8LbAcC5oeMfA8I7AcB5oeNfA8K7AcD5oeM/A8J7AcAFoeN/A8L7AcCFo+MDA8IHAcBFo+NDA8KHAcDFo+MjA8JHAcAlo+NjA8LHAcClo+MTA8InAcBlo+NTA8KnAcDlo+MzA8JnAcAVo+NzA8LnAcCVo+MLA8IXAcBVo+NLA8KXAcDVo+MrA8JXAcA1o+NrA8LXAcC1o+MbA8I3AcB1o+NbA8K3AcD1o+M7A8J3AcANo+N7A8L3AcCNo+MHA8IPAcBNo+NHA8KPAcDNo+MnA8JPAcAto+NnA8LPAcCto+MXA8IvAcBto+NXA8KvAcDto+M3A8JvAcAdo+N3A8LvAcCdo+MPA8IfAcBdo+NPA8KfAcDdo+MvA8JfAcA9o+NvA8LfAcC9o+MfA8I/AcB9o+NfA8K/AcD9o+M/A8J/A8ABo+N+8/33D/2ukDQ+ChgEMDAMIDA+BhgENDAMKDA+DhoEMDAMJDI+AhoENDAMLDI+ChkEMDIMIDI+BhkENDIMKDI+DhsEMDIMJDE+AhsENDIMLDE+ChiEMDEMIDE+BhiENDEMKDE+DhqEMDEMJDM+AhqENDEMLDM+ChmEMDMMIDM+BhmENDMMKDM+DhuEMDMMJDC+AhuENDMMLDC+ChhEMDCMIDC+BhhENDCMKDC+DhpEMDCMJDK+AhpENDCMLDK+ChlEMDKMIDK+BhlENDKMKDK+DhtEMDKMJDG+AhtENDKMLDG+ChjEMDGMIDG+BhjENDGMKDG+DhrEMDGMJDO+AhrENDGMLDO+ChnEMDOMIDO+BhnENDOMKDO+DhvEMDOMJDB+AhvENDOMLDB+ChgkMDBMIDB+BhgkNDBMKDB+DhokMDBMJDJ+AhokNDBMLDJ+ChkkMDJMIDJ+BhkkNDJMKDJ+DhskMDJMJDF+AhskNDJMLDF+ChikMDFMIDF+BhikNDFMKDF+DhqkMDFMJDN+AhqkNDFMLDN+ChmkMDNMIDN+BhmkNDNMKDN+DhukMDNMJDD+AhukNDNMLDD+ChhkMDDMIDD+BhhkNDDMKDD+DhpkMDDMJDL+AhpkNDDMLDL+ChlkMDLMIDL+BhlkNDLMKDL+DhtkMDLMJDH+AhtkNDLMLDH+ChjkMDHMIDH+BhjkNDHMKDH+DhrkMDHMJDP+AhrkNDHMLDP+ChnkMDPMIDP+BhnkNDPMKDP9ryRnmMzDMJzAMABrmNzDMLzAMCBoWMDAsIDAMBBoWNDAsKDAMDBoWMjAsJDAMAhoWNjAsLDAMChoWMTAsIjAMBhoWNTAsKjAMDhoWMzAsJjAMARoWNzAsLjAMCRqWMDAsITAMBRqWNDAsKTAMDRqWMjAsJTAMAxqWNjAsLTAMCxqWMTAsIzAMBxqWNTAsKzAMDxqWMzAsJzCMABqWNzAsLzCMCBpWMDCsIDCMBBpWNDCsKDCMDBpWMjCsJDCMAhpWNjCsLDCMChpWMTCsIjCMBhpWNTCsKjCMDhpWMzCsJjCMARpWNzCsLjCMCRrWMDCsITCMBRrWNDCsKTCMDRrWMjCsJTCMAxrWNjCsLTCMCxrWMTCsIzCMBxrWNTCsKzCMDxrWMzCsJzBMABrWNzCsLzBMCBo2MDBsIDBMBBo2NDBsKDBMDBo2MjBsJDBMAho2NjBsLDBMCho2MTBsIjBMBho2NTBsKjBMDho2MzBsJjBMARo2NzBsLjBMCRq2MDBsITBMBRq2NDBsKTBMDRq2MjBsJTBMAxq2NjBsLTBMCxq2MTBsIzBMBxq2NTBsKzBMDxq2MzBsJzDMABq2NzBsLzDMCBp2MDDsIDDMBBp2NDDsKDDMDBp2MjDsJDDMAhp2NjDsLDDMChp2MTDsIjDMBhp2NTDsKjDMDhp2MzDsJjDMARp2NzDsLjDMCRr2MDDsITDMBRr2NDDsKTDMDRr2MjDsJTDMAxr2NjDsLTDMCxr2MTDsIzDMBxr2NTDsKzDMDxr2MzDsJzAsABr2NzDsLzAsCBoOMDAcIDAsBBoONDAcKDAsDBoOMjAcJDAsAhoONjAcLDAsChoOMTAcIjAsBhoONTAcKjAsDhoOMzAcJjAsARoONzAcLjAsCRqOMDAcITAsBRqONDAcKTAsDRqOMjAcJTAsAxqONjAcLTAsCxqOMTAcIzAsBxqONTAcKzAsDxqOMzAcJzCsABqONzAcLzCsCBpOMDCcIDCsBBpONDCcKDCsDBpOMjCcJDCsAhpONjCcLDCsChpOMTCcIjCsBhpONTCcKjCsDhpOMzCcJjCsARpONzCcLjCsCRrOMDCcITCsBRrONDCcKTCsDRrOMjCcJTCsAxrONjCcLTCsCxrOMTCcIzCsBxrONTCcKzCsDxrOMzCcJzBsABrONzCcLzBsCBouMDBcIDBsBBouNDBcKDBsDBouMjBcJDBsAhouNjBcLDBsChouMTBcIjBsBhouNTBcKjBsDhouMzBcJjBsARouNzBcLjBsCRquMDBcITBsBRquNDBcKTBsDRquMjBcJTBsAxquNjBcLTBsCxquMTBcIzBsBxquNTBcKzBsDxquMzBcJzDsABquNzBcLzDsCBpuMDDcIDDsBBpuNDDcKDDsDBpuMjDcJDDsAhpuNjDcLDDsChpuMTDcIjDsBhpuNTDcKjDsDhpuMzDcJjDsARpuNzDcLjDsCRruMDDcITDsBRruNDDcKTDsDRruMjDcJTDsAxruNjDcLTDsCxruMTDcIzDsBxruNTDcKzDsDxruMzDcJzAcABruNzDcLzAcCBoeMDA8IDAcBBoeNDA8KDAcDBoeMjA8JDAcAhoeNjA8LDAcChoeMTA8IjAcBhoeNTA8KjAcDhoeMzA8JjAcARoeNzA8LjAcCRqeMDA8ITAcBRqeNDA8KTAcDRqeMjA8JTAcAxqeNjA8LTAcCxqeMTA8IzAcBxqeNTA8KzAcDxqeMzA8JzCcABqeNzA8LzCcCBpeMDC8IDCcBBpeNDC8KDCcDBpeMjC8JDCcAhpeNjC8LDCcChpeMTC8IjCcBhpeNTC8KjCcDhpeMzC8JjCcARpeNzC8LjCcCRre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1jIwrCUwjAMa1jYwrC0wjAsa1jEwrCMwjAca1jUwrCswjA8a1jMwrCcwTAAa1jcwrC8wTAgaNjAwbCAwTAQaNjQwbCgwTAwaNjIwbCQwTAIaNjYwbCwwTAoaNjEwbCIwTAYaNjUwbCowTA4aNjMwbCYwTAEaNjcwbC4wTAkatjAwbCEwTAUatjQwbCkwTA0atjIwbCUwTAMatjYwbC0wTAsatjEwbCMwTAcatjUwbCswTA8atjMwbCcwzAAatjcwbC8wzAgadjAw7CAwzAQadjQw7CgwzAwadjIw7CQwzAIadjYw7CwwzAoadjEw7CIwzAYadjUw7CowzA4adjMw7CYwzAEadjcw7C4wzAka9jAw7CEwzAUa9jQw7CkwzA0a9jIw7CUwzAMa9jYw7C0wzAsa9jEw7CMwzAca9jUw7CswzA8a9jMw7CcwLAAa9jcw7C8wLAgaDjAwHCAwLAQaDjQwHCgwLAwaDjIwHCQwLAIaDjYwHCwwLAoaDjEwHCIwLAYaDjUwHCowLA4aDjMwHCYwLAEaDjcwHC4wLAkajjAwHCEwLAUajjQwHCkwLA0ajjIwHCUwLAMajjYwHC0wLAsajjEwHCMwLAcajjUwHCswLA8ajjMwHCcwrAAajjcwHC8wrAgaTjAwnCAwrAQaTjQwnCgwrAwaTjIwnCQwrAIaTjYwnCwwrAoaTjEwnCIwrAYaTjUwnCowrA4aTjMwnCYwrAEaTjcwnC4wrAkazjAwnCEwrAUazjQwnCkwrA0azjIwnCUwrAMazjYwnC0wrAsazjEwnCMwrAcazjUwnCswrA8azjMwnCcwbAAazjcwnC8wbAgaLjAwXCAwbAQaLjQwXCgwbAwaLjIwXCQwbAIaLjYwXCwwbAoaLjEwXCIwbAYaLjUwXCowbA4aLjMwXCYwbAEaLjcwXC4wbAkarjAwXCEwbAUarjQwXCkwbA0arjIwXCUwbAMarjYwXC0wbAsarjEwXCMwbAcarjUwXCswbA8arjMwXCcw7AAarjcwXC8w7AgabjAw3CAw7AQabjQw3Cgw7AwabjIw3CQw7AIabjYw3Cww7AoabjEw3CIw7AYabjUw3Cow7A4abjMw3CYw7AEabjcw3C4w7Aka7jAw3CEw7AUa7jQw3Ckw7A0a7jIw3CUw7AMa7jYw3C0w7Asa7jEw3CMw7Aca7jUw3Csw7A8a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CgyLg4bDDAyHCQxLgIbDDQyHCwxLgoYjDAxHCAxLgYYjDQxHCgxLg4ajDAxHCQzLgIajDQxHCwzLgoZjDAzHCAzLgYZjDQzHCgzLg4bjDAzHCQwrgIbjDQzHCwwrgoYTDAwnCAwrgYYTDQwnCgwrg4aTDAwnCQyrgIaTDQwnCwyrgoZTDAynCAyrgYZTDQynCgyrg4bTDAynCQxrgIbTDQynCwxrgoYzDAxnCAxrgYYzDQxnCgxrg4azDAxnCQzrgIazDQxnCwzrgoZzDAznCAzrgYZzDQznCgzrg4bzDAznCQwbgIbzDQznCwwbgoYLDAwXCAwbgYYLDQwXCgwbg4aLDAwXCQybgIaLDQwXCwybgoZLDAyXCAybgYZLDQyXCgybg4bLDAyXCQxbgIbLDQyXCwxbgoYrDAxXCAxbgYYrDQxXCgxbg4arDAxXCQzbgIarDQxXCwzbgoZrDAzXCAzbgYZrDQzXCgzbg4brDAzXCQw7gIbrDQzXCww7goYbDAw3CAw7gYYbDQw3Cgw7g4abDAw3CQy7gIabDQw3Cwy7goZbDAy3CAy7gYZbDQy3Cgy7g4bbDAy3CQx7gIbbDQy3Cwx7goY7DAx3CAx7gYY7DQx3Cgx7g4a7DAx3CQz7gIa7DQx3Cwz7goZ7DAz3CAz7gYZ7DQz3Cgz7g4b7DAz3CQwHgIb7DQz3CwwHgoYHDAwPCAwHgYYHDQwPCgwHg4aHDAwPCQyHgIaHDQwPCwyHgoZHDAyPCAyHgYZHDQyPCgyHg4bHDAyPCQxHgIbHDQyPCwxHgoYnDAxPCAxHgYYnDQxPCgxHg4anDAxPCQzHgIanDQxPCwzHgoZnDAzPCAzHgYZnDQzPCgzHg4bnDAzPCQwngIbnDQzPCwwngoYXDAwvCAwngYYXDQwvCgwng4aXDAwvCQyngIaXDQwvCwyngoZXDAyvCAyngYZXDQyvCgyng4bXDAyvCQxngIbXDQyvCwxngoY3DAxvCAxngYY3DQxvCgxng4a3DAxvCQzngIa3DQxvCwzngoZ3DAzvCAzngYZ3DQzvCgzng4b3DAzvCQwXgIb3DQzvCwwXgoYPDAwfCAwXgYYPDQwfCgwXg4aPDAwfCQyXgIaPDQwfCwyXgoZPDAyfCAyXgYZPDQyfCgyXg4bPDAyfCQxXgIbPDQyfCwxXgoYvDAxfCAxXgYYvDQxfCgxXg4avDAxfCQzXgIavDQxfCwzXgoZvDAzfCAzXgYZvDQzfCgzXg4bvDAzfCQw3gIbvDQzfCww3goYfDAw/CAw3gYYfDQw/Cgw3g4afDAw/CQy3gIafDQw/Cwy3goZfDAy/CAy3gYZfDQy/Cgy3g4bfDAy/CQx3gIbfDQy/Cwx3goY/DAx/CAx3gYY/DQx/Cgx3g4a/DAx/CQz3gIa/DQx/Cwz3goZ/DAz/CAz3gYZ/DQz/Cgz3g4b/DAz/CQwPgIb/LfnfN/y/RtrwIGgYwMAwgMDwEGgY0MAwoMDwMGgYyMAwkMDwCGgY2MAwsMDwKGgYxMAwiMDwGGgY1MAwqMDwOGgYzMAwmMDwBGgY3MAwuMDwJGgYwsAwhMDwFGgY0sAwpMDwNGgYysAwlMDwDGgY2sAwtMDwLGgYxsAwjMDwHGgY1sAwrMDwPGgYzsAwnMDwAmgY3sAwvMDwImgYwcAwgsDwEmgY0cAwosDwMmgYycAwksDwCmgY2cAwssDwKmgYxcAwisDwGmgY1cAwqsDwOmgYzcAwmsDwBmgY3cAwusDwJmgYw8AwhsDwFmgY08AwpsDwNmgYy8AwlsDwDmgY28AwtsDwLmgYx8AwjsDwHmgY18AwrsDwPmgYz8AwnsDwAWgY38AwvsDwIWiYwMAwgcDwEWiY0MAwocDwMWiYyMAwkcDwCWiY2MAwscDwKWiYxMAwicDwGWiY1MAwqcDwOWiYzMAwmcDwBWiY3MAwucDwJWiYwsAwhcDwFWiY0sAwpcDwNWiYysAwlcDwDWiY2sAwtcDwLWiYxsAwjcDwHWiY1sAwrcDwPWiYzsAwncDwA2iY3sAwvcDwI2iYwcAwg8DwE2iY0cAwo8DwM2iYycAwk8DwC2iY2cAws8DwK2iYxcAwi8DwG2iY1cAwq8DwO2iYzcAwm8DwB2iY3cAwu8DwJ2iYw8Aw3xje8F84zjCngWGhPgLDZJxhLgPDHIJd/gXucu7/ccMiXQL+93/P//vc/69z5+HmzqCY+7/o//33/9wxBZ8bIDpnmNdg//IK9i8gaJjP4VsqMAwEGuY3MMwvMAwMGhYwMCwgMAwCGhY0MCwoMAwKGhZy+C8WGAYDDQsbGBYWGAYHDYsYGBYRGIYADYsaGBYVGIYEDYsZGBYTGIYCDYsbGBYXGIYGDUsYGJYQGIYBDUsaGJYUGIYFDUsZGJYSGIYDDUsbGJYWGIYHDcsYGJYRGEYADcsaGJYVGEYEDcsZGJYTGEYCDcsbGJYXGEYGDSsYGFYQGEYBDSsaGFYUGEYFDSsZGFYSGEYDDSsbGFYWGEYHDasYGFYRGMYADasaGFYVGMYEDasZGFYTGMYCDasbGFYXGMYGDWsYGNYQGMYBDWsaGNYUGMYFDWsZGNYSGMYDDWsbGNYWGMYHDesYGNYRGCYADesaGNYVGCYEDesZGNYTGCYCDesbGNYXGCYGDRsYGDYQGCYBDRsaGDYUGCYFDRsZGDYSGCYDDRsbGDYWGCYHDZsYGDYRGKYADZsaGDYVGKYEDZsZGDYTGKYCDZsbGDYXGKYGDVsYGLYQGKYBDVsaGLYUGKYFDVsZGLYSGKYDDVsbGLYWGKYHDdsYGLYRGGYADdsaGLYVGGYEDdsZGLYTGGYCDdsbGLYXGGYGDTsYGHYQGGYBDTsaGHYUGGYFDTsZGHYSGGYDDTsbGHYWGGYHDbsYGHYRGOYADbsaGHYVGOYEDbsZGHYTGOYCDbsbGHYXGOYGDXsYGPYQGOYBDXsaGPYUGOYFDXsZGPYSGOYDDXsbGPYWGOYHDfsYGPYRGBYADfsaGPYVGBYEDfsZGPYTGBYCDfsbGPYXGBYGDQcYGA4QGBYBDQcaGA4UGBYFDQcZGA4SGBYDDQcbGA4WGBYHDYcYGA4RGJYADYcaGA4VGJYEDYcZGA4TGJYCDYcbGA4XGJYGDUcYGI4QGJYBDUcaGI4UGJYFDUcZGI4SGJYDDUcbGI4WGJYHDccYGI4RGFYADccaGI4VGFYEDccZGI4TGFYCDccbGI4XGFYGDScYGE4QGFYBDScaGE4UGFYFDScZGE4SGFYDDScbGE4WGFYHDacYGE4RGNYADacaGE4VGNYEDacZGE4TGNYCDacbGE4XGNYGDWcYGM4QGNYBDWcaGM4UGNYFDWcZGM4SGNYDDWcbGM4WGNYHDecYGM4RGDYADecaGM4VGDYEDecZGM4TGDYCDecbGM4XGDYGDRcYGC4QGDYBDRcaGC4UGDYFDRcZGC4SGDYDDRcbGC4WGDYHDZcYGC4RGLYADZcaGC4VGLYEDZcZGC4TGLYCDZcbGC4XGLYGDVcYGK4QGLYBDVcaGK4UGLYFDVcZGK4SGLYDDVcbGK4WGLYHDdcYGK4RGHYADdcaGK4VGHYEDdcZ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OUHDbgaG3QSGuUDD7gaG3QWGuUHDHgaGPQSGeUDDngaGPQWGeUHDXgaGvQSG+UDD3gaGvQWG+UHDPgaGfQSGBUDDvgaGfQWGBUHDfgaG/QSGhUDD/gaG/QWGhUHDAQaGAwSGRUDDgQaGAwWGRUHDQQaGgwSGxUDDwQaGgwWGxUHDIQaGQwSGJUDDoQaGQwWGJUHDYQaGwwSGpUDD4QaGwwWGpUHDEQaGIwSGZUDDkQaGIwWGZUHDUQaGowSG5UDD0QaGowWG5UHDMQaGYwSGFUDDsQaGYwWGFUHDcQaG4wSGlUDD8QaG4wWGlUHDCQaGEwSGVUDDiQaGEwWGVUHDSQaGkwSG1UDDyQaGkwWG1UHDKQaGUwSGNUDDqQaGUwWGNUHDaQaG0wSGtUDD6QaG0wWGtUHDGQaGMwSGdUDDmQaGMwWGdUHDWQaGswSG9UDD2QaGswWG9UHDOQaGcwSGDUDDuQaGcwWGDUHDeQaG8wSGjUDD+QaG8wWGjUHDBQaGCwSGTUDDhQaGCwWGTUHDRQaGiwSGzUDDxQaGiwWGzUHDJQaGSwSGLUDDpQaGSwWGLUHDZQaGywSGrUDD5QaGywWGrUHDFQaGKwSGbUDDlQaGKwWGbUHDVQaGqwSG7UDD1QaGqwWG7UHDNQaGawSGHUDDtQaGawWGHUHDdQaG6wSGnUDD9QaG6wWGnUHDDQaGGwSGXUDDjQaGGwWGXUHDTQaGmwSG3UDDzQaGmwWG3UHDLQaGWwSGPUDDrQaGWwWGPUHDbQaG2wSGvUDD7QaG2wWGvUHDHQaGOwSGfUDDnQaGOwWGfUHDXQaGuwSG/UDD3QaGuwWG/UHDPQaGewSGA0DDvQaGewWGA0HDfQaG+wSGg0DD/QaG+wWGg0HDAwaGBwSGQ0DDgwaGBwWGQ0HDQwaGhwSGw0DDwwaGhwWGw0HDIwaGRwSGI0DDowaGRwWGI0HDYwaGxwSGo0DD4waGxwWGo0HDEwaGJwSGY0DDkwaGJwWGY0HDUwaGpwSG40DD0waGpwWG40HDMwaGZwSGE0DDswaGZwWGE0HDcwaG5wSGk0DD8waG5wWGk0HDCwaGFwSGU0DDiwaGFwWGU0HDSwaGlwSG00DDywaGlwWG00HDKwaGVwSGM0DDqwaGVwWGM0HDawaG1wSGs0DD6waG1wWGs0HDGwaGNwSGc0DDmwaGNwWG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GBhOERjWAA2nGhhOFRjWBA2nGRhOExjWAg2nGxhOFxjWBg1nGBjOEBjWAQ1nGhjOFBjWBQ1nGRjOEhjWAw1nGxjOFhjWBw3nGBjOERg2AA3nGhjOFRg2BA3nGRjOExg2Ag3nGxjOFxg2Bg0XGBguEBg2AQ0XGhguFBg2BQ0XGRguEhg2Aw0XGxguFhg2Bw2XGBguERi2AA2XGhguFRi2BA2XGRguExi2Ag2XGxguFxi2Bg1XGBiuEBi2AQ1XGhiuFBi2BQ1XGRiuEhi2Aw1XGxiuFhi2Bw3XGBiuERh2AA3XGhiuFRh2BA3XGRiuExh2Ag3XGxiuFxh2Bg03GBhuEBh2AQ03GhhuFBh2BQ03GRhuEhh2Aw03GxhuFhh2Bw23GBhuERj2AA23GhhuFRj2BA23GRhuExj2Ag23GxhuFxj2Bg13GBjuEBj2AQ13GhjuFBj2BQ13GRjuEhj2Aw13GxjuFhj2Bw33GBjuERgOAA33GhjuFRgOBA33GRjuExgOAg33GxjuFxgOBg0PGBgeEBgOAQ0PGhgeFBgOBQ0PGRgeEhgOAw0PGxgeFhgOBw2PGBgeERiOAA2PGhgeFRiOBA2PGRgeExiOAg2PGxgeFxiOBg1PGBieEBiOAQ1PGhieFBiOBQ1PGRieEhiOAw1PGxieFhiOBw3PGBieERhOAA3PGhieFRhOBA3PGRieExhOAg3PGxieFxhOBg0vGBheEBhOAQ0vGhheFBhOBQ0vGRheEhhOAw0vGxheFhhOBw2vGBheERjOAA2vGhheFRjOBA2vGRheExjOAg2vGxheFxjOBg1vGBjeEBjOAQ1vGhjeFBjOBQ1vGRjeEhjOAw1vGxjeFhjOBw3vGBjeERguAA3vGhjeFRguBA3vGRjeExguAg3vGxjeFxguBg0fGBg+EBguAQ0fGhg+FBguBQ0fGRg+EhguAw0fGxg+FhguBw2fGBg+ERiuAA2fGhg+FRiuBA2fGRg+ExiuAg2fGxg+FxiuBg1fGBi+EBiuAQ1fGhi+FBiuBQ1fGRi+EhiuAw1fGxi+FhiuBw3fGBi+ERhuAA3fGhi+FRhuBA3fGRi+ExhuAg3fGxi+FxhuBg0/GBh+EBhuAQ0/Ghh+FBhuBQ0/GRh+EhhuAw0/Gxh+FhhuBw2/GBh+ERjuAA2/Ghh+FRj+/6j7p2BL1jZg1/xW2bZt27XKtl21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","debug_symbols":"1P3ByqRB099nnsu31qIyIyIjQqcyDINmLA8CIw0jeSV07r4fI8sYe+cXvVy77ubOqn9RufnR3dfzn//lf/i3/+//+f/7//p3//5//A//8V/+9f/jP//L//Qf/j//5j/9u//w77/f/ed/+f2vf/Qf/3//5t///e4//qd/8///T//yr/v2v/qXf/vv/4fvVxX/5V/9y//47/6nf/sv//qd//Kv/k+P3vz9/uuzNzv/94fzv/w//9W/nP+7r16//d9eveL/8Or/54e373999vx+9b8/2/8Xz1bHf322dv/bo2f+Rl9xdPz3HH1+/+2Fz6//b6xOcnWJF+SJo5u8H0OuXvGCnB+5+pA35FxzdpB3JMnVZV6RZ85u8o4MuXrJK3J/5myzHMl0vGY73jRnk/V4yXy8Zj9eMyAvWZBBFmSYBRlmQQZZkJHkarMgwyzIIAsyyIIMsyDTLMgkCzLJgkz0bx/TnE0WZJIFmWZBplmQSRZkkQVZZkGWWZBFFmQludosyDILssiCLLIgyyzIZxbkIwvykQX5zIJ8ac42/wUrWZDPLMhnFuQjC7LJgmyzINssyCYLspNcbRZkmwXZZEE2WZBtFuSYBTlkQQ5ZkGMW5KQ5myzIIQty0P8FaRbkkAW5ZEGuWZBrFuSSBblJrjYLcs2CXLIglyzINQvy+9DobrIhv89vzjYr8vwS3U125PmRIfl9V+gtMVPy/ExTR0V1UFVHZXVQVweFdVRZR6V1UFsHxXVQXeegvM4xfZ1jAjsHFXYOSuwc09g5JrJzUGXnoMzOMZ2dY0I7B5V2DkrtHNPaOSa2c1Bt56DczjG9nWOCOwcVdw5K7hzT3DkmunNQdeeg7M4x3Z1jwjsHlXcOSu8c0945Jr5zUH3noPzOMf2dYwI8BxV4DkrwHNPgOSbCc1CF56AMzzEdnmNCPAeVeA5K8RzT4jkmxnNQjeegHM8xPZ5jgjwHFXkOSvIc0+Q5JspzUJXnoCzPMV2eY8I8B5V5DkrzHNPmOSbOc1Cd56A8zzF9nmMCPQcVeg5K9BzT6Dkm0nNQpeegTM8xnZ5jQj0HlXoOSvUc0+o5JtZzUK3nolrPNbWea2o9F9V67i/R3WRVXlPruajWc1Gt55pazzW1notqPRfVeq6p9VxT67mo1nNRreeaWs81tZ6Laj0X1XquqfVcU+u5qNZzUa3nmlrPNbWei2o9F9V6rqn1XFPruajWc1Gt55pazzW1notqPRfVeq6p9VxT67mo1nNRreeaWs81tZ6Laj0X1XquqfVcU+u5qNZzUa3nmlrPNbWei2o9F9V6rqn1XFPruajWc1Gt55pazzW1notqPRfVeq6p9VxT67mo1nNRreeaWs81tZ6Laj0X1XquqfVcU+u5qNZzUa3nmlrPNbWei2o9F9V6rqn1XFPruajWc1Gt55pazzW1notqPRfVeq6p9VxT67mo1nNRreeaWs81tZ6Laj0X1XquqfVcU+u5qNZzUa3nmlrPNbWei2o9gWo9YWo9YWo9gWo98Ut0N1mVYWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9gWo9YWo9YWo9gWo9iWo9aWo9aWo9iWo9+Ut0N1mVaWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9iWo9aWo9aWo9iWo9hWo9ZWo9ZWo9hWo99Ut0N1mVZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9hWo9ZWo9ZWo9hWo9D9V6nqn1PFPreajW836J7iar8plaz0O1nodqPc/Uep6p9TxU63mo1vNMreeZWs9DtZ6Haj3P1HqeqfU8VOt5qNbzTK3nmVrPQ7Weh2o9z9R6nqn1PFTreajW80yt55laz0O1nodqPc/Uep6p9TxU63mo1vNMreeZWs9DtZ6Haj3P1HqeqfU8VOt5qNbzTK3nmVrPQ7Weh2o9z9R6nqn1PFTreajW80yt55laz0O1nodqPc/Uep6p9TxU63mo1vNMreeZWs9DtZ6Haj3P1HqeqfU8VOt5qNbzTK3nmVrPQ7Weh2o9z9R6nqn1PFTreajW80yt55laz0O1nodqPc/Uep6p9TxU63mo1vNMreeZWs9DtZ6Haj3P1HqeqfU8VOt5qNbzTK3nmVrPQ7Weh2o9z9R6nqn1PFTraVTraVPraVPraVTr6V+iu8mqbFPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTraVTraVPraVPraVTrGVTrGVPrGVPrGVTrmV+iu8mqHFPrGVTrGVTrGVPrGVPrGVTrGVTrGVPrGVPrGVTrGVTrGVPrGVPrGVTr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ikAPFYEeKgI9VQR6qgj0UBHooSLQU0WgVkWgRkWgRkWgVkWg/qU63CzNRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgVkWgRkWgRkWgVkWgUUWgQUWgQUWgUUWg+aU63CzNQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgUUWgQUWgQUWgUUWgVUWgRUWgRUWgVUWg/aU63CzNRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWgVUWgRUWgRUWgVUWg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Ah1UBDqoCHRUEeioItBBRaCDikBHFYGOKgIdVAQ6qAh0VBHoqCLQQUWgg4pARxWBjioCHVQEOqgIdFQR6Kgi0EFFoIOKQEcVgY4qAh1UBDqoCHRUEeioItBBRaCDikBHFYGOKgIdVAQ6qAh0VBHoqCLQQUWgg4pARxWBjioCHVQEOqgIdFQR6Kgi0EFFoIOKQEcVgY4qAh1UBDqoCHRUEeiqItBFRaCLikBXFYHuL9XhZmleVAS6qgh0VRHooiLQRUWgq4pAVxWBLioCXVQEuqoIdFUR6KIi0EVFoKuKQFcVgS4qAl1UBLqqCHRVEeiiItBFRaCrikBXFYEuKgJdVAS6qgh0VRHooiLQRUWgq4pAVxWBLioCXVQEuqoIdFUR6KIi0EVFoKuKQFcVgS4qAl1UBLqqCHRVEeiiItBFRaCrikBXFYEuKgJdVAS6qgh0VRHooiLQRUWgq4pAVxWBLioCXVQEuqoIdFUR6KIi0EVFoKuKQFcVgS4qAl1UBLqqCHRVEeiiItBFRaCrikBXFYEuKgJdVAS6qgh0VRHooiLQRUWgq4pAVxWBLioCXVQEuqoIdFUR6KIi0EVFoKuKQFcVgS4qAl1UBLqqCHRVEeiiItBFRaCrikChikCBikCBikChikDxS3W4WZqBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikChikCBikCBikChikCpikCJikCJikCpikD5S3W4WZqJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikCpikCJikCJikCpikClikCFikCFikClikD1S3W4WZqFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikClikCFikCFikClikBPFYEeKgI9VAR6qgj0fqkON0vzoSLQU0Wgp4pADxWBHioCPVUEeqoI9FAR6KEi0FNFoKeKQA8VgR4qAj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQR6qgj0UBHooSLQU0Wgp4pADxWBHioCPVUEeqoI9FAR6KEi0FNFoKeKQA8VgR4qAj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQR6qgj0UBHooSLQU0Wgp4pADxWBHioCPVUEeqoI9FAR6KEi0FNFoKeKQA8VgR4qAj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQR6qgj0UBHooSLQU0Wgp4pADxWBHioCPVUEeqoI9FAR6KEi0FNFoKeKQA8VgR4qAj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQRqVQRqVARqVARqVQTqX6rDzdJsVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQRqVQRqVARqVARqVQQaVQQaVAQaVAQaVQSaX6rDzdIcVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQQaVQQaVAQaVAQaVQRaVQRaVARaVARaVQTaX6rDzdJcVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVQRaVQRaVARaVARaVATKHyoCfcPJ0vx2k6X57TZL8xue6nCyNL/dZGl+u83S/IabpfkNJ0szf6YI9O02S/MbbpbmN5wszW93orvN0vyGm6X5DSdL89tNlua3Wy1NVAT6hqOlaYpA3261NFER6BuOlqYpAn271dJERaBvOFqapgj07VZLExWBvuFoaZoi0LdbLU1UBPqGo6VpikDfbrU0URHoG46WpikCfbvV0kRFoG84WpqmCPTtVksTFYG+4WhpmiLQt1stTVQE+oajpWmKQN9utTRREegbjpamKQJ9u9XSREWgbzhamqYI9O1WSxMVgb7haGmaItC3Wy1NVAT6hqOlaYpA3261NFER6BuOlqYpAn271dJERaBvOFqapgj07VZLExWBvuFoaZoi0LdbLU1UBPqGo6VpikDfbrU0URHoG46WpikCfbvV0kRFoG84WpqmCPTtVksTFYG+4WhpmiLQtxstzaOKQAcVgQ4qAh1VBDq/VIebpXlQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAl1VBLqoCHRREeiqItD9pTrcLM2LikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEShUEShQEShQEShUESh+qQ43SzNQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShUEShQEShQEShUEShVEShREShREShVESh/qQ43SzNREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEShVEShREShREShVEahUEahQEahQEahUEah+qQ43S7NQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEahUEahQEahQEahUEeipItBDRaCHikBPFYHeL9XhZmk+VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikCtikCNikCNikCtikD9S3W4WZqNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCtikCNikCNikCtikCjikCDikCDikCjikDzS3W4WZqDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCjikCDikCDikCjikCrikCLikCLikCrikD7S3W4WZqLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCrikCrikCLikCLikCLikD1Q0WgbzhZmt9usjS/3WZpfsNTHU6W5rebLM1vt1ma33CzNL/hZGnWzxSBvt1maX7DzdL8hpOl+e1OdLdZmt9wszS/4WRpfrvJ0vx2q6WJikDfcLQ0TRHo262WJioCfcPR0jRFoG+3WpqoCPQNR0vTFIG+3WppoiLQNxwtTVME+narpYmKQN9wtDRNEejbrZYmKgJ9w9HSNEWgb7damqgI9A1HS9MUgb7dammiItA3HC1NUwT6dquliYpA33C0NE0R6NutliYqAn3D0dI0RaBvt1qaqAj0DUdL0xSBvt1qaaIi0DccLU1TBPp2q6WJikDfcLQ0TRHo262WJioCfcPR0jRFoG+3WpqoCPQNR0vTFIG+3WppoiLQNxwtTVME+narpYmKQN9wtDRNEejbrZYmKgJ9w9HSNEWg7z3V0kRFoO9N0dI0RaDvPdXSREWg703R0jRFoO890dI8qgh0UBHooCLQUUWg80t1uFmaBxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQVUWgi4pAFxWBrioC3V+qw83SvKgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBQhWBAhWBAhWBQhWB4pfqcLM0AxWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBQhWBAhWBAhWBQhWBUhWBEhWBEhWBUhWB8pfqcLM0ExWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBUhWBEhWBEhWBUhWBShWBChWBChWBShWB6pfqcLM0CxWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBShWBChWBChWBShWBnioCPVQEeqgI9FQR6P1SHW6W5kNFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI9FQR6KEi0ENFoKeKQE8VgR4qAj1UBHqqCPRUEeihItBDRaCnikBPFYEeKgI9VAR6qgj0VBHooSLQQ0Wgp4pATxWBHioCPVQEeqoI1KoI1KgI1KgI1KoI1L9Uh5ul2agI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoI1KoI1KgI1KgI1KoINKoINKgINKgINKoINL9Uh5ulOagINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoINKoINKgINKgINKoItKoItKgItKgItKoItL9Uh5uluagItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKoItKoItKgItKgItKgI9H6oCPQNJ0vz202W5rfbLM1veKrDydL8dpOl+e02S/MbbpbmN5wszfczRaBvt1ma33CzNL/hZGl+uxPdbZbmN9wszW84WZrfbrI0v91qaaIi0DccLU1TBPp2q6WJikDfcLQ0TRHo262WJioCfcPR0jRFoG+3WpqoCPQNR0vTFIG+3WppoiLQNxwtTVME+narpYmKQN9wtDRNEejbrZYmKgJ9w9HSNEWgb7damqgI9A1HS9MUgb7dammiItA3HC1NUwT6dquliYpA33C0NE0R6NutliYqAn3D0dI0RaBvt1qaqAj0DUdL0xSBvt1qaaIi0DccLU1TBPp2q6WJ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Aj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQR6qgj0UBHooSLQU0Wgp4pADxWBHioCPVUEeqoI9FAR6KEi0FNFoKeKQA8VgR4qAj1VBHqqCPRQEeihItBTRaCnikAPFYEeKgI9VQR6qgj0UBHooSLQU0Wgp4pADxWBHioCPVUEalUEalQEalQEalUE6l+qw83SbFQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEalUEalQEalQEalUEGlUEGlQEGlQEGlUEml+qw83SHFQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEGlUEGlQEGlQEGlUEWlUEWlQEWlQEWlUE2l+qw83SXFQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlUEWlUEWlQEWlQEWlQE6h8qAn3DydL8dpOl+e02S/MbnupwsjS/3WRpfrvN0vyGm6X5DSdLs3+mCPTtNkvzG26W5jecLM1vd6K7zdL8hpul+Q0nS/PbTZbmt1stTVQE+oajpWmKQN9utTRREegbjpamKQJ9u9XSREWgbzhamqYI9O1WSxMVgb7haGmaItC3Wy1NVAT6hqOlaYpA3261NFER6BuOlqYpAn271dJERaBvOFqapgj07VZLExWBvuFoaZoi0LdbLU1UBPqGo6VpikDfbrU0URHoG46WpikCfbvV0kRFoG84WpqmCPTtVksTFYG+4WhpmiLQt1stTVQE+oajpWmKQN9utTRREegbjpamKQJ9u9XSREWgbzhamqYI9O1WSxMVgb7haGmaItC3Wy1NVAT6hqOlaYpA3261NFER6BuOlqYpAn271dJERaBvOFqapgj07VZLExWBvuFoaZoi0LcbLc2jikAHFYEOKgIdVQQ6v1SHm6V5UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgIdVQQ6qAh0UBHoqCLQUUWgg4pABxWBjioCHVUEOqgIdFAR6Kgi0FFFoIOKQAcVgY4qAh1VBDqoCHRQEeioItBRRaCDikAHFYGOKgJdVQS6qAh0URHoqiLQ/aU63CzNi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VRHoqiLQRUWgi4pAVxWBrioCXVQEuqgIdFUR6Koi0EVFoIuKQFcVga4qAl1UBLqoCHRVEeiqItBFRaCLikBXFYGuKgJdVAS6qAh0VREoVBEoUBEoUBEoVBEofqkON0szUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVBEoUBEoUBEoVBEoVREoUREoUREoVREof6kON0szUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVREoVREoUREoUREoVRGoVBGoUBGoUBGoVBGofqkON0uzUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGoUBGoVBGoVBGoUBGo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KgI9VAR6qgjUqgjUqAjUqAjUqgjUv1SHm6XZqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgjUqgjUqAjUqAjUqgg0qgg0qAg0qAg0qgg0v1SHm6U5qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgg0qgg0qAg0qAg0qgi0qgi0qAi0qAi0qgi0v1SHm6W5qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qgi0qgi0qAi0qAi0qAi0P1QE+oaTpfntJkvz222W5jc81eFkaX67ydL8dpul+Q03S/MbTpbm/kwR6NttluY33CzNbzhZmt/uRHebpfkNN0vzG06W5rebLM1vt1qaqAj0DUdL0xSBvt1qaaIi0DccLU1TBPp2q6WJikDfcLQ0TRHo262WJioCfcPR0jRFoG+3WpqoCPQNR0vTFIG+3WppoiLQNxwtTVME+narpYmKQN9wtDRNEejbrZYmKgJ9w9HSNEWgb7damqgI9A1HS9MUgb7dammiItA3HC1NUwT6dquliYpA33C0NE0R6NutliYqAn3D0dI0RaBvt1qaqAj0DUdL0xSBvt1qaaIi0DccLU1TBPp2q6WJikDfcLQ0TRHo262WJioCfcPR0jRFoG+3WpqoCPQNR0vTFIG+3WppoiLQNxwtTVME+narpYmKQN9wtDRNEejbrZYmKgJ9w9HSNEWgbzdamkcVgQ4qAh1UBDqqCHR+qQ43S/OgItBRRaCjikAHFYEOKgIdVQQ6qgh0UBHooCLQUUWgo4pABxWBDioCHVUEOqoIdFAR6KAi0FFFoKOKQAcVgQ4qAh1VBDqqCHRQEeigItBRRaCjikAHFYEOKgIdVQQ6qgh0UBHooCLQUUWgo4pABxWBDioCHVUEOqoIdFAR6KAi0FFFoKOKQAcVgQ4qAh1VBDqqCHRQEeigItBRRaCjikAHFYEOKgIdVQQ6qgh0UBHooCLQUUWgo4pABxWBDioCHVUEOqoIdFAR6KAi0FFFoKOKQAcVgQ4qAh1VBDqqCHRQEeigItBRRaCjikAHFYEOKgIdVQQ6qgh0UBHooCLQUUWgo4pABxWBDioCHVUEOqoIdFAR6KAi0FFFoKOKQAcVgQ4qAh1VBLqqCHRREeiiItBVRaD7S3W4WZoXFYGuKgJdVQS6qAh0URHoqiLQVUWgi4pAFxWBrioCXVUEuqgIdFER6Koi0FVFoIuKQBcVga4qAl1VBLqoCHRREeiqItBVRaCLikAXFYGuKgJdVQS6qAh0URHoqiLQVUWgi4pAFxWBrioCXVUEuqgIdFER6Koi0FVFoIuKQBcVga4qAl1VBLqoCHRREeiqItBVRaCLikAXFYGuKgJdVQS6qAh0URHoqiLQVUWgi4pAFxWBrioCXVUEuqgIdFER6Koi0FVFoIuKQBcVga4qAl1VBLqoCHRREeiqItBVRaCLikAXFYGuKgJdVQS6qAh0URHoqiLQVUWgi4pAFxWBrioCXVUEuqgIdFER6Koi0FVFoIuKQBcVga4qAl1VBLqoCHRREeiqIlCoIlCgIlCgIlCoIlD8Uh1ulmagIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCoIlCgIlCgIlCoIlCqIlCiIlCiIlCqIlD+Uh1ulmaiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCqIlCiIlCiIlCqIlCpIlChIlChIlCpIlD9Uh1ulmahIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlChIlCpIlCpIlChIlCh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qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg51sfXJqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPNqkOtqkOtqkPNqkPDqkOjqkOjqkPDqkPzS3Y5Wp+jqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPDqkOjqkOjqkPDqkPLqkOrqkOrqkPLqkP7S3Y5Wp+rqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkPLqkPLqkOrqkOrqkOrqkPfB0fr81tu1ud33KzP7zhan9/yZJeb9fkdN+vzO47W57ccrc9vuVmf54eqQ99wtD6/5Wh9fsvN+vyGpzocrc9vOVqf33KzPr/hZn1+w9n6VNWh75XU+kTVoW84W5+qOvS9klqfqDr0992xd4WtT1QdOj9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0HVfrE1WH/r4w9q6w9YmqQ99wtT5Vdej8VHXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQ348oV++Kqg79/WA+9bKkOpytT1Ud+iNY1cui1ierDh1WHTqqOnRUdeiw6tD5Jbscrc+jqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiy6tBV1aGrqkOXVYfuL9nlaH1eVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkPBqkOhqkOhqkPBqkPxS3Y5Wp+hqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPJqkOpqkOpqkPJqkP5S3Y5Wp+pqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPFqkOlqkOlqkPFqkP1S3Y5Wp+lqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkOPVYeeqg49VR16rDr0fskuR+vzqerQY9Whx6pDT1WHnqoOPVYdeqw69FR1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dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRZdeiq6tBV1aHLqkP3l+xytD6vqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aFg1aFQ1aFQ1aFg1aH4Jbscrc9Q1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFk1aFU1aFU1aFk1aH8Jbscrc9U1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk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qerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aFm1aFW1aFW1aFm1aH+Jbscrc9W1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFh1aFR1aFR1aFh1aH5Jbscrc9R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH9Jbscrc9V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV1aH8qerQt9ysz2+4WZ/fcLQ+v+XJLjfr8xtu1uc3HK3Pbzlan99ysz7zh6pD33C0Pr/laH1+y836/IanOhytz285Wp/fcrM+v+FmfX7D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9X6PKw6dFR16Kjq0GHVofNLdjlan0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GXVoauqQ1dVhy6rDt1fssvR+ryqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVh4JVh0JVh0JVh4JVh+KX7HK0PkNVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh4JVh0JVh0JVh4JVh5JVh1JVh1JVh5JVh/KX7HK0PlNVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh5JVh1JVh1JVh5JVh4pVh0pVh0pVh4pVh+qX7HK0PktVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVh4pVh0pVh0pVh4pVhx6rDj1VHXqqOvRYdej9kl2O1udT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOtSsOtSqOtSqOtSsOtS/ZJej9dmqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOjSsOjSqOjSqOjSsOjS/ZJej9TmqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOjSsOjSqOjSqOjSsOrSsOrSqOrSqOrSsOrS/ZJej9bmqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSsOrSsOrSqOrSqOrSqOlQ/VR36lpv1+Q036/MbjtbntzzZ5WZ9fsPN+vyGo/X5LUfr81tu1mf9UHXoG47W57ccrc9vuVmf3/BUh6P1+S1H6/NbbtbnN9ysz284W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16Bv+v1Bzx8YOJTGWBV0iUKgC4L9j+74wo67QHdORBhTjMgiBR0m2PlV16Fuu1ieqDn3D1foMVh0KVR0KVR0KVh2KX7HL0foMVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh1KVh1KVR1KVR1KVh3KX7HL0fpMVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh06rDp0VHXoqOrQYdWh8yt2OVqfR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOpQsepQqepQqepQsepQ/YpdjtZnqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQserQZdWhq6pDV1WHLqsO3V+xy9H6vKo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHHqsOPVUdeqo69Fh16P2KXY7W51PVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw61Kw61Ko61Ko61Kw61L9il6P12ao61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw61Kw61Ko61Ko61Kw6NKw6NKo6NKo6NKw6NL9il6P1Oao6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6NKw6NKo6NKo6NKw6tKw6tKo6tKo6tKw6tL9il6P1uao6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6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mlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHhlWHRlWHRlWHhlWH5lfscrQ+R1WHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHllWHVlWHVlWHllWH9lfscrQ+V1WHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHVlWH5qeqQ99ysz6/4WZ9fsPR+vyWF7vcrM9vuFmf33C0Pr/laH1+y836nB+qDn3D0fr8lqP1+S036/MbXupwtD6/5Wh9fsvN+vyGm/X5DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1X6zNYdShUdShUdShYdSh+xS5H6zNUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShZdShVdShVdShZdSh/xS5H6zNVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdeiw6tBR1aGjqkOHVYfOr9jlaH0eVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkPFqkOlqkOlqkPFqkP1K3Y5Wp+lqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkOXVYeuqg5dVR26rDp0f8UuR+vzqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh16rDr0VHXoqerQY9Wh9yt2OVqfT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXosepQs+pQq+pQq+pQs+pQ/4pdjtZnq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+rQsOrQqOrQqOrQsOrQ/IpdjtbnqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsurQqurQqurQsurQ/opdjtbnqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQqurQ/lR16Ftu1uc33KzPbzhan9/yYpeb9fkNN+vzG47W57ccrc9vuVmf+0PVoW84Wp/fcrQ+v+VmfX7DSx2O1ue3HK3Pb7lZn99wsz6/4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFqfQarDoWqDoWqDgWrDsWv2OVofYaqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWq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VR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh0aVh0aVR0aVR0aVh2aX7HL0focVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh0aVh0aVR0aVR0aVh1aVh1aVR1aVR1aVh3aX7HL0fpcVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVh1aVh1aVR1aVR1aVB3K3w9Vh/6Wk/X5N5ysz7/hZn3+LS92OVmff8PJ+vwbbtbn33KzPv+Wk/X5DTfVob/hZn3+LTfr8285WZ9/w0sdbtbn33KzPv+Wk/X5N5ysz7/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G84W5+oOvS3XK1PUx36G87WJ6oO/S1X69NUh/6Gs/WJqkN/y9X6NNWhv+FsfaLq0N9ytT5NdehvOFufqDr0t1ytT1Md+hvO1ieqDv0tV+vTVIf+hrP1iapDf8vV+jTVob/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G84W5+oOvS3XK1PUx36G87WJ6oO/S1X69NUh/6Gs/WJqkN/y9X6NNWhv+FqfQarDoWqDoWqDgWrDsWv2OVofYaqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDgWrDoWqDoWqDgWrDiWrDqWqDqWqDiWrDuWv2OVofaaqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDiWrDqWqDqWqDiWrDh1WHTqqOnRUdeiw6tD5Fbscrc+jqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdahYdahUdahUdahYdah+xS5H67NUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdahYdahUdahUdahYdeiy6tBV1aGrqkOXVYfur9jlaH1eVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOPVYeeqg49VR16rDr0fsUuR+vzqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1W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Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoWbVoVbVoVbVoWbVof4Vuxytz1bVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWHVoVHVoVHVoWHVofkVuxytz1HVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWXVoVXVoVXVoWXVof0Vuxytz1XVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoVXVofNT1aFvuVmf33CzPr/haH1+y4tdbtbnN9ysz284Wp/fcrQ+v+VmfZ4fqg59w9H6/Jaj9fktN+vzG17qcLQ+v+VofX7Lzfr8hpv1+Q1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNV+szWHUoVHUoVHUoWHUofsUuR+szVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWXUoVXUoVXUoWXUof8UuR+szVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXXosOrQUdWho6pDh1WHzq/Y5Wh9HlUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDxapDpapDpapDxapD9St2OVqfpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDl1WHrqoOXVUduqw6dH/FLkfr86rq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNX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FDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFA3rFA3rFA3rFA3rFM2v2OVqhw7rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFC3rFC3rFC3rFC3rFO2v2OVqhy7rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFK3qFN2f6hR9y9EO/ZajHfotRzv0W17scrRDv+Voh37L0Q79lqMd+i1HO/T+VKfoW4526Lcc7dBvOdqh3/Jil6Md+i1H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Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06RcM6RcM6RcM6RcM6RfMrdrnaocM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6Rcs6Rcs6Rcs6Rcs6Rfsrdrnaocs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Rcs6Ras6Rf1TnaJvOdqh33K0Q7/laId+y4tdjnbotxzt0G852qHfcrRDv+Voh/ZPdYq+5WiHfsvRDv2Wox36LS92Odqh33K0Q7/laId+y9EO/ZazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZ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WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9FinqFmnqFmnqFmnqFmnqH/FLlc7tFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnaFinaFinaFinaFinaH7FLlc7dFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFmnaFmnaFmnaFmnaH/FLlc7dFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmn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dYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2ixzpFj3WKHusUPdYper9il6sd+lin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUNesUNesUNesUNesU9a/Y5WqHNusUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUDesUDesUDesUDesUza/Y5WqHDusUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesULesULesULesULesU7a/Y5WqHLusULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesUreoU7U91ir7laId+y9EO/ZajHfotL3Y52qHfcrRDv+Voh37L0Q79lqMduj/VKfqWox36LUc79FuOdui3vNjlaId+y9EO/ZajHfotRzv0W852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6Fuu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KXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52iZp2iZp2iZp2iZp2i/hW7XO3QZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iZp2iYZ2iYZ2iYZ2iYZ2i+RW7XO3QYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iYZ2iZZ2iZZ2iZZ2iZZ2i/RW7XO3QZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iZZ2iRZ2i8/uhTtHfcrND/5abHfq33OzQv+XFLjc79G+52aF/y80O/VtudujfcrNDv+WoU/S33OzQv+Vmh/4tNzv0b3mxy80O/VtudujfcrND/5abHfq3nO1Q1Cn6W852KOoU/S1nOxR1iv6Wsx2KOkV/y9kORZ2iv+Vsh6JO0d9ytkNRp+hvOduhqFP0t5ztUNQp+lvOdijqFP0tZzsUdYr+lrMdijpFf8vZDkWdor/lbIeiTtHfcrZDUafobznboahT9Lec7VDUKfpbznYo6hT9LWc7FHWK/pazHYo6RX/L2Q5FnaK/5WyHok7R33K2Q1Gn6G8526GoU/S3nO1Q1Cn6W852KOoU/S1nOxR1iv6Wsx2KOkV/y9kORZ2iv+Vsh6JO0d9ytkNRp+hvOduhqFP0t5ztUNQp+lvOdijqFP0tZzsUdYr+lrMdijpFf8vZDkWdor/lbIeiTtHfcrZDUafobznboahT9Ldc7dBgnaJgnaJgnaJgnaL4Fbtc7dBgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJgnaJknaJknaJknaJknaL8Fbtc7dBknaL/R82940aUBFkW3FL6NyL2v7F5FLrFUarQBQPlIC6ZrhwkYMk6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6Rck6RcU6RcU6RcU6RcU6RfVrdrnaocU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6RcU6Rc06Rc06Rc06Rc06Rf1rdrnaoc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06Rc06RcM6RcM6RcM6RcM6RfNrdrnaocM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6RcM6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KFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFmnKFmnKFmnKFmnKH/NLlc7NFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnqFinqFinqFinqFinqH7NLlc7tFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFinqFmnqFmnqFmnqFmnqH/NLlc7tFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnqFmnaFinaFinaFinaFinaH7NLlc7dFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFinaFmnaFmnaFmnaFmnaH/NLlc7dFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmnaFmn6LBO0WGdosM6RYd1is6v2eVqhx7WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RZd1ii7rFF3WKbqsU3R/zS5XO/SyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKXqsU/RYp+ixTtFjnaL3a3a52qGPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ipTlH+VKfoW4526Lcc7dBvOdqh3/Jml6Md+i1HO/Rbjnbotxzt0G852qH5U52ibznaod9ytEO/5WiHfsubXY526Lcc7dBvOdqh33K0Q7/lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WqHBusUBesUBesUBesUxa/Z5WqHBusUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUBesUJesUJesUJesUJesU5a/Z5WqHJusUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUJesUFesUFesUFesUFesU1a/Z5WqHFusUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUNesUNesUNesUNesU9a/Z5WqHNusUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUDesUDesUDesUDesUza/Z5WqHDusUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesULesULesULesULesU7a/Z5WqHLusULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesUHdYpOqxTdFin6LBO0fk1u1zt0MM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7R+edO0fflwf8s//4P///l7/zvsfx+/2z4P2eK/qvh8X85PH7/+4vjd/7h8mSXl3osrQ4f9laWXX7UY7nq8Kfeyv2xywM9lpvq8GJvpdnlox7LqsMPeyuXXa7W51Pr87H1+dj6fGp9/nOa6L8aztbnY+vzqfX51Pp8an3en1qf94fW5/2h9Xl/an3eX7PL0fq8P7Q+70+tz/tT6/P+0Pq8gdbnDbU+b6j1eQOtz/vPQaL/arhanzfU+ryB1ucNtD5vsPWZbH2mWp+p1mey9fnPLaL/bLlan6nWZ7L1mWx9plqfpdZnsfVZbH2WWp//nCH6r4az9VlsfZZan6XWZ7H12Wx9tlqfrdZns/X5zwWi/2y5Wp+t1mez9dlsfbZan6PW57D1OWx9jlqf/xwf+q+Gs/U5bH2OWp+j1uew9blsfa5an6vW57L1+c/dof9suVqfq9bnsvW5bH2q6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDr0WHXoqerQU9Whx6pD79fscrQ+n6oOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQU9Wh+qnq0LfcrM9vuFmf33C0Pr/lzS436/MbbtbnNxytz285Wp/fcrM+64eqQ99wtD6/5Wh9fsvN+vyGtzocrc9vOVqf33KzPr/hZn1+w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPV+gxWHQpVHQpVHQpWHYpfs8vR+gxVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHQpWHQpVHQpVHQpWHUpWHUpVHUpVHUpWHcpfs8vR+kxVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHUpWHUpVHUpVHUpWHSpWHSpVHSpVHSpWHapfs8vR+ixVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHSpWHSpVHSpVHSpWHWpWHWpVHWpVHWpWHepfs8vR+mxVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHWpWHWpVHWpVHWpWHRpWHRpVHRpVHRpWHZpfs8vR+hxVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHRpWHRpVHRpVHRpWHVpWHVpVHVpVHVpWHdpfs8vR+lxVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHVpWHVpVHVpVHVpWHTqsOnRUdeio6tBh1aHza3Y5Wp9HVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pD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Q6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ8WqQ6WqQ6WqQ8WqQ82qQ62qQ62qQ82qQ/1rdjlan62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ82qQ62qQ62qQ82qQ8OqQ6OqQ6OqQ8OqQ/Nrdjlan6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8OqQ6OqQ6OqQ8OqQ8uqQ6uqQ6uqQ8uqQ/trdjlan6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uqQ6uqQ8uqQ8uqQ6uq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KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1qFh1qFR1qFR1qFh1qH7NLkfrs1R1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFl1qFV1qFV1qFl1qH/NLkfrs1V1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1aFh1aFR1aFR1aFh1aH7NLkfrc1R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH/NLkfrc1V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl16LDq0FHVoaOqQ4dVh86v2eVofR5VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ5dVh66qDl1VHbqsOnR/zS5H6/Oq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHXqsOvRUdeip6tBj1aH3a3Y5Wp9PVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeip6tD+VHXoW27W5zfcrM9vOFqf3/Jml5v1+Q036/Mbjtbntxytz2+5WZ/7Q9Whbzhan99ytD6/5WZ9fsNbHY7W57ccrc9vuVmf33CzPr/hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wp9BqsOhaoOhaoOBasOxa/Z5Wh9hqoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOJasOpaoOpaoOJasO5a/Z5Wh9pqoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOFasOlaoOlaoOFasO1a/Z5Wh9lqoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasONasOtaoOtaoONasO9a/Z5Wh9tqoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasODasOjaoOjaoODasOza/Z5Wh9jqoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasOLasOraoOraoOLasO7a/Z5Wh9rqoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasO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UlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHilWHSlWHSlWHilWH6tfscrQ+S1WHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHmlWHWlWHWlWHmlWH+tfscrQ+W1WHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHhlWHRlWHRlWHhlWH5tfscrQ+R1WHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWH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oapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDyapDqapDqapDyapD+Wt2OVqfqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDxapDpapDpapDxapD9Wt2OVqfpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDzapDrapDrapDzapD/Wt2OVqfrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDw6pDo6pDo6pDw6pD82t2OVqfo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pDy6pDq6pDq6pDy6pD+2t2OVqfq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDy6pDq6pDq6pDy6pDh1WHjqoOHVUdOqw6dH7NLkfr86jq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYduqw6dFV16Krq0GXVoftrdjlan1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GPVoaeqQ09Vhx6rDr1fs8vR+nyqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ09Vh95PVYe+5WZ9fsPN+vyGo/X5LW92uVmf33CzPr/haH1+y9H6/Jab9fl+qDr0DUfr81uO1ue33KzPb3irw9H6/Jaj9fktN+vzG27W5zecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3XK3PYNWhUNWhUNWhYNWh+DW7HK3PUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhZNWhVNWhVNWhZNWh/DW7HK3PVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhYtWhUtWhUtWhYtWh+jW7HK3PUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhZtWhVtWhVtWhZtWh/jW7HK3PVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhYdWhUdWhUdWhYdWh+TW7HK3PUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhZdWhVdWhVdWh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YNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhZNWhVNWhVNWhZNWh/DW7HK3PVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhYtWhUtWhUtWhYtWh+jW7HK3PUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhZtWhVtWhVtWhZtWh74ddjtZnq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQ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Pputz2brs9X6HLU+h63PYetz1Pr8F9Sh/2g4W5/D1ueo9TlqfQ5bn8vWJ6oOfcPV+lTVoW95s8vV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQ91ytT1Qd+vvA2Fth6xNVh77han2q6lD8VHXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9X6DFYdClUdClUdClYdil+zy9H6DFUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdSlYdSlUdSlUdSlYdyl+zy9H6TFUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdKlYdKlUdKlUdKlYdql+zy9H6LFUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdalYdalUdalUdalYd6l+zy9H6bFUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdGlYdGlUdGlUdGlYdml+zy9H6HFUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdGlYdGlUdGlUdGlYdWlYdWlUdWlUdWlYd2l+zy9H6XFUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdWlYdWlUdWlUdWlYdOqw6dFR16Kjq0GHVofNrdjlan0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GXVoauqQ1dVhy6rDt1fs8vR+ryqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhx6rDj1VHXqqOvRYdej9ml2O1udT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqsOvRYdeip6tBT1aHHqkOPVYeeqg49VR16rDr0WHXoqerQU9Whx6pDj1WHnqoOPVUdeqw69Fh16Knq0FPVoceqQ49Vh56qDj1VHXqqOpQ/VR36lpv1+Q036/Mbjtbnt7zZ5WZ9fsPN+vyGo/X5LUfr81tu1mf+UHXoG47W57ccrc9vuVmf3/BWh6P1+S1H6/NbbtbnN9ysz284W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvuFqfwapDoapDoapDwapD8Wt2OVqfoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDwapDoapDoapDwapDyapDqapDqapDyapD+Wt2OVqfqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDyapDqapDqapDyapDxapDpapDpapDxapD9Wt2OVqfpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDzapDrapDrapDzapD/Wt2OVqfrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDw6pDo6pDo6pDw6pD82t2OVqfo6pDw6pDw6pDo6pDo6pDw6pDw6pDo6pDo6pDw6pD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qkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNV+szWHUoVHUoVHUoWHUofs0uR+szVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWXUoVXUoVXUoWXUof80uR+szVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXWoWHWoVHWoVHWoWHWofs0uR+uzVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWHWoVHWoVHWoWHWoWXWoVXWoVXWoWXWof80uR+uzVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXVoWHVoVHVoVHVoWHVofs0uR+tzVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWXVoVXVoVXVoWXVof80uR+tzVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVo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qg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4lqw6lqg6lqg4lqw4Vqw6Vqg6Vqg4Vqw7Vr9nlaH2Wqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw41qw61qg61qg41qw71r9nlaH22qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw4Nqw6Nqg6Nqg4Nqw7Nr9nlaH2Oqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6N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1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFk1aFU1aFU1aFk1aH8Nbscrc9U1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFi1aFS1aFS1aFi1aH6Nbscrc9S1aFi1aFi1aFS1aFS1aFi1aFi1aFS1aFS1aFi1aFi1aFS1aFS1aFi1aFi1aFS1aFS1aFi1aFi1aFS1aFS1aFi1aH/R829G9u261oWdGmSAPHx37EaS7lqCTvinUgPugAITclg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFk1aFU1aFU1aFk1aH8Jbscrc9U1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aHHqkNPVYeeqg49Vh16v2SXo/X5VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw4Vqw6Vqg6Vqg4Vqw7VL9nlaH2Wqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw41qw61qg61qg41qw71L9nlaH22qg41qw41qw61qg61qg41qw41qw71QeuzVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXWoWXWoVXWoVXWoWXVoWHVoVHVoVHVoWHVofskuR+tzVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWXVoVXVoVXVoWXVof8kuR+tzVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoVXWofqo69C036/MbbtbnNxytz295ssvN+vyGm/X5DUfr81uO1ue33KzP+qHq0Dccrc9vOVqf33KzPr/hqQ5H6/Nbjtbnt9ysz2+4WZ/fcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C1Pg+rDh1VHTqqOnRYdej8kl2O1udR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRZdeiq6tBV1aHLqkP3l+xytD6vqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aFg1aFQ1aFQ1aFg1aH4Jbscrc9Q1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFg1aFQ1aFQ1aFg1aFk1aFU1aFU1aFk1aH8Jbscrc9U1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aFk1aFU1aFU1aFk1aHHqkNPVYeeqg49Vh16v2SXo/X5VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw4Vqw6Vqg6Vqg4Vqw7VL9nlaH2Wqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw4Vqw6Vqg6Vqg4Vqw41qw61qg61qg41qw71L9nlaH22qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw41qw61qg61qg41qw4Nqw6Nqg6Nqg4Nqw7NL9nlaH2Oqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6Nqg6Nqg4Nqw4Nqw6N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1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFh1aFR1aFR1aFh1aH5Jbscrc9R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH9Jbscrc9V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV1aH5qerQt9ysz2+4WZ/fcLQ+v+XJLjfr8xtu1uc3HK3Pbzlan99ysz7nh6pD33C0Pr/laH1+y836/IanOhytz285Wp/fcrM+v+FmfX7D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NV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OlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOlSsOlSqOlSqOlSsOtSsOtSqOtSqOtSsOtS/ZJej9dmqOtSsOtSsOtSqOtSqOtSsOtSsOtSqOtSqOtSsOtRHrc9W1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFm1aFW1aFW1aFm1aFh1aFR1aFR1aFh1aH5Jbscrc9R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH9Jbscrc9V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV1aH9qerQt9ysz2+4WZ/fcLQ+v+XJLjfr8xtu1uc3HK3Pbzlan99ysz73h6pD33C0Pr/laH1+y836/IanOhytz285Wp/fcrM+v+FmfX7D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9X6PKw6dFR16Kjq0GHVofNLdjlan0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVofPv6tC8/N/yqf/P8lf/u5a3/7g82eXv/3R5nf9dS9U/Li92ebPXMuzyVa/l3+Wh/2z5Ua/l3+mh/2x5sNeS7PLHXkuxy5u9lmGXr3ot/WOXH/Va+rLL2Q79d4DoP1vOdmizHdpshzbboc126LAdOmyHDtuhw3bovytE/9lytkOH7dBhO3TYDh22Q5ft0GU7dNkOXbZD/50i+s+Wsx26bIcu26HLduiqHXp/aofen9qh96d26P2pHXp/yS5XO/T+1A69P7VD70/t0PtTO/QetUPvUTv0HrVD71E79P47SvSfLVc79B61Q+9RO/QetUPvYTv0sh162Q69bIdetkP/XSb6z5azHXrZDr1sh162Qy/bocF2aLAdGmyHBtuh/84T/WfL2Q4NtkOD7dBgOzTYDk22Q5Pt0GQ7NNkO/Xej6D9bznZosh2abIcm26HJduhjO/SxHfrYDmWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmnKFinKFinKFinKFinKH7JLlc7NFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFinKFmnKFmnKFmnKFmnKH/JLlc7NFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmnKFmn6LFO0WOdosc6RY91it4v2eVqhz7W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KSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKWrWKWrWKWrWKWrWKepfssvVDm3WKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKRrWKRrWKRrWKRrWKZpfssvVDh3WKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKRrWKVrWKVrWKVrWKVrWKdpfssvVDl3WKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrWKVrVKTo/1Sn6lqMd+i1HO/RbjnbotzzZ5WiHfsvRDv2Wox36LUc79FuOduj5qU7Rtxzt0G852qHfcrRDv+XJLkc79FuOdui3HO3Qbznaod9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrVDD+sUHdYpOqxTdFin6PySXa526GGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFmn6LJO0WWdoss6RfeX7HK1Qy/rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdomCdomCdomCdomCdovglu1zt0GCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomCdomSdomSdomSdomSdovwlu1zt0GSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdomSdosc6RY91ih7rFD3WKXq/ZJerHfpYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFBXrFBXrFBXrFBXrFNUv2eVqhxbrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFBXrFDXrFDXrFDXrFDXrFPUv2eVqhzbrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFDXrFA3rFA3rFA3rFA3rFM0v2eVqhw7rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFA3rFC3rFC3rFC3rFC3rFO0v2eVqhy7rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFC3rFK3qFN2f6hR9y9EO/ZajHfotRzv0W57scrRDv+Voh37L0Q79lqMd+i1HO/T+VKfoW4526Lcc7dBvOdqh3/Jkl6Md+i1HO/Rbjnbotxzt0G8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvudqhh3WKDusUHdYpOqxTdH7JLlc79LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpuqxTdFmn6LJO0WWdovtLdrnaoZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJOUbBOUbBOUbBOUbBOUfySXa52aLBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbBOUbJOUbJOUbJOUbJOUf6SXa52aLJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJOUbJO0WOdosc6RY91ih7rFL1fssvVDn2sU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91iop1iop1iop1iop1iuqX7HK1Q4t1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1iop1ipp1ipp1ipp1ipp1ivqX7HK1Q5t1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ipp1ioZ1ioZ1ioZ1ioZ1iuaX7HK1Q4d1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ipZ1ipZ1ipZ1ipZ1ivaX7HK1Q5d1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ilZ1iuKnOkXfcrRDv+Voh37L0Q79lie7HO3Qbznaod9ytEO/5WiHfsvRDo2f6hR9y9EO/ZajHfotRzv0W57scrRDv+Voh37L0Q79lqMd+i1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtVzv0sE7RYZ2iwzpFh3WKzi/Z5WqHHtYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFl3WKLusUXdYpuqxTdH/JLlc79LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpCtYpCtYpCtYpCtYpil+yy9UODdYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpCtYpStYpStYpStYpStYpyl+yy9UOTdYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpStYpeqxT9Fin6LFO0WOdovdLdrnaoY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFOUbFOUbFOUbFOUbFOUf2SXa52aLFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbFOUbNOUbNOUbNOUbNOUf+SXa52aLNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNOUbNO0bBO0bBO0bBO0bBO0fySXa526LBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO0bBO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atYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpGtYpGtYpGtYpGtYpml+yy9UOHdYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpGtYpWtYpWtYpWtYpWtYp2l+yy9UOXdYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtYpWtUpej/VKfqWox36LUc79FuOdui3PNnlaId+y9EO/ZajHfotRzv0W4526PupTtG3HO3Qbznaod9ytEO/5ckuRzv0W4526Lcc7dBvOdqh33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hb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FesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUFesUNesUNesUNesUNesU9S/Z5WqHNusUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUNesUDesUDesUDesUDesUzS/Z5WqHDusUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesUDesULesULesULesULesU7S/Z5WqHLusULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesULesUreoU1U91ir7laId+y9EO/ZajHfotT3Y52qHfcrRDv+Voh37L0Q79lqMdWj/VKfqWox36LUc79FuOdui3PNnlaId+y9EO/ZajHfotRzv0W852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FuuduhhnaLDOkWHdYoO6xSdX7LL1Q49rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYou6xRd1im6rFN0Wafo/pJdrnboZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1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rFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFNUrFPUrFPUrFPUrFPUrFPUv2SXqx3arFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFPUrFM0rFM0rFM0rFM0rFM0v2SXqx06rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFM0rFO0rFO0rFO0rFO0rFO0v2SXqx26rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0rFO0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Y52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYqKdYqKdYqKdYqKdYrql+xytUOLdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqKdYqadYqadYqadYqadYr6l+xytUObdYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqadYqGdYqGdYqGdYqGdYrml+xytUOHdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqGdYqWdYqWdYqWdYqWdYr2l+xytUOXdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYqWdYpWdYr2pzpF33K0Q7/laId+y9EO/ZYnuxzt0G852qHfcrRDv+Voh37L0Q7dn+oUfcvRDv2Wox36LUc79Fue7HK0Q7/laId+y9EO/ZajHfotZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LVc79LBO0WGdosM6RYd1is4v2eVqhx7WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RZd1ii7rFF3WKbqsU3R/yS5XO/SyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKQrWKQrWKQrWKQrWKYpfssvVDg3WKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKUrWKUrWKUrWKUrWKcpfssvVDk3WKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKXqsU/RYp+ixTtFjnaL3S3a52qGPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTlGxTlGxTlGxTlGxTlH9kl2udmixTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGxTlGzTlGzTlGzTlGzTlH/kl2udmizTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTlGzTtGwTtGwTtGwTtGwTtH8kl2uduiwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGwTtGyTtGyTtGyTtGyTtH+kl2uduiyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGyTtGiTlH9fqhT9Lfc7NC/5WaH/i03O/RvebLLzQ79W2526N9ys0P/lpsd+rfc7NBvOeoU/S03O/Rvudmhf8vNDv1bnuxys0P/lpsd+rfc7NC/5WaH/i1nOxR1iv6Wsx2KOkV/y9kORZ2iv+Vsh6JO0d9ytkNRp+hvOduhqFP0t5ztUNQp+lvOdijqFP0tZzsUdYr+lrMdijpFf8vZDkWdor/lbIeiTtHfcrZDUafobznboahT9Lec7VDUKfpbznYo6hT9LWc7FHWK/pazHYo6RX/L2Q5FnaK/5WyHok7R33K2Q1Gn6G8526GoU/S3nO1Q1Cn6W852KOoU/S1nOxR1iv6Wsx2KOkV/y9kORZ2iv+Vsh6JO0d9ytkNRp+hvOduhqFP0t5ztUNQp+lvOdijqFP0tZzsUdYr+lrMdijpFf8vZDkWdor/lbIeiTtHfcrZDUafobznboahT9Lec7VDUKfpbznYo6hT9LVc79LBO0WGdosM6RYd1is4v2eVqhx7WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RZd1ii7rFF3WKbqsU3R/yS5XO/SyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKQrWKQrWKQrWKQrWKYpfssvVDg3WKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKQrWKUrWKUrWKUrWKUrWKcpfssvVDk3WKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKUrWKfp/1NxBqgNJrKbRLVkKKULa/8Y6L3S/aQ+qeMWZO5PfWGC+ySnWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKSrWKWrWKWrWKWrWKWrWKepfscvVDm3WKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrWKWrW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vuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrVDg3WKgnWKgnWKgnWK4lfscrVDg3WKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKgnWKknWKknWKknWKknWK8lfscrVDk3WKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKknWKDusUHdYpOqxTdFin6PyKXa526GGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iw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atYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpatYpuqxTdFmn6LJO0WWdovsrdrnaoZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WWdoss6RZd1ii7rFF3WKbqsU3RZp+iyTtFlnaLLOkWXdYou6xRd1im6rFN0Wafosk7RZZ2iyzpFl3WKLusUXdYpuqxTdFmn6LJO0WOdosc6RY91ih7rFL1fscvVDn2sU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ih7rFD3WKXqsU/RYp+ixTtFjnaLHOkWPdYoe6xQ91il6rFP0WKfosU7RY52ixzpFj3WKHusUPdYpeqxT9Fin6LFO0WOdosc6RY91ioZ1ioZ1ioZ1ioZ1iuZX7HK1Q4d1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ioZ1ipZ1ipZ1ipZ1ipZ1ivZX7HK1Q5d1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ipZ1ilZ1iuqnOkXfcrRDv+Voh37L0Q79lhe7HO3Qbznaod9ytEO/5WiHfsvRDq2f6hR9y9EO/ZajHfotRzv0W17scrRDv+Voh37L0Q79lqMd+i1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtZztUdYq+5WyHqk7Rt5ztUNUp+pazHao6Rd9ytkNVp+hbznao6hR9y9kOVZ2ibznboapT9C1nO1R1ir7lbIeqTtG3nO1Q1Sn6lrMdqjpF33K2Q1Wn6FvOdqjqFH3L2Q5VnaJvOduhqlP0LWc7VHWKvuVsh6pO0bec7VDVKfqWsx2qOkXfcrZDVafoW852qOoUfcvZDlWdom8526GqU/QtVzs0WKcoWKcoWKcoWKcofsUuVzs0WKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWKcoWacoWacoWacoWacof8UuVzs0WacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWacoWafosE7RYZ2iwzpFh3WKzq/Y5WqHHtYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO0WGdosM6RYd1ig7rFB3WKTqsU3RYp+iwTtFhnaLDOkWHdYoO6xQd1ik6rFN0WKfosE7RYZ2iwzpFh3WKDusUHdYpOqxTdFin6LBO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9FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9WhYdWhUdWhUdWhYdWh+RW7HK3PUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhZdWhVdWhVdWhZdWh/RW7HK3PVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhVdWh91PVoW+5WZ/fcLM+v+FofX7Li11u1uc33KzPbzhan99ytD6/5WZ9vh+qDn3D0fr8lqP1+S036/MbXupwtD6/5Wh9fsvN+vyGm/X5DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1X6zNYdShUdShUdShYdSh+xS5H6zNUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShYdShUdShUdShYdShZdShVdShVdShZdSh/xS5H6zNVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShVdShZdShZdShVdShV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qOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsurQqurQqurQsurQ/opdjtbnqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQqurQ/FR16Ftu1uc33KzPbzhan9/y/9W/z391uVmf33CzPr/haH1+y9H6/Jab9Tk/VB36hqP1+S1H6/NbbtbnN7zU4Wh9fsvR+vyWm/X5DTfr8xvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5RdegbrtZnsOpQqOpQqOpQsOpQ/IpdjtZnqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsOpQqOpQqOpQsOpQsupQqupQqupQsupQ/opdjtZnqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsurQYdWho6pDR1WHDqsOnV+xy9H6PKo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHilWHSlWHSlWHilWH6lfscrQ+S1WHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHmlWHWlWHWlWHmlWH+lfscrQ+W1WHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHLqsOXVUduqo6dFl16P6KXY7W51XVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw69Fh16Knq0FPVoceqQ+9X7HK0Pp+qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoWHVoVHVoVHVoWHVofkVuxytz1HVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWXVoVXVoVXVoWXVof0Vuxytz1XVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoVXVof2p6tC33KzPb7hZn99wtD6/5cUuN+vzG27W5zccrc9vOVqf33KzPveHqkPfcLQ+v+VofX7Lzfr8hpc6HK3Pbzlan99ysz6/4WZ9fsPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77l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tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKw6tKw6tKo6tKo6tKg69H4/VB36W07W599wsj7/hpv1+be82OVkff4NJ+vzb7hZn3/Lzfr8W07W5zfcVIf+hpv1+bfcrM+/5WR9/g0vdbhZn3/Lzfr8W07W599wsj7/hrP1iapDf8vV+jTVob/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G84W5+oOvS3XK1PUx36G87WJ6oO/S1X69NUh/6Gs/WJqkN/y9X6NNWhv+FsfaLq0N9ytT5NdehvOFufqDr0t1ytT1Md+hvO1ieqDv0tV+vTVIf+hrP1iapDf8vV+jTVob/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G84W5+oOvS3XK1PUx36G87WJ6oO/S1X69NUh/6Gq/UZrDoUqjoUqjoUrDoUv2KXo/UZqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDoUrDoUqjoUqjoUrDqUrDqUqjqUqjqUrDqUv2KXo/WZqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDqUrDqUqjqUqjqUrDp0WHXoqOrQUdWhw6pD51fscrQ+j6oOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhw6pDR1WHjqoOHVYdOqw6dFR16Kjq0GHVocOqQ0dVh46qDh1WHTqsOnRUdeio6tBh1aHDqkNHVYeOqg4dVh06rDp0VHXoqOrQYdWhYtWhUtWhUtWhYtWh+hW7HK3PUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhZtWhVtWhVtWhZtWh/hW7HK3PVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhy6pDV1WHrqoOXVYdur9il6P1eVV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOPVYdeqo69FR16LHq0PsVuxytz6eqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh1aFh1aFR1aFR1aFh1aH7FLkfrc1R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH/FLkfrc1V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV16PviaH1+y836/B436/N7HK3Pb3mxy836/B436/N7HK3Pbzlan99ysz7jh6pD33C0Pr/laH1+y836/IaXOhytz2/5ZZeb9fkNN+vzG87Wp6oOfW9S6xNVh77hbH2q6tD3JrU+UXXo77djb4WtT1Qdih+qDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36HlfrE1WH/n4w9lbY+kTVoW+4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qupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsurQYdWho6pDR1WHDqsOnV+xy9H6PKo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHilWHSlWHSlWHilWH6lfscrQ+S1WHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHmlWHWlWHWlWHmlWH+lfscrQ+W1WHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHLqsOXVUduqo6dFl16P6KXY7W51XVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw69Fh16Knq0FPVoceqQ+9X7HK0Pp+qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoceqQ09Vh56qDj1WHXqsOvRUdeip6tBj1aHHqkNPVYeeqg49Vh16rDr0VHXoqerQY9Whx6pDT1WHnqoOPVYdeqw69FR16Knq0GPVoWHVoVHVoVHVoWHVofkVuxytz1HVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWHVoVHVoVHVoWHVoWXVoVXVoVXVoWXVof0Vuxytz1XVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoWXVoWXVoVXVoVXVoVXVofNT1aFvuVmf33CzPr/haH1+y4tdbtbnN9ysz284Wp/fcrQ+v+VmfZ4fqg59w9H6/Jaj9fktN+vzG17qcLQ+v+VofX7Lzfr8hpv1+Q1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNV+szWHUoVHUoVHUoWHUofsUuR+szVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWHUoVHUoVHUoWHUoWXUoVXUoVXUoWXUof8UuR+szVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXUoWXUoVXUoVXUoWXXosOrQUdWho6pDh1WHzq/Y5Wh9HlUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDxapDpapDpapDxapD9St2OVqfpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDxapDpapDpapDxapDzapDrapDrapDzapD/St2OVqfrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDzapDrapDrapDzapDl1WHrqoOXVUduqw6dH/FLkfr86rq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYdeqw69FR16Knq0GPVofcrdjlan09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Wh9y+oQ1v/97Pnl/2/diz/gjr0Hw0//5vD/9VbKXZ5q8dy1eGPvZVhly96LP+COvQfDQ/1Vk6yy496LKUOb/ZWLrv8qccy6vBVb6V+7HK1Pkutz2Lr819Qh/6r5Wp9llqfxdZnsfVZan22Wp/N1mez9dlqff4L6tB/NJytz2brs9X6bLU+m63Py9bnVevzqvV52fr8F9Sh/2q5Wp9Xrc/L1udl6/Oq9fnU+nxsfT62Pp9an/+COvQfDWfr87H1+dT6fGp9PrY+h63PUetz1Poctj7/BXXov1qu1ueo9TlsfQ5bn6PW56r1uWx9Llufq9bnv6AO/UfD2fpctj5Xrc9V63PV+pyfWp/zQ+tzfmh9zk+tz/kVuxytz/mh9Tk/tT7np9bn/ND6nEDrc0Ktzwm1PifQ+px/QR36j4ar9Tmh1ucEWp8TaH1OsPWZbH2q6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCw6tCo6tCo6tCw6tCy6tCq6tCq6tCy6tD+il2O1ueq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCy6tCy6tCq6tCq6tCq6lD9VHXoW27W5zfcrM9vOFqf3/Jil5v1+Q036/Mbjtbntxytz2+5WZ/1Q9Whbzhan99ytD6/5WZ9fsNLHY7W57ccrc9vuVmf33CzPr/hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wp9BqsOhaoOhaoOBasOxa/Y5Wh9hqoOBasOBasOxQ+tz1DVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWTVoVTVoVTVoWTVofwVuxytz1TVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTV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6LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdWhYdWhUdWhUdWhYdWh+yS5H63NUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhZdWhVdWhVdWhZdWh/yS5H63NVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhVdah/qjr0LTfr8xtu1uc3HK3Pb3myy836/Iab9fkNR+vzW47W57fcrM/+oerQNxytz285Wp/fcrM+v+GpDkfr81uO1ue33KzPb7hZn99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLU+D6sOHVUdOqo6dFh16PySXY7W51HVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFl16Krq0FXVocuqQ/eX7HK0Pq+qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVoWDVoVDVoVDVoWDVofgluxytz1DVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWDVoVDVoVDVoWDVoWTVoVTVoVTVoWTVofwluxytz1TVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWTVoVTVoVTVoWTVoWLVoVLVoVLVoWLVofoluxytz1LVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWLVoVLVoVLVoWLVoWbVoVbVoVbVoWbVof4luxytz1bVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbVoWbVoWbVoVbVoVbV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UKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULDqUKjqUKjqULDqULLqUKrqUKrqULLqUP6SXY7WZ6rqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULHqUKnqUKnqULHqUP2SXY7WZ6nqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULPqUKvqUKvqULPqUP+SXY7WZ6vqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPq0GPVoaeqQ09Vhx6rDr1fssvR+nyqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vh4ZVh0ZVh0ZVh4ZVh+aX7HK0PkdVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh5ZVh1ZVh1ZVh5ZVh/aX7HK0PldVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh1ZVh/anqkPfcrM+v+FmfX7D0fr8lie73KzPb7hZn99wtD6/5Wh9fsvN+twfqg59w9H6/Jaj9fktN+vzG57qcLQ+v+VofX7Lzfr8hpv1+Q1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNV+vzsOrQUdWho6pDh1WHzi/Z5Wh9HlUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDl1WHrqoOXVUduqw6dH/JLkfr86rq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYdClYdClUdClUdClYdil+yy9H6DFUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdSlYdSlUdSlUdSlYdyl+yy9H6TFUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdKlYdKlUdKlUdKlYdql+yy9H6LFUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdalYdalUdalUdalYd6l+yy9H6bFUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdeqw69FR16Knq0GPVofdLdjlan09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0LDq0Kjq0Kjq0LDq0PySXY7W56jq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq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Z6rqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULLqUKrqUKrqULLqULHqUKnqUKnqULHqUP2SXY7WZ6nqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULHqUKnqUKnqULHqULPqUKvqUKvqULPqUP+SXY7WZ6vqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPqULPqUKvqUKvqULPq0GPVoaeqQ09Vhx6rDr1fssvR+nyqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vh4ZVh0ZVh0ZVh4ZVh+aX7HK0PkdVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh4ZVh0ZVh0ZVh4ZVh5ZVh1ZVh1ZVh5ZVh/aX7HK0PldVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh5ZVh5ZVh1ZVh1ZVh1ZVh74/jtbnt9ysz+9xsz6/x9H6/JYnu9ysz+9xsz6/x9H6/Jaj9fktN+vz/FB16BuO1ue3HK3Pb7lZn9/wVIej9fktR+vzW27W5zfcrM9vOFufqjr0/ZJan6g69A1n61NVh75fUusTVYf+vh17K2x9ourQ+aHq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aHvcbU+UXXo74Oxt8LWJ6oOfcPV+lTVofNT1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNV+vzsOrQUdWho6pDh1WHzi/Z5Wh9HlUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDl1WHrqoOXVUduqw6dH/JLkfr86rq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYdClYdClUdClUdClYdil+yy9H6DFUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdClYdClUdClUdClYdSlYdSlUdSlUdSlYdyl+yy9H6TFUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdSlYdSlUdSlUdSlYdKlYdKlUdKlUdKlYdql+yy9H6LFUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdKlYdKlUdKlUdKlYdalYdalUdalUdalYd6l+yy9H6bFUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdalYdalUdalUdalYdeqw69FR16Knq0GPVofdLdjlan09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0LDq0Kjq0Kjq0LDq0PySXY7W56jq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq0Kjq0LDq0LDq0Kjq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JasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOFasOlaoOlaoOFasO1S/Z5Wh9lqoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasONasOtaoOtaoONasO9S/Z5Wh9tqoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasOPVYdeqo69FR16LHq0Psluxytz6eqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh1aFh1aFR1aFR1aFh1aH7JLkfrc1R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH/JLkfrc1V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV1KH6qOvQtN+vzG27W5zccrc9vebLLzfr8hpv1+Q1H6/Nbjtbnt9ysz/ih6tA3HK3Pbzlan99ysz6/4akOR+vzW47W57fcrM9vuFmf33C2PlV16HuXWp+oOvS9iq1PVR36e5d6LGp9qurQ9y62PlF1KH6oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3XK3Pw6pDR1WHjqoOHVYdOr9kl6P1eVR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOHVYdOqo6dFR16LDq0GHVoaOqQ0dVhw6rDh1WHTqqOnRUdeiw6tBh1aGjqkNHVYcOqw4dVh06qjp0VHXosOrQYdWho6pDR1WHDqsOXVYduqo6dFV16LLq0P0luxytz6uqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl1KFh1KFR1KFR1KFh1KH7JLkfrM1R1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFh1KFR1KFR1KFh1KFl1KFV1KFV1KFl1KH/JLkfrM1V1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1KFl1KFV1KFV1KFl1qFh1qFR1qFR1qFh1qH7JLkfrs1R1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFh1qFR1qFR1qFh1qFl1qFV1qFV1qFl1qH/JLkfrs1V1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1qFl1qFV1qFV1qFl1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V1WHrqoOXVYdur9kl6P1eVV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOXVYduqo6dFV16LLq0GXVoauqQ1dVhy6rDl1WHbqqOnRVdeiy6tBl1aGrqkNXVYcuqw5dVh26qjp0VXXosurQZdWhq6pDV1WHLqsOBasOhaoOhaoOBasOxS/Z5Wh9hqoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOBasOhaoOhaoOBasOJasOpaoOpaoOJasO5S/Z5Wh9pqoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOJasOpaoOpaoOJasOFasOlaoOlaoOFasO1S/Z5Wh9lqoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasOFasOlaoOlaoOFasONasOtaoOtaoONasO9S/Z5Wh9tqoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasONasOtaoOtaoONasOPVYdeqo69FR16LHq0Psluxytz6eqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh1aFh1aFR1aFR1aFh1aH7JLkfrc1R1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFh1aFR1aFR1aFh1aFl1aFV1aFV1aFl1aH/JLkfrc1V1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFl1aFl1aFV1aFV1aFV1qH6qOvQtN+vzG27W5zccrc9vebLLzfr8hpv1+Q1H6/Nbjtbnt9ysz/qh6tA3HK3Pbzlan99ysz6/4akOR+vzW47W57fcrM9vuFmf33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtT4Pqw4dVR06qjp0WHXo/JJdjtbnUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WXXoqurQVdWhy6pD95fscrQ+r6oOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhYNWhUNWhUNWhYNWh+CW7HK3PUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhYNWhUNWhUNWhYNWhZNWhVNWhVNWhZNWh/CW7HK3PVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhZNWhVNWhVNWhZNWhYtWhUtWhUtWhYtWh+iW7HK3PUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhYtWhUtWhUtWhYtWhZtWhVtWhVtWhZtWh/iW7HK3PVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhZtWhVtWhVtWhZtWhx6pDT1WHnqoOPVYder9kl6P1+VR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsODasOjaoOjaoODasOzS/Z5Wh9jqoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasODasOjaoOjaoODasOLasOraoOraoOLasO7S/Z5Wh9rqoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoOraoOLasOLasOraoO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YdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhYdWhUdWhUdWhYdWhZdWhVdWhVdWhZdWh/SW7HK3PVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhZdWhZdWhVdWhVdWhVdWh91PVoW+5WZ/fcLM+v+FofX7Lk11u1uc33KzPbzhan99ytD6/5WZ9vh+qDn3D0fr8lqP1+S036/MbnupwtD6/5Wh9fsvN+vyGm/X5DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1n61NVh77lan2i6tA3nK1PVR36lqv1iapD33C2PlV16Fuu1ieqDn3D2fpU1aFvuVqfqDr0DWfrU1WHvuVqfaLq0DecrU9VHfqWq/WJqkPfcLY+VXXoW67WJ6oOfcPZ+lTVoW+5Wp+oOvQNZ+tTVYe+5Wp9ourQN5ytT1Ud+par9YmqQ99wtj5VdehbrtYnqg59w9n6VNWhb7lan6g69A1X6/Ow6tBR1aGjqkOHVYfOL9nlaH0eVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOHVYeOqg4dVR06rDp0WHXoqOrQUdWhw6pDh1WHjqoOHVUdOqw6dFh16Kjq0FHVocOqQ4dVh46qDh1VHTqsOnRYdeio6tBR1aHDqkOXVYeuqg5dVR26rDp0f8kuR+vzqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh26rDp0VXXoqurQZdWhy6pDV1WHrqoOXVYduqw6dFV16Krq0GXVocuqQ1dVh66qDl1WHbqsOnRVdeiq6tBl1aHLqkNXVYeuqg5dVh0KVh0KVR0KVR0KVh2KX7LL0foMVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh0KVh0KVR0KVR0KVh1KVh1KVR1KVR1KVh3KX7LL0fpMVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh1KVh1KVR1KVR1KVh0qVh0qVR0qVR0qVh2qX7LL0fosVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh0qVh0qVR0qVR0qVh1qVh1qVR1qVR1qVh3qX7LL0fpsVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh1qVh1qVR1qVR1qVh16rDr0VHXoqerQY9Wh90t2OVqfT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQY9Whp6pDT1WHHqsOPVYdeqo69FR16LHq0GPVoaeqQ09Vhx6rDj1WHXqqOvRUdeix6tBj1aGnqkNPVYceqw49Vh16qjr0VHXoserQsOrQqOrQqOrQsOrQ/JJdjtbnqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsOrQqOrQqOrQsOrQsurQqurQqurQsurQ/pJdjtbnqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQsurQsurQqurQqurQqurQ/FR16Ftu1uc33KzPbzhan9/yZJeb9fkNN+vzG47W57ccrc9vuVmf80PVoW84Wp/fcrQ+v+VmfX7DUx2O1ue3HK3Pb7lZn99wsz6/4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFsfarq0LdcrU9UHfqGs/WpqkPfcrU+UXXoG87Wp6oOfcvV+kTVoW84W5+qOvQtV+sTVYe+4Wx9qurQt1ytT1Qd+oaz9amqQ99ytT5Rdegbztanqg59y9X6RNWhbzhbn6o69C1X6xNVh77hbH2q6tC3XK1PVB36hrP1qapD33K1PlF16BvO1qeqDn3L1fpE1aFvOFufqjr0LVfrE1WHvuFqfR5WHTqqOnRUdeiw6tD5Jbscrc+jqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiw6tBR1aGjqkOHVYcOqw4dVR06qjp0WHXosOrQUdWho6pDh1WHDqsOHVUdOqo6dFh16LDq0FHVoaOqQ4dVhw6rDh1VHTqqOnRYdeiy6tBV1aGrqkOXVYfuL9nlaH1eVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkOXVYeuqg5dVR26rDp0WXXoqurQVdWhy6pDl1WHrqoOXVUduqw6dFl16Krq0FXVocuqQ5dVh66qDl1VHbqsOnRZdeiq6tBV1aHLqkPBqkOhqkOhqkPBqkPxS3Y5Wp+hqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPBqkOhqkOhqkPBqkPJqkOpqkOpqkPJqkP5S3Y5Wp+pqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPJqkOpqkOpqkPJqkPFqkOlqkOlqkPFqkP1S3Y5Wp+lqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOlqkOlqkPFqkPFqkOl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qupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsupQqupQqupQsupQsepQqepQqepQsepQ/ZJdjtZnqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQsepQqepQqepQsepQs+pQq+pQq+pQs+pQ/5JdjtZnq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+pQs+pQq+pQq+pQs+rQY9Whp6pDT1WHHqsOvV+yy9H6fKo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHHqsOPVUdeqo69Fh16LHq0FPVoaeqQ49Vhx6rDj1VHXqqOvRYdeix6tBT1aGnqkOPVYceqw49VR16qjr0WHXoserQU9Whp6pDj1WHhlWHRlWHRlWHhlWH5pfscrQ+R1WHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHhlWHRlWHRlWHhlWHllWHVlWHVlWHllWH9pfscrQ+V1WHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHllWHllWHVlWHVlWHFlWH9vdD1aG/5WR9/g0n6/NvuFmff8uTXU7W599wsj7/hpv1+bfcrM+/5WR9fsNNdehvuFmff8vN+vxbTtbn3/BUh5v1+bfcrM+/5WR9/g0n6/NvOFufqDr0t1ytT1Md+hvO1ieqDv0tV+vTVIf+hrP1iapDf8vV+jTVob/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G84W5+oOvS3XK1PUx36G87WJ6oO/S1X69NUh/6Gs/WJqkN/y9X6NNWhv+FsfaLq0N9ytT5NdehvOFufqDr0t1ytT1Md+hvO1ieqDv0tV+vTVIf+hrP1iapDf8vV+jTVob/hbH2i6tDfcrU+TXXobzhbn6g69LdcrU9THfobztYnqg79LVfr01SH/oaz9YmqQ3/L1fo01aG/4Wx9ourQ33K1Pk116G+4Wp+HVYfOP6tD8av43+WT/1/Hcv5ZHfrPhsf/5/D/01tJdnmpx9Lq8MfeyrDLFz2Wf1aH/rPhR72Vc9nloR5LqsOLvZVmlz/1WEYdvuqt3B+7XK3Pq9bnZevzn9Wh/265Wp9Xrc/L1udl6/Oq9RlqfQZbn8HWZ6j1+c/q0H82nK3PYOsz1PoMtT6Drc9k6zPV+ky1PpOtz39Wh/675Wp9plqfydZnsvWZan2WWp/F1mex9Vlqff6zOvSfDWfrs9j6LLU+S63PYuuz2fpstT5brc9m6/Of1aH/brlan63WZ7P12Wx9tlqfT63Px9bnY+vzqfX5z+rQfzacrc/H1udT6/Op9fnY+hy2Pketz1Hrc9j6/Gd16L9brtbnqPU5bH0OW5+j1ueq9blsfS5bn6vW5z+rQ//ZcLY+l63PVetz1fpctT7vT63Pq6pDV1WHLqsO3V+yy9H6vKo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHLqsOXVUduqo6dFl16LLq0FXVoauqQ5dVhy6rDl1VHbqqOnRZdeiy6tBV1aGrqkOXVYcuqw5dVR26qjp0WXXosurQVdWhq6pDl1WHglWHQlWHQlWHglWH4pfscrQ+Q1WHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHglWHQlWHQlWHglWHklWHUlWHUlWHklWH8pfscrQ+U1WHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHklWHUlWHUlWHklWHilWHSlWHSlWHilWH6pfscrQ+S1WHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHilWHSlWHSlWHilWHmlWHWlWHWlWHmlWH+pfscrQ+W1WHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWHmlWHWlWHWlWHmlWH/oeae8eR9jjWILylrqy81f43dj4OjuTKkIwIDq0Gh/0S/JFAGfG0Vh1qqzrUVnWotepQa9WhtqpDbVWHWqsOjVYdGqs6NFZ1aLTq0PxSu1z6+hyrOjRadWi06tBY1aGxqkOjVYdGqw6NVR0aqzo0WnVotOrQWNWhsapDo1WHRqsOjVUdGqs6NFp1aLTq0FjVobGqQ6NVh0arDo1VHRqrOjRadWi06tBY1aGxqkOjVYdGqw6NVR0aqzo0WnVotOrQWNWhsapDo1WHRqsOjVUdGqs6NFp1aLTq0FjVobGqQ6NVh0arDo1VHRqrOjRadWi06tBY1aGxqkOjVYdGqw6NVR0aqzo0WnVotOrQWNWhsapDo1WHRqsOjVUdGqs6NFp1aLTq0FjVobGqQ6NVh0arDo1VHRqrOjRadWi06tBY1aGxqkOjVYdGqw6NVR0aqzo0WnVotOrQWNWhsapDo1WHRqsOjVUdGqs6NFp1aLTq0FjVobGqQ6NVh1arDq1VHVqrOrRadWh/qV0ufX2uVR1arTq0WnVorerQWtWh1apDq1WH1qoOrVUdWq06tFp1aK3q0FrVodWqQ6tVh9aqDq1VHVqtOrRadWit6tBa1aHVqkOrVYfWqg6tVR1arTq0WnVorerQWtWh1apDq1WH1qoOrVUdWq06tFp1aK3q0FrVodWqQ6tVh9aqDq1VHVqtOrRadWit6tBa1aHVqkOrVYfWqg6tVR1arTq0WnVorerQWtWh1apDq1WH1qoOrVUdWq06tFp1aK3q0FrVodWqQ6tVh9aqDq1VHVqtOrRadWit6tBa1aHVqkOrVYfWqg6tVR1arTq0WnVorerQWtWh1apDq1WH1qoOrVUdWq06tFp1aK3q0FrVodWqQ6tVh9aqDq1VHVqtOrRadWit6tBa1aHVqkNPqw49qzr0rOrQ06pD75fa5dLX57OqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDT6sOPa069Kzq0LOqQ0+rDj2tOvSs6tCzqkNPqw49rTr0rOrQs6pDz6oOff/h0tfnt9z5+vx+3fn6/H5d+vr8lqd2ufP1+f268/X5/br09fktl74+v+XO1+f5SdWhb7j09fktl74+v+XO1+c3PK3Dpa/Pb7n09fktd74+v+HO1+c3XPv6tKpD37/J+vqUqkPfcO3r06oOff8m6+tTqg798/9O+2dF+/qUqkPnJ1WHvuHa16dVHfqWW1+fUnXoG659fVrVoW+59fUpVYe+4drXp1Ud+pZbX59Sdegbrn19WtWhb7n19SlVh77h2tenVR36lltfn1J16BuufX1a1aFvufX1KVWHvuHa16dVHfqWW1+fUnXoG659fVrVoW+59fUpVYe+4drXp1Ud+pZbX59Sdegbrn19WtWhb7n19SlVh77h2tenVR36ft36+pSqQ//8D9P+WdG+PqXq0Dfc+vq0qkPnZ1WHvuXW16dUHfqGa1+fVnXoW259fUrVoW+49vVpVYe+5dbXp1Qd+oZrX59Wdehbbn19StWhb7j29WlVh77l1tenVB36hltfn0erDh2rOnSs6tDRqkPnl9rl0tfnsapDR6sOHa06dKzq0LGqQ0erDh2tOnSs6tCxqkNHqw4drTp0rOrQsapDR6sOHa06dKzq0LGqQ0erDh2tOnSs6tCxqkNHqw4drTp0rOrQsapDR6sOHa06dKzq0LGqQ0erDh2tOnSs6tCxqkNHqw4drTp0rOrQsapDR6sOHa06dKzq0LGqQ0erDh2tOnSs6tCxqkNHqw4drTp0rOrQsapDR6sOHa06dKzq0LGqQ0erDh2tOnSs6tCxqkNH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+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7UtW25esti9ZbV+y2r78oa5ystq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLavWG1fsdq+YrV9xWr76oe6ysVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7Havma1fc1q+5rV9jWr7esf6io3q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3NavuG1fYNq+0bVts3rLZvfqirPKy2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtW1bbt6y2b1lt37Lavv2hrvKy2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estu+x2r7Havseq+17rLbv/VBX+bHavsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqrt+waRrvI3h3SVvzmkq/zNIV3lbw7pKn9zSFf5m0O6yt8c0lX+J3JmzWFdZVTb9/2wrjKq7ft+WFcZ1fZ9P6yrjGr7vh/WVUa1fd8P6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+70PWVUa1fd+HrKuMavu+D1lXGdX2fR+yrjKq7fs+ZF1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zWFdZVTb981hXWVU2/fNYV1lVNv3zUFd5cNq+w6r7Tustu+w2r7vU9Yc1FU+rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r5gtX3BavuC1fYFq+2LH+oqB6vtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7Lqvtu6y277Lavstq++4PdZUvq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r5ktX3JavuS1fYlq+3LH+oqJ6vtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7itX2FavtK1bbV6y2r36oq1ystq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7WtW29estq9ZbV+z2r7+oa5ys9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLZvWG3fsNq+YbV9w2r75oe6ysNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmW1fctq+5bV9i2r7dsf6iovq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3Lavseq+17rLbvsdq+x2r73g91lR+r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y276Havvih2r5vDukqf3NIV/mbQ7rK3xzSVf7mkK7yN4d0lb85pKv8zSFd5W8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6yqj2r5vDusqo9q+bw7rKqPavm8O6iofVtt3WG3fYbV9h9X2fZ+y5qCu8mG1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2BavtC1bbF6y2L1htX/xQVzlYbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW23dZbd9ltX2X1fZdVtt3f6irfFlt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2JavtS1bbl6y2L1ltX/5QVzlZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW21estq9YbV+x2r5itX31Q13lYrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fs9q+ZrV9zWr7mtX29Q91lZvV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fcNq+4bV9g2r7RtW2zc/1FUeVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYtq+1bVtu3rLZvWW3f/lBXeVlt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+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+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37LavmW1fctq+5bV9u0PdZWX1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX2P1fY9Vtv3WG3fY7V974e6yo/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91ht32O1fY/V9j1W2/dYbd9jtX2P1fY9Vtv3WG3fY7V9j9X2PVbb91BtX/5Qbd83h3SVvzmkq/zNIV3lbw7pKn9zSFf5m0O6yt8c0lX+5pCu8jeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zeHdZVRbd83h3WVUW3fN4d1lVFt3zcHdZUPq+07rLbvsNq+w2r7vr9Zc1BX+bDavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7DqvtO6y277DavsNq+w6r7Tustu+w2r7DavsOq+07rLbvsNq+w2r7gtX2BavtC1bbF6y2L36oqxysti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7bustu+y2r7Lavsuq+27P9RVvqy277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7Lqvtu6y277Lavstq+y6r7bustu+y2r7Lavsuq+27rLbvstq+y2r7ktX2JavtS1bbl6y2L3+oq5ysti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7StW21estq9YbV+x2r76oa5ysdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWW1fs9q+ZrV9zWr7+oe6ys1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7PavmG1fcNq+4bV9g2r7Zsf6ioPq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuW1fYtq+1bVtu3rLZvf6irvKy2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2Lavte6y277Havsdq+x6r7Xs/1FV+rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r7Havseq+17rLbvsdq+x2r7Hqvte6y277Havsdq+x6r7Xustu+x2r6Havvqh2r7vjmkq/zNIV3lbw7pKn9zSFf5m0O6yt8c0lX+5pCu8jeHdJW/OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OayrjGr7vjmsq4xq+745rKuMavu+OairfFht32G1fYfV9h1W2/d9ypqDusqH1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W23dYbd9htX2H1fYdVtt3WG3fYbV9h9X2HVbbd1ht32G1fYfV9h1W2xesti9YbV+w2r5gtX3xQ13lYLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG1fsNq+YLV9wWr7gtX2BavtC1bbF6y2L1htX7DavmC1fcFq+4LV9gWr7QtW2xesti9YbV+w2r5gtX3BavuC1fYFq+0LVtsXrLYvWG3fZbV9l9X2XVbbd1lt3/2hrvJltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W23dZbd9ltX2X1fZdVtt3WW3fZbV9l9X2XVbbd1lt32W1fZfV9l1W25esti9ZbV+y2r5ktX35Q13lZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fstq+ZLV9yWr7ktX2JavtS1bbl6y2L1ltX7LavmS1fclq+5LV9iWr7UtW25esti9ZbV+y2r5ktX3JavuS1fYlq+1LVtuXrLYvWW1fsdq+YrV9xWr7itX21Q91lYvV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fcVq+4rV9hWr7StW21estq9YbV+x2r5itX3FavuK1fYVq+0rVttXrLavWG1fsdq+YrV9xWr7itX2FavtK1bbV6y2r1htX7HavmK1fc1q+5rV9jWr7WtW29c/1FVuVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fY1q+1rVtvXrLavWW1fs9q+ZrV9zWr7mtX2Navta1bb16y2r1ltX7Pavma1fc1q+5rV9jWr7WtW29estq9ZbV+z2r5mtX3Navua1fYNq+0bVts3rLZvWG3f/FBXeVht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbN6y2b1ht37DavmG1fcNq+4bV9g2r7RtW2zestm9Ybd+w2r5htX3DavuG1fYNq+0bVts3rLZvWG3fsNq+YbV9w2r7htX2DavtG1bbt6y2b1lt37LavmW1fftDXeVltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2LavtW1bbt6y2b1lt37LavmW1fctq+5bV9i2r7VtW27estm9Zbd+y2r5ltX3LavuW1fYtq+1bVtu3rLZvWW3fstq+ZbV9y2r7ltX2/R9zd24gQQhDUTClQaAr/8S2N4tyZX3reQVj2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbt5btW8v2rWX71rJ9+6OqvJbtW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31K2r36U7fvmSFX+5khV/uZIVf7mSFX+5khV/uZIVf7mSFX+5khV/uZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6gqH8v2Hcv2Hcv2Hcv2fVdrDlXlY9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+sGxfWLYvLNsXlu2LH1XlsGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ917J917J917J917J990dV+Vq271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271m271m271m271m27/2oKj/L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9qVl+9KyfWnZvrRsX/6oKqdl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7SvL9pVl+8qyfWXZvvpRVS7L9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s29eW7WvL9rVl+9qyff2jqtyW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btm8s2zeW7RvL9o1l++ZHVXks2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9atm8t27eW7VvL9u2PqvJatm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1L2b7+UbbvmyNV+ZsjVfmbI1X5myNV+ZsjVfmbI1X5myNV+ZsjVfmbY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982hqnws23cs23cs23cs2/ddrTlUlY9l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+8KyfWHZvrBsX1i2L35UlcOyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9l3L9l3L9l3L9l3L9t0fVeVr2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5r2b5n2b5n2b5n2b5n2b73o6r8LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNv3LNuXlu1Ly/alZfvSsn35o6qclu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWravLNtXlu0ry/aVZfvqR1W5LNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfW7avLdvXlu1ry/b1j6pyW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+sWzfWLZvLNs3lu2bH1XlsWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9a9m+tWzfWrZvLdu3P6rKa9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2LWX75kfZvm+OVOVvjlTlb45U5W+OVOVvjlTlb45U5W+OVOVvjlTlb45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83h6rysWzfsWzfsWzfsWzfd7XmUFU+lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu0Ly/aFZfvCsn1h2b74UVUOy/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNt3Ldt3Ldt3Ldt3Ldt3f1SVr2X7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7nmX7nmX7nmX7nmX73o+q8rNs37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37NsX1q2Ly3bl5btS8v25Y+qclq2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrJsX1m2ryzbV5btqx9V5bJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfW3ZvrZsX1u2ry3b1z+qym3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+8ayfWPZvrFs31i2b35UlceyfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9q1l+9ayfWvZvrVs3/6oKq9l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eU7dsfZfu+OVKVvzlSlb85UpW/OVKVvzlSlb85UpW/OVKVvzlSlb85VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyqyseyfceyfceyfceyfd/VmkNV+Vi271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i2LyzbF5btC8v2hWX74kdVOSzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBs37Vs37Vs37Vs37Vs3/1RVb6W7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7XuW7XuW7XuW7XuW7Xs/qsrPsn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn1p2b60bF9ati8t25c/qspp2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvKsn1l2b6ybF9Ztq9+VJXLsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/a1Zfvasn1t2b62bF//qCq3Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu0by/aNZfvGsn1j2b75UVUey/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNu3lu1by/atZfvWsn37o6q8lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfSrbv/H6S7fufA1X5fw5U5f85UJX/50BV/p8DVfl/DlTl/zlQlf/nQFX+n2NVWbJ9/3OsKku273+OVWXJ9v3Psaos2b7/OVaVJdv3P8eqsmT7/udYVZZs3/8cq8qS7fufY1VZsn3/c6wqS7bvf45VZcn2/c+xqizZvv85VpUl2/c/x6qyZPv+51hVlmzf/xyrypLt+59jVVmyff9zrCpLtu9/jlVlyfb9z7GqLNm+/zlWlSXb9z/HqrJk+/7nWFWWbN//HKvKku37n2NVWbJ9/3OsKku273+OVWXJ9v3Psaos2b7/OVaVJdv3P8eqsmT7/udYVZZs3/8cq8qS7fufY1VZsn3/c6wqS7bvf45VZcn2/c+xqizZvv85VpUl2/c/x6qyZPv+51hVlmzf/xyrypLt+59jVVmyff9zrCpLtu9/jlVlyfb9z7GqLNm+/zlWlSXb9z+HqvKxbN+xbN+xbN+xbN93teZQVT6W7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7TuW7QvL9oVl+8KyfWHZvvhRVQ7L9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s23ct23ct23ct23ct23d/VJWvZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfueZfueZfueZfueZfvej6rys2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2xfWrYvLduXlu1Ly/blj6pyWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+smxfWbavLNtXlu2rH1XlsmxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9bdm+tmxfW7avLdvXP6rKbdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX7xrJ9Y9m+sWzfWLZvflSVx7J9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2rWX71rJ9a9m+tWzf/qgqr2X71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5TtOz/K9n1zpCp/c6Qqf3OkKn9zpCp/c6Qqf3OkKn9zpCp/c6Qqf3OsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fUerypTt+45WlSnb9x2tKlO27ztaVaZs33e0qkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9v1/H2/NsapM2b7/n/KsOVaVKdv3/ymANceqMmX7/t8/tOZYVaZs3/9TD9Ycq8qW7TuW7TuW7TuW7TuW7fuu1hyqyseyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfWHZvrBsX1i2LyzbFz+qymHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+65l+65l+65l+65l++6PqvK1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+zbN+zbN+zbN+zbN/7UVV+lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu1Ly/alZfvSsn1p2b78UVVOy/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLdtXlu0ry/aVZfvKsn31o6pclu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLdvXlu1ry/a1Zfv6R1W5LdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmzfWLZvLNs3lu0by/bNj6ryWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+tWzfWrZvLdu3lu3bH1XltWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX7lrJ98aNs3zdHqvI3R6ryN0eq8jdHqvI3R6ryN0eq8jdHqvI3R6ryN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bQ1X5WLbvWLbvWLbvWLbvu1pzqCofy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/aFZfvCsn1h2b6wbF/8qCqHZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu27lu27lu27lu27lu27P6rK17J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J9z7J9z7J9z7J9z7J970dV+Vm271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m2Ly3bl5btS8v2pWX78kdVOS3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1m2ryzbV5btK8v21Y+qclm2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrZsX1u2ry3b15bt6x9V5bZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfWPZvrFs31i2byzbNz+qymPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+9ayfWvZvrVs31q2b39UldeyfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvK9t0fZfu+OVKVvzlSlb85UpW/OVKVvzlSlb85UpW/OVKVvzlSlb85VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyqyseyfceyfceyfceyfd/VmkNV+Vi271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i271i2LyzbF5btC8v2hWX74kdVOSzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBs37Vs37Vs37Vs37Vs3/1RVb6W7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7XuW7XuW7XuW7XuW7Xs/qsrPsn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn1p2b60bF9ati8t25c/qspp2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvKsn1l2b6ybF9Ztq9+VJXLsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/a1Zfvasn1t2b62bF//qCq3Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu0by/aNZfvGsn1j2b75UVUey/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNu3lu1by/atZfvWsn37o6q8lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfUrbv/Sjb982RqvzNkar8zZGq/M2RqvzNkar8zZGq/M2RqvzNkar8zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmUFU+lu07lu07lu07lu37rtYcqsrHsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn3Hsn1h2b6wbF9Yti8s2xc/qsph2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfuuZfuuZfuuZfuuZfvuj6rytWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzftWzfs2zfs2zfs2zfs2zf+1FVfpbte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5bte5btS8v2pWX70rJ9adm+/FFVTsv2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bV5btK8v2lWX7yrJ99aOqXJbtK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ry3b15bta8v2tWX7+kdVuS3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZs31i2byzbN5btG8v2zY+q8li2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrVs31q2by3bt5bt2x9V5bVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+5ayffmjbN83R6ryN0eq8jdHqvI3R6ryN0eq8jdHqvI3R6ryN0eq8jfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm0NV+Vi271i271i271i277tac6gqH8v2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2hWX7wrJ9Ydm+sGxf/Kgqh2X7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btu5btu5btu5btu5btuz+qyteyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfdeyfc+yfc+yfc+yfc+yfe9HVflZtu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Ztu9Zti8t25eW7UvL9qVl+/JHVTkt25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9Ztq8s21eW7SvL9tWPqnJZtq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b62bF9btq8t29eW7esfVeW2bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1j2b6xbN9Ytm8s2zc/qspj2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvWsn1r2b61bN9atm9/VJXXsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1byvbVj7J93xypyt8cqcrfHKnK3xypyt8cqcrfHKnK3xypyt8cqcrfHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm8OVeVj2b5j2b5j2b5j2b7vas2hqnws23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs23cs2xeW7QvL9oVl+8KyffGjqhyW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Ytu9atu9atu9atu9atu/+qCpfy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Y9y/Y9y/Y9y/Y9y/a9H1XlZ9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+tGxfWrYvLduXlu3LH1XltGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9Zdm+smxfWbavLNtXP6rKZdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX72rJ9bdm+tmxfW7avf1SV27J9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2jWX7xrJ9Y9m+sWzf/Kgqj2X7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btW8v2rWX71rJ9a9m+/VFVXsv2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2bynb1z/K9n1zpCp/c6Qqf3OkKn9zpCp/c6Qqf3OkKn9zpCp/c6Qqf3OsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVaVKdv3zbGqTNm+b45VZcr2fXOsKlO275tjVZmyfd8cq8qU7fvmWFWmbN83x6oyZfu+OVSVj2X7jmX7jmX7jmX7vqs1h6rysWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWzfsWxfWLYvLNsXlu0Ly/bFj6pyWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+a9m+a9m+a9m+a9m++6OqfC3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3b9yzb9yzb9yzb9yzb935UlZ9l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+9KyfWnZvrRsX1q2L39UldOyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9pVl+8qyfWXZvrJsX/2oKpdl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7WvL9rVl+9qyfW3Zvv5RVW7L9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t2zeW7RvL9o1l+8ayffOjqjyW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8t27eW7VvL9q1l+/ZHVXkt27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b6lbN/8KNv3zZGq/M2RqvzNkar8zZGq/M2RqvzNkar8zZGq/M2RqvzNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZYVaZs3zfHqjJl+745VpUp2/fNsapM2b5vjlVlyvZ9c6wqU7bvm2NVmbJ93xyrypTt++ZQVT6W7TuW7TuW7TuW7fuu1hyqyseyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfWHZvrBsX1i2LyzbFz+qymHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+65l+65l+65l+65l++6PqvK1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+1bN+zbN+zbN+zbN+zbN/7UVV+lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu17lu1Ly/alZfvSsn1p2b78UVVOy/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLdtXlu0ry/aVZfvKsn31o6pclu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLdvXlu1ry/a1Zfv6R1W5LdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmzfWLZvLNs3lu0by/bNj6ryWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+tWzfWrZvLdu3lu3bH1XltWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX7lrJ9+6Ns3zdHqvI3R6ryN0eq8jdHqvI3R6ryN0eq8jdHqvI3R6ryN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bY1WZsn3fHKvKlO375lhVpmzfN8eqMmX7vjlWlSnb982xqkzZvm+OVWXK9n1zrCpTtu+bQ1X5WLbvWLbvWLbvWLbvu1pzqCofy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/aFZfvCsn1h2b6wbF/8qCqHZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu27lu27lu27lu27lu27P6rK17J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J917J9z7J9z7J9z7J9z7J970dV+Vm271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m271m2Ly3bl5btS8v2pWX78kdVOS3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1m2ryzbV5btK8v21Y+qclm2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrZsX1u2ry3b15bt6x9V5bZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfWPZvrFs31i2byzbNz+qymPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+9ayfWvZvrVs31q2b39UldeyfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvJ9sXvJ9m+/zlQlf/nQFX+nwNV+X8OVOX/OVCV/+dAVf6fA1X5fw5U5f85VpUl2/c/x6qyZPv+51hVlmzf/xyrypLt+59jVVmyff9zrCpLtu9/jlVlyfb9z7GqLNm+/zlWlSXb9z/HqrJk+/7nWFWWbN//HKvKku37n2NVWbJ9/3OsKku273+OVWXJ9v3Psaos2b7/OVaVJdv3P8eqsmT7/udYVZZs3/8cq8qS7fufY1VZsn3/c6wqS7bvf45VZcn2/c+xqizZvv85VpUl2/c/x6qyZPv+51hVlmzf/xyrypLt+59jVVmyff9zrCpLtu9/jlVlyfb9z7GqLNm+/zlWlSXb9z/HqrJk+/7nWFWWbN//HKvKku37n2NVWbJ9/3OsKku273+OVWXJ9v3Psaos2b7/OVaVJdv3P8eqsmT7/udYVZZs3/8cq8qS7fufY1VZsn3/c6gqH8v2Hcv2Hcv2Hcv2fVdrDlXlY9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+sGxfWLYvLNsXlu2LH1XlsGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ917J917J917J917J990dV+Vq271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271m271m271m271m27/2oKj/L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9qVl+9KyfWnZvrRsX/6oKqdl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7SvL9pVl+8qyfWXZvvpRVS7L9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s29eW7WvL9rVl+9qyff2jqtyW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btm8s2zeW7RvL9o1l++ZHVXks2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9atm8t27eW7VvL9u2PqvJatm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1L2b7zo2zfN0eq8jdHqvI3R6ryN0eq8jdHqvI3R6ryN0eq8jdHqvI3x6oyZfu+OVaVKdv3zbGq/Me8nRtGEMNAEEzpQHxk/olplUW5Y43VXlG277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv3jVaVKdv3jVaVKdv3jVaVKdv3jVaVKdv3jVaVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33aGqHJbtC8v2hWX7wrJ932rdoaoclu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGzfsWzfsWzfsWzfsWzf+VFVPpbtO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btO5btS8v2pWX70rJ9adm+/FFVTsv2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bV5btK8v2lWX7yrJ99aOqXJbtK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ry3b15bta8v2tWX7+kdVuS3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZs31i2byzbN5btG8v2zY+q8li2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrVs31q2by3bt5bt2x9V5bVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfdeyfdeyfdeyfdeyffdHVflatu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9atu9Ztu9Ztu9Ztu9Ztu/9qCo/y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9y/Y9yvadH2X7vjtSlb87UpW/O1KVvztSlb87UpW/O1KVvztSlb87UpW/O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dqsph2b6wbF9Yti8s2/et1h2qymHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9h3L9h3L9h3L9h3L9p0fVeVj2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b5j2b60bF9ati8t25eW7csfVeW0bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1l2b6ybF9Ztq8s21c/qspl2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvasn1t2b62bF9btq9/VJXbsn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/aNZfvGsn1j2b6xbN/8qCqPZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu1by/atZfvWsn1r2b79UVVey/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdt3Ldt3Ldt3Ldt3Ldt3f1SVr2X7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7rmX7nmX7nmX7nmX7nmX73o+q8rNs37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns37Ns36NsX/4o2/fdkar83ZGq/N2Rqvzdkar83ZGq/N2Rqvzdkar83ZGq/N2xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lBVDsv2hWX7wrJ9Ydm+b7XuUFUOy/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLbvWLbvWLbvWLbvWLbv/KgqH8v2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2Hcv2nbWqbNm+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+Y9m+tGxfWrYvLduXlu3LH1XltGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9Zdm+smxfWbavLNtXP6rKZdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX72rJ9bdm+tmxfW7avf1SV27J9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2jWX7xrJ9Y9m+sWzf/Kgqj2X7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btW8v2rWX71rJ9a9m+/VFVXsv2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bdy3bdy3bdy3bdy3bd39Ula9l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+65l+55l+55l+55l+55l+96PqvKzbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+zbN+jbF/9KNv33ZGq/N2Rqvzdkar83ZGq/N2Rqvzdkar83ZGq/N2RqvzdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5QVQ7L9oVl+8KyfWHZvm+17lBVDsv2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i271i271i271i271i27/yoKh/L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9h3L9qVl+9KyfWnZvrRsX/6oKqdl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7SvL9pVl+8qyfWXZvvpRVS7L9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s29eW7WvL9rVl+9qyff2jqtyW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btm8s2zeW7RvL9o1l++ZHVXks2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9atm8t27eW7VvL9u2PqvJatm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b5r2b5r2b5r2b5r2b77o6p8Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldt3Ldv3LNv3LNv3LNv3LNv3flSVn2X7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7nmX7HmX7+kfZvu+OVOXvjlTl745U5e+OVOXvjlTl745U5e+OVOXvjlTl745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93h6pyWLYvLNsXlu0Ly/Z9q3WHqnJYti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn3Hsn3Hsn3Hsn3Hsn3nR1X5WLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLYvLduXlu1Ly/alZfvyR1U5LduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWbavLNtXlu0ry/bVj6pyWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+tmxfW7avLdvXlu3rH1XltmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9Y9m+sWzfWLZvLNs3P6rKY9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX71rJ9a9m+tWzfWrZvf1SV17J9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2Xcv2Xcv2Xcv2Xcv23R9V5WvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmfZvmfZvmfZvmfZvvejqvws2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/co2zc/yvZ9d6Qqf3ekKn93pCp/d6Qqf3ekKn93pCp/d6Qqf3ekKn93rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtUlcOyfWHZvrBsX1i271utO1SVw7J9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btO5btO5btO5btO5btOz+qyseyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfceyfWnZvrRsX1q2Ly3blz+qymnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+8qyfWXZvrJsX1m2r35UlcuyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9rVl+9qyfW3ZvrZsX/+oKrdl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7RvL9o1l+8ayfWPZvvlRVR7L9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s27eW7VvL9q1l+9ayffujqryW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atu9atu9atu9atu9atu/+qCpfy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Zdy/Y9y/Y9y/Y9y/Y9y/a9H1XlZ9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+Z9m+R9m+/VG277sjVfm7I1X5uyNV+bsjVfm7I1X5uyNV+bsjVfm7I1X5u2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdoaoclu0Ly/aFZfvCsn3fat2hqhyW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbN+xbN+xbN+xbN+xbN/5UVU+lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu1Ly/alZfvSsn1p2b78UVVOy/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLdtXlu0ry/aVZfvKsn31o6pclu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLdvXlu1ry/a1Zfv6R1W5LdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmzfWLZvLNs3lu0by/bNj6ryWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+tWzfWrZvLdu3lu3bH1XltWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ917J917J917J917J990dV+Vq271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271m271m271m271m27/2oKj/L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3K9t0fZfu+O1KVvztSlb87UpW/O1KVvztSlb87UpW/O1KVvztSlb87VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2qymHZvrBsX1i2Lyzb963WHarKYdm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2Hcv2Hcv2Hcv2Hcv2nR9V5WPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvrRsX1q2Ly3bl5btyx9V5bRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWXZvrJsX1m2ryzbVz+qymXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+9qyfW3ZvrZsX1u2r39UlduyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9o1l+8ayfWPZvrFs3/yoKo9l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7VvL9q1l+9ayfWvZvv1RVV7L9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t23ct23ct23ct23ct23d/VJWvZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfueZfueZfueZfueZfvej6rys2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfo2zf+1G277sjVfm7I1X5uyNV+bsjVfm7I1X5uyNV+bsjVfm7I1X5u2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdoaoclu0Ly/aFZfvCsn3fat2hqhyW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbN+xbN+xbN+xbN+xbN/5UVU+lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu07lu1Ly/alZfvSsn1p2b78UVVOy/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLdtXlu0ry/aVZfvKsn31o6pclu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLdvXlu1ry/a1Zfv6R1W5LdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmzfWLZvLNs3lu0by/bNj6ryWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+tWzfWrZvLdu3lu3bH1XltWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ917J917J917J917J990dV+Vq271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271q271m271m271m271m27/2oKj/L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3L9j3J9uXvJ9m+/ztQlf/vQFX+vwNV+f8OVOX/O1CV/+9AVf6/A1X5/w5U5f87VpUl2/d/x6qyZPv+71hVlmzf/x2rypLt+79jVVmyff93rCpLtu//jlVlyfb937GqLNm+/ztWlSXb93/HqrJk+/7vWFWWbN//HavKku37v2NVWbJ9/3esKku27/+OVWXJ9v3fsaos2b7/O1aVJdv3f8eqsmT7/u9YVZZs3/8dq8qS7fu/Y1VZsn3/d6wqS7bv/45VZcn2/d+xqizZvv87VpUl2/d/x6qyZPv+71hVlmzf/x2rypLt+79jVVmyff93rCpLtu//jlVlyfb937GqLNm+/ztWlSXb93/HqrJk+/7vWFWWbN//HavKku37v2NVWbJ9/3esKku27/+OVWXJ9v3fsaos2b7/O1aVJdv3f8eqsmT7/u9YVZZs3/8dq8qS7fu/Y1VZsn3/d6gqh2X7wrJ9Ydm+sGzft1p3qCqHZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNt3LNt3LNt3LNt3LNt3flSVj2X7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX7jmX70rJ9adm+tGxfWrYvf1SV07J9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2lWX7yrJ9Zdm+smxf/agql2X7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5bta8v2tWX72rJ9bdm+/lFVbsv2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3bN5btG8v2jWX7xrJ986OqPJbtG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2by3bt5btW8v2rWX79kdVeS3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs37Vs37Vs37Vs37Vs3/1RVb6W7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7buW7XuW7XuW7XuW7XuW7Xs/qsrPsn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn3Psn2Psn3xo2zfd0eq8ndHqvJ3R6ryd0eq8ndHqvJ3R6ryd0eq8ndHqvJ3x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN83WlWmbN83WlWmbN83WlWmbN83WlWmbN83WlWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93h6pyWLYvLNsXlu0Ly/Z9q3WHqnJYti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn3Hsn3Hsn3Hsn3Hsn3nR1X5WLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLbvWLYvLduXlu1Ly/alZfvyR1U5LduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWbavLNtXlu0ry/bVj6pyWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+tmxfW7avLdvXlu3rH1XltmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9Y9m+sWzfWLZvLNs3P6rKY9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX71rJ9a9m+tWzfWrZvf1SV17J9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2Xcv2Xcv2Xcv2Xcv23R9V5WvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmvZvmfZvmfZvmfZvmfZvvejqvws2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/cs2/co23d+lO377khV/u5IVf7uSFX+7khV/u5IVf7uSFX+7khV/u5IVf7uWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXeoKodl+8KyfWHZvrBs37dad6gqh2X7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2Lyzbdyzbdyzbdyzbdyzbd35UlY9l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+45l+9KyfWnZvrRsX1q2L39UldOyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9pVl+8qyfWXZvrJsX/2oKpdl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7WvL9rVl+9qyfW3Zvv5RVW7L9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t2zeW7RvL9o1l+8ayffOjqjyW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8t27eW7VvL9q1l+/ZHVXkt27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN+1bN+1bN+1bN+1bN/9UVW+lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu27lu17lu17lu17lu17lu17P6rKz7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9z7J9j7J9+aNs33dHqvJ3R6ryd0eq8ndHqvJ3R6ryd0eq8ndHqvJ3R6ryd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Q1U5LNsXlu0Ly/aFZfu+1bpDVTks2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b5j2b5j2b5j2b5j2b7zo6p8LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNt3LNuXlu1Ly/alZfvSsn35o6qclu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWravLNtXlu0ry/aVZfvqR1W5LNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfW7avLdvXlu1ry/b1j6pyW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+sWzfWLZvLNs3lu2bH1XlsWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9a9m+tWzfWrZvLdu3P6rKa9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX7rmX7rmX7rmX7rmX77o+q8rVs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Vs37Ns37Ns37Ns37Ns3/tRVX6W7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuW7XuU7asfZfu+O1KVvztSlb87UpW/O1KVvztSlb87UpW/O1KVvztSlb87VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2rypTt++5YVaZs33fHqjJl+747VpUp2/fdsapM2b7vjlVlyvZ9d6wqU7bvu2NVmbJ93x2qymHZvrBsX1i2Lyzb963WHarKYdm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2Hcv2Hcv2Hcv2Hcv2nR9V5WPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvmPZvrRsX1q2Ly3bl5btyx9V5bRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWXZvrJsX1m2ryzbVz+qymXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+9qyfW3ZvrZsX1u2r39UlduyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9o1l+8ayfWPZvrFs3/yoKo9l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7VvL9q1l+9ayfWvZvv1RVV7L9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t23ct23ct23ct23ct23d/VJWvZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfuuZfueZfueZfueZfueZfvej6rys2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfs2zfo2xf/yjb992Rqvzdkar83ZGq/N2Rqvzdkar83ZGq/N2Rqvzdkar83bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuWFWmbN93x6oyZfu+O1aVKdv33bGqTNm+745VZcr2fXesKlO277tjVZmyfd8dq8qU7fvuUFUOy/aFZfvCsn1h2b5vte5QVQ7L9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Yti8s2xeW7QvL9oVl+8KyfWHZvrBsX1i2LyzbF5btC8v2hWX7wrJ9Ydm+sGxfWLYvLNsXlu0Ly/aFZfvCsn1h2b6wbF9Ytu9Ytu9Ytu9Ytu9Ytu/8qCofy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/Ydy/alZfvSsn1p2b60bF/+qCqnZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu1Ly/alZfvSsn1p2b60bF9ati8t25eW7UvL9qVl+9KyfWnZvrRsX1q2Ly3bl5btS8v2pWX70rJ9adm+tGxfWrYvLduXlu0ry/aVZfvKsn1l2b76UVUuy/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNtXlu0ry/aVZfvKsn1l2b6ybF9Ztq8s21eW7SvL9pVl+8qyfWXZvrJsX1m2ryzbV5btK8v2lWX7yrJ9Zdm+smxfWbavLNvXlu1ry/a1Zfvasn39o6rclu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7avLdvXlu1ry/a1Zfvasn1t2b62bF9btq8t29eW7WvL9rVl+9qyfW3ZvrZsX1u2ry3b15bta8v2tWX72rJ9bdm+tmxfW7ZvLNs3lu0by/aNZfvmR1V5LNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWLZvLNs3lu0by/aNZfvGsn1j2b6xbN9Ytm8s2zeW7RvL9o1l+8ayfWPZvrFs31i2byzbN5btG8v2jWX7xrJ9Y9m+sWzfWrZvLdu3lu1by/btj6ryWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+tWzfWrZvLdu3lu1by/atZfvWsn1r2b61bN9atm8t27eW7VvL9q1l+9ayfWvZvrVs31q2by3bt5btW8v2rWX71rJ9a9m+a9m+a9m+a9m+a9m++6OqfC3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3bdy3b9yzb9yzb9yzb9yzb935UlZ9l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+55l+x5l++ZH2b7vjlTl745U5e+OVOXvjlTl745U5e+OVOXvjlTl745U5e+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZvu+OVWXK9n13rCpTtu+7Y1WZsn3fHavKlO377lhVpmzfd8eqMmX7vjtWlSnb992xqkzZ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","file_map":{"3":{"source":"use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n}\n","path":"std/array/mod.nr"},"18":{"source":"pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n","path":"std/field/mod.nr"},"61":{"source":"use greco::constants::{L, N};\nuse greco::crypto::pk_encryption::BfvPkEncryptionCircuit;\nuse greco::math::polynomial::Polynomial;\n\nfn main(\n pk0is: [Polynomial; L],\n pk1is: [Polynomial; L],\n ct0is: [Polynomial; L],\n ct1is: [Polynomial; L],\n u: Polynomial,\n e0: Polynomial,\n e1: Polynomial,\n k1: Polynomial,\n r1is: [Polynomial<(2 * N) - 1>; L],\n r2is: [Polynomial; L],\n p1is: [Polynomial<(2 * N) - 1>; L],\n p2is: [Polynomial; L],\n) {\n let circuit = BfvPkEncryptionCircuit::new(\n pk0is,\n pk1is,\n ct0is,\n ct1is,\n u,\n e0,\n e1,\n k1,\n r1is,\n r2is,\n p1is,\n p2is,\n );\n circuit.correct_encryption();\n}\n","path":"/Users/giacomo/Documents/projects/work/enclave/examples/CRISP/circuits/src/main.nr"},"64":{"source":"use crate::constants::{\n E_BOUND, K0IS, K1_LOW_BOUND, K1_UP_BOUND, L, N, P1_BOUNDS, P2_BOUNDS, PK_BOUND, Q_MOD_T, QIS,\n R1_LOW_BOUNDS, R1_UP_BOUNDS, R2_BOUNDS, SIZE, TAG, U_BOUND,\n};\nuse crate::math::polynomial::Polynomial;\nuse safe::safe::SafeSponge;\n\n/// BfvPkEncryption circuit structure\npub struct BfvPkEncryptionCircuit {\n pk0is: [Polynomial; L],\n pk1is: [Polynomial; L],\n ct0is: [Polynomial; L],\n ct1is: [Polynomial; L],\n u: Polynomial,\n e0: Polynomial,\n e1: Polynomial,\n k1: Polynomial,\n r1is: [Polynomial<(2 * N) - 1>; L],\n r2is: [Polynomial; L],\n p1is: [Polynomial<(2 * N) - 1>; L],\n p2is: [Polynomial; L],\n}\n\nimpl BfvPkEncryptionCircuit {\n /// Creates a new circuit\n pub fn new(\n pk0is: [Polynomial; L],\n pk1is: [Polynomial; L],\n ct0is: [Polynomial; L],\n ct1is: [Polynomial; L],\n u: Polynomial,\n e0: Polynomial,\n e1: Polynomial,\n k1: Polynomial,\n r1is: [Polynomial<2 * N - 1>; L],\n r2is: [Polynomial; L],\n p1is: [Polynomial<2 * N - 1>; L],\n p2is: [Polynomial; L],\n ) -> BfvPkEncryptionCircuit {\n BfvPkEncryptionCircuit { pk0is, pk1is, ct0is, ct1is, u, e0, e1, k1, r1is, r2is, p1is, p2is }\n }\n\n /// Assigns all the witness polynomial coefficients to an array\n fn payload(self) -> [Field; SIZE] {\n let mut inputs = [0; SIZE];\n let mut offset = 0;\n\n let (inputs, offset) = flatten(inputs, self.pk0is, offset);\n let (inputs, offset) = flatten(inputs, self.pk1is, offset);\n let (inputs, offset) = flatten(inputs, self.ct0is, offset);\n let (inputs, offset) = flatten(inputs, self.ct1is, offset);\n let (inputs, offset) = flatten(inputs, [self.e0], offset);\n let (inputs, offset) = flatten(inputs, [self.e1], offset);\n let (inputs, offset) = flatten(inputs, [self.u], offset);\n let (inputs, offset) = flatten(inputs, [self.k1], offset);\n let (inputs, offset) = flatten(inputs, self.r1is, offset);\n let (inputs, offset) = flatten(inputs, self.r2is, offset);\n let (inputs, offset) = flatten(inputs, self.p1is, offset);\n let (inputs, _) = flatten(inputs, self.p2is, offset);\n\n inputs\n }\n\n pub fn correct_encryption(self) {\n // Binary check\n\n assert(0 == self.k1.coefficients[N - 1] * (Q_MOD_T - self.k1.coefficients[N - 1]));\n\n // Bound check\n self.u.range_check_1bound(U_BOUND);\n self.e0.range_check_1bound(E_BOUND);\n self.e1.range_check_1bound(E_BOUND);\n self.k1.range_check_2bounds(K1_UP_BOUND, K1_LOW_BOUND);\n\n for i in 0..L {\n self.pk0is[i].range_check_1bound(PK_BOUND[i]);\n self.pk1is[i].range_check_1bound(PK_BOUND[i]);\n self.r1is[i].range_check_2bounds(R1_UP_BOUNDS[i], R1_LOW_BOUNDS[i]);\n self.r2is[i].range_check_1bound(R2_BOUNDS[i]);\n self.p1is[i].range_check_1bound(P1_BOUNDS[i]);\n self.p2is[i].range_check_1bound(P2_BOUNDS[i]);\n }\n\n // We assign all the coefficients to an array to generate challenge values\n let inputs = self.payload();\n let mut safe = SafeSponge::<_, _, TAG>::start([SIZE, 2 * L]);\n safe = safe.absorb(inputs);\n let gammas = safe.squeeze();\n\n // CORRECT ENCRYPTION CONSTRAINT\n // For each `i` Prove that LHS(gamma) = RHS(gamma)\n // pk0_u = pk0is(gamma) * u(gamma) + e0(gamma)\n // LHS = ct0i(gamma)\n // RHS = pk0_u + k1(gamma) * k0i + r1i(gamma) * qi + r2i(gamma) * cyclo(gamma)\n for i in 0..L {\n let gamma = gammas.get(i);\n\n // cyclo poly is equal to x^N + 1\n let cyclo_at_gamma = gamma.pow_32(N as Field) + 1;\n\n // Gamma evaluation\n let u_at_gamma = self.u.eval(gamma);\n let e0_at_gamma = self.e0.eval(gamma);\n let k1_at_gamma = self.k1.eval(gamma);\n let pk0is_at_gamma = self.pk0is.map(|pk| pk.eval(gamma));\n let r1i_at_gamma = self.r1is.map(|r1| r1.eval(gamma));\n let r2i_at_gamma = self.r2is.map(|r2| r2.eval(gamma));\n\n // First step\n let pk0_u = (pk0is_at_gamma[i] * u_at_gamma) + e0_at_gamma;\n\n // rhs = pk0_u + k1(gamma) * k0i\n let rhs = pk0_u + (k1_at_gamma * K0IS[i]);\n\n // rhs = rhs + r1i(gamma) * qi\n let rhs = rhs + (r1i_at_gamma[i] * QIS[i]);\n\n // rhs = rhs + r2i(gamma) * cyclo(gamma)\n let rhs = rhs + r2i_at_gamma[i] * cyclo_at_gamma;\n let lhs = self.ct0is[i].eval(gamma);\n\n // LHS(gamma) = RHS(gamma)\n assert_eq(lhs, rhs);\n\n // Gamma evaluation\n let gamma = gammas.get(i + L);\n\n // cyclo poly is equal to x^N + 1\n let cyclo_at_gamma = gamma.pow_32(N as Field) + 1;\n\n let u_at_gamma = self.u.eval(gamma);\n let e1_at_gamma = self.e1.eval(gamma);\n let pk1is_at_gamma = self.pk1is.map(|pk| pk.eval(gamma));\n let p1is_at_gamma = self.p1is.map(|p1| p1.eval(gamma));\n let p2is_at_gamma = self.p2is.map(|p2| p2.eval(gamma));\n\n // Second step\n let pk1_u = (pk1is_at_gamma[i] * u_at_gamma) + e1_at_gamma;\n\n //rhs = pk1_u + p2i * cyclo(gamma)\n let rhs = pk1_u + p2is_at_gamma[i] * cyclo_at_gamma;\n\n //rhs = rhs + p1s * qi\n let rhs = rhs + (p1is_at_gamma[i] * QIS[i]);\n let lhs = self.ct1is[i].eval(gamma);\n\n // LHS(gamma) = RHS(gamma)\n assert_eq(lhs, rhs);\n }\n safe.finish();\n }\n}\n\n/// Flattens an array of polynomials into a 1D array of Field elements.\n///\n/// # Generic Parameters\n/// * `A` - The size of each polynomial in the array\n/// * `L` - The number of polynomials in the array\n///\n/// # Arguments\n/// * `inputs` - The target array to store flattened coefficients\n/// * `poly` - Array of polynomials to flatten\n/// * `offset` - Starting position in the inputs array\n///\n/// # Returns\n/// A tuple containing:\n/// * The updated inputs array with flattened coefficients\n/// * The new offset position\n/// ```\nfn flatten(\n mut inputs: [Field; SIZE],\n poly: [Polynomial; L],\n mut offset: u32,\n) -> ([Field; SIZE], u32) {\n for j in 0..L {\n for i in 0..A {\n inputs[i + offset] = poly[j].coefficients[i];\n }\n offset += A;\n }\n\n (inputs, offset)\n}\n","path":"/Users/giacomo/nargo/github.com/gnosisguild/greco/v0.1.0/circuits/src/crypto/pk_encryption.nr"},"67":{"source":"/// Polynomial structure\npub struct Polynomial {\n // Coefficients of the polynomial (Biggest degree at the first index)\n pub coefficients: [Field; N],\n}\n\nimpl Polynomial {\n /// Creates a new polynomial\n pub fn new(coefficients: [Field; N]) -> Self {\n Polynomial { coefficients }\n }\n\n /// Evaluate a polynomial at a point in the field.\n pub fn eval(self, x: Field) -> Field {\n let mut acc = self.coefficients[0];\n for i in 1..self.coefficients.len() {\n acc = acc * x + self.coefficients[i];\n }\n acc\n }\n\n /// Adds `upper_bound` to the coefficients of the polynomial and constrains them to be in the range `[0, 2 * upper_bound]`.\n pub fn range_check_1bound(self, upper_bound: u64) {\n let comp_value = (2 * upper_bound) as Field;\n for i in 0..self.coefficients.len() {\n let shifted_coeff = self.coefficients[i] + upper_bound as Field;\n shifted_coeff.assert_max_bit_size::<66>();\n (comp_value - shifted_coeff).assert_max_bit_size::<66>();\n }\n }\n\n /// Adds `-lower_bound` to the coefficients of the polynomial and constrains them to be in the range `[0, upper_bound - lower_bound]`.\n pub fn range_check_2bounds(self, upper_bound: u64, lower_bound: i64) {\n let mut value_shift = (lower_bound * -1) as Field;\n let comp_value = value_shift + upper_bound as Field;\n for i in 0..self.coefficients.len() {\n let shifted_coeff = self.coefficients[i] + value_shift;\n shifted_coeff.assert_max_bit_size::<66>();\n (comp_value - shifted_coeff).assert_max_bit_size::<66>();\n }\n }\n}\n\n#[test]\nfn test_polynomial_eval() {\n let coeffs = [1, 2, 3]; // represents 1x^2 + 2x + 3\n let poly = Polynomial::new(coeffs);\n\n let x = 2; // evaluate at x = 2\n let result = poly.eval(x);\n // (1 * 2^2) + (2 * 2) + 3 = 4 + 4 + 3 = 11\n assert_eq(result, 11);\n}\n\n#[test]\nfn test_polynomial_bounds() {\n let coeffs = [-16, 240, 242];\n let poly = Polynomial::new(coeffs);\n\n // Test single bound check\n poly.range_check_1bound(242);\n\n // Test double bounds check\n poly.range_check_2bounds(242, -16);\n}\n\n#[test]\nfn test_polynomial_eval_zero() {\n let coeffs = [1, -2, 1]; // x^2 - 2x + 1 = (x-1)^2\n let poly = Polynomial::new(coeffs);\n\n let x = 1; // evaluate at x = 1, should be 0\n let result = poly.eval(x);\n assert_eq(result, 0);\n}\n\n#[test]\nfn test_polynomial_eval_large() {\n let coeffs = [1000000, -500000, 250000]; // large coefficients\n let poly = Polynomial::new(coeffs);\n\n let x = 2;\n let result = poly.eval(x);\n // 1000000*2^2 - 500000*2 + 250000 = 4000000 - 1000000 + 250000 = 3250000\n assert_eq(result, 3250000);\n}\n","path":"/Users/giacomo/nargo/github.com/gnosisguild/greco/v0.1.0/circuits/src/math/polynomial.nr"},"77":{"source":"use poseidon::poseidon2_permutation;\n\nglobal RATE: u32 = 3;\nglobal CAPACITY: u32 = 1;\nglobal WIDTH: u32 = 4;\n\npub struct SafeSponge {\n state: [Field; WIDTH],\n out: Vec,\n absorb_pos: u32,\n squeeze_pos: u32,\n io_pattern: [u32; L],\n io_count: u32,\n}\n\nimpl SafeSponge {\n pub fn start(pattern: [u32; L]) -> SafeSponge {\n let mut sponge = SafeSponge:: {\n state: [0; WIDTH],\n out: Vec::new(),\n absorb_pos: 0,\n squeeze_pos: 0,\n io_pattern: pattern,\n io_count: 0,\n };\n sponge.state[0] = TAG;\n sponge\n }\n\n pub fn absorb(mut self, input: [Field; S]) -> SafeSponge {\n assert(self.io_pattern[self.io_count] as u32 == S);\n\n for i in 0..self.io_pattern[self.io_count] {\n if self.absorb_pos == RATE {\n self.state = poseidon2_permutation(self.state, self.state.len());\n self.absorb_pos = 0;\n }\n let pos = self.absorb_pos + CAPACITY;\n self.state[pos] = self.state[pos] + input[i];\n self.absorb_pos += 1;\n }\n self.io_count += 1;\n self.squeeze_pos = RATE;\n self\n }\n\n pub fn squeeze(mut self) -> Vec {\n for _ in 0..self.io_pattern[self.io_count] {\n if self.squeeze_pos == RATE {\n self.state = poseidon2_permutation(self.state, self.state.len());\n self.squeeze_pos = 0;\n self.absorb_pos = 0;\n }\n self.out.push(self.state[self.squeeze_pos + CAPACITY]);\n self.squeeze_pos += 1;\n }\n self.io_count += 1;\n self.out\n }\n\n pub fn finish(mut self) {\n // Clear the state\n self.state = [0; WIDTH];\n self.out = Vec::new();\n self.io_count = 0;\n self.io_pattern = [0; L];\n self.squeeze_pos = 0;\n self.absorb_pos = 0;\n }\n}\n\n#[test]\nfn test_safe_sponge() {\n let pattern = [5, 4];\n let mut safe = SafeSponge::<_, _, 14699256703807541932168660170536>::start(pattern);\n safe = safe.absorb([1, 2, 3, 4, 5]);\n\n let result = safe.squeeze();\n\n assert(result.len() == 4);\n assert(result.get(0) == 0x2ab2e2868c2490af2e13c32a0ba0852fe8d6b0979baa5831134e59029de898ab);\n assert(result.get(1) == 0x49eacd210d0bd4ae8609da50602d3144fca0ad09b77fbf3d7186068ffd374c);\n assert(result.get(2) == 0x16e39eccdecf20ef20ab765865573ffa55ad04b6e3dc44eaa2ee9a764e5f7159);\n assert(result.get(3) == 0x218adb7f25e9d014affbc444372dedcfbe9767fbf41c25412bd5bf99200be37f);\n\n safe.finish();\n}\n\n#[test]\nfn test_safe_sponge_multiple_absorb() {\n let pattern = [3, 2];\n let mut safe = SafeSponge::<_, _, 14699256703807541932168660170536>::start(pattern);\n safe = safe.absorb([1, 2, 3]);\n let result = safe.squeeze();\n\n assert(result.len() == 2);\n assert(result.get(0) == 0x0b6756778988e5a5f2127f26baf7b2056dcd9e26b7eff2716d47f3e8c4a9c38e);\n assert(result.get(1) == 0x20bd726a0eed7e98a62845891b62bee66ceab93fc41829acfef50a29e63fae0b);\n\n safe.finish();\n}\n","path":"/Users/giacomo/nargo/github.com/gnosisguild/safe-api/v0.1.0/src/safe.nr"}},"names":["main"],"brillig_names":[]} \ No newline at end of file diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts index 85af63d465..183c053bf4 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.d.ts @@ -106,9 +106,9 @@ export interface InitOutput { readonly __wbindgen_export_5: WebAssembly.Table; readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __externref_table_dealloc: (a: number) => void; - readonly closure281_externref_shim: (a: number, b: number, c: any) => void; - readonly closure197_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; - readonly closure201_externref_shim: (a: number, b: number, c: any, d: any) => void; + readonly closure335_externref_shim: (a: number, b: number, c: any) => void; + readonly closure257_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; + readonly closure261_externref_shim: (a: number, b: number, c: any, d: any) => void; readonly __wbindgen_start: () => void; } diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js index be77b22b48..193ea1f79f 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto.js @@ -218,15 +218,15 @@ export function __wbgtest_console_error(args) { } function __wbg_adapter_28(arg0, arg1, arg2) { - wasm.closure281_externref_shim(arg0, arg1, arg2); + wasm.closure335_externref_shim(arg0, arg1, arg2); } function __wbg_adapter_52(arg0, arg1, arg2, arg3, arg4) { - wasm.closure197_externref_shim(arg0, arg1, arg2, arg3, arg4); + wasm.closure257_externref_shim(arg0, arg1, arg2, arg3, arg4); } function __wbg_adapter_65(arg0, arg1, arg2, arg3) { - wasm.closure201_externref_shim(arg0, arg1, arg2, arg3); + wasm.closure261_externref_shim(arg0, arg1, arg2, arg3); } const EncryptFinalization = (typeof FinalizationRegistry === 'undefined') @@ -664,8 +664,8 @@ function __wbg_get_imports() { const ret = false; return ret; }; - imports.wbg.__wbindgen_closure_wrapper1885 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 282, __wbg_adapter_28); + imports.wbg.__wbindgen_closure_wrapper1962 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 336, __wbg_adapter_28); return ret; }; imports.wbg.__wbindgen_init_externref_table = function() { diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm index 62be58c764708f306aafacd8a9814c178a5b6b7a..174e6a821490df2bfc4a24f306dd9400b2ecb83f 100644 GIT binary patch delta 254564 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

+s(+Kw*W3e^I`{7 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�J8-?`7@vgQDRR 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

(provider: &P) -> eyre::Result +where + P: Provider + Send + Sync, +{ + let from = provider.get_accounts().await?[0]; + provider + .get_transaction_count(from) + .pending() + .await + .map_err(Into::into) +} sol! { #[derive(Debug)] @@ -180,19 +196,27 @@ impl EnclaveContract { } /// Type alias for read-only provider -pub type EnclaveReadOnlyProvider = RootProvider; +pub type EnclaveReadOnlyProvider = FillProvider< + JoinFill< + Identity, + JoinFill>>, + >, + RootProvider, +>; /// Type alias for read-write provider pub type EnclaveWriteProvider = FillProvider< JoinFill< JoinFill< - Identity, - JoinFill>>, + JoinFill< + Identity, + JoinFill>>, + >, + WalletFiller, >, - WalletFiller, + NonceFiller, >, - RootProvider, - BoxTransport, + RootProvider, Ethereum, >; @@ -215,9 +239,9 @@ impl EnclaveContractFactory { let signer: PrivateKeySigner = private_key.parse()?; let wallet = EthereumWallet::from(signer); let provider = ProviderBuilder::new() - .with_recommended_fillers() .wallet(wallet) - .on_builtin(http_rpc_url) + .with_cached_nonce_management() + .connect(http_rpc_url) .await?; Ok(EnclaveContract:: { @@ -234,7 +258,7 @@ impl EnclaveContractFactory { ) -> Result> { let contract_address = contract_address.parse()?; - let provider = ProviderBuilder::new().on_builtin(http_rpc_url).await?; + let provider = ProviderBuilder::new().connect(http_rpc_url).await?; Ok(EnclaveContract:: { provider: Arc::new(provider), @@ -253,19 +277,19 @@ where async fn get_e3_id(&self) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let e3_id = contract.nexte3Id().call().await?; - Ok(e3_id.nexte3Id) + Ok(e3_id) } async fn get_e3(&self, e3_id: U256) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let e3_return = contract.getE3(e3_id).call().await?; - Ok(e3_return.e3) + Ok(e3_return) } async fn get_input_count(&self, e3_id: U256) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let input_count = contract.inputCounts(e3_id).call().await?; - Ok(input_count.inputCount) + Ok(input_count) } async fn get_latest_block(&self) -> Result { @@ -276,19 +300,19 @@ where async fn get_root(&self, id: U256) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let root = contract.getRoot(id).call().await?; - Ok(root._0) + Ok(root) } async fn get_e3_params(&self, e3_id: U256) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let params = contract.e3Params(e3_id).call().await?; - Ok(params.params) + Ok(params) } async fn is_e3_program_enabled(&self, e3_program: Address) -> Result { let contract = Enclave::new(self.contract_address, &self.provider); let enabled = contract.e3Programs(e3_program).call().await?; - Ok(enabled.allowed) + Ok(enabled) } } @@ -305,6 +329,9 @@ impl EnclaveWrite for EnclaveContract { e3_params: Bytes, compute_provider_params: Bytes, ) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract .request( @@ -316,29 +343,43 @@ impl EnclaveWrite for EnclaveContract { e3_params, compute_provider_params, ) - .value(U256::from(1)); + .value(U256::from(1)) + .nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } async fn activate(&self, e3_id: U256, pub_key: Bytes) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); - let builder = contract.activate(e3_id, pub_key); + let builder = contract.activate(e3_id, pub_key).nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } async fn enable_e3_program(&self, e3_program: Address) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); - let builder = contract.enableE3Program(e3_program); + let builder = contract.enableE3Program(e3_program).nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } async fn publish_input(&self, e3_id: U256, data: Bytes) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); - let builder = contract.publishInput(e3_id, data); + let builder = contract.publishInput(e3_id, data).nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } @@ -348,9 +389,15 @@ impl EnclaveWrite for EnclaveContract { data: Bytes, proof: Bytes, ) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); - let builder = contract.publishCiphertextOutput(e3_id, data, proof); + let builder = contract + .publishCiphertextOutput(e3_id, data, proof) + .nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } @@ -359,9 +406,13 @@ impl EnclaveWrite for EnclaveContract { e3_id: U256, data: Bytes, ) -> Result { + let _guard = NONCE_LOCK.lock().await; + let nonce = next_pending_nonce(&*self.provider).await?; + let contract = Enclave::new(self.contract_address, &self.provider); - let builder = contract.publishPlaintextOutput(e3_id, data); + let builder = contract.publishPlaintextOutput(e3_id, data).nonce(nonce); let receipt = builder.send().await?.get_receipt().await?; + Ok(receipt) } } diff --git a/crates/evm-helpers/src/listener.rs b/crates/evm-helpers/src/listener.rs index ec668a6c2b..593529c70c 100644 --- a/crates/evm-helpers/src/listener.rs +++ b/crates/evm-helpers/src/listener.rs @@ -1,9 +1,9 @@ use alloy::{ + network::Ethereum, primitives::{Address, B256}, - providers::{Provider, ProviderBuilder, RootProvider}, + providers::{Provider, ProviderBuilder}, rpc::types::{BlockNumberOrTag, Filter, Log}, sol_types::SolEvent, - transports::BoxTransport, }; use eyre::Result; use futures::stream::StreamExt; @@ -16,13 +16,13 @@ type EventHandler = #[derive(Clone)] pub struct EventListener { - provider: Arc>, + provider: Arc>, filter: Filter, handlers: Arc>>>, } impl EventListener { - pub fn new(provider: Arc>, filter: Filter) -> Self { + pub fn new(provider: Arc>, filter: Filter) -> Self { Self { provider, filter, diff --git a/crates/evm-helpers/tests/helpers.rs b/crates/evm-helpers/tests/helpers.rs index 4aca799430..007c8f1105 100644 --- a/crates/evm-helpers/tests/helpers.rs +++ b/crates/evm-helpers/tests/helpers.rs @@ -1,7 +1,9 @@ +// helpers.rs use alloy::{ + network::Ethereum, node_bindings::{Anvil, AnvilInstance}, - providers::{ProviderBuilder, RootProvider, WsConnect}, - pubsub::PubSubFrontend, + providers::{Provider, ProviderBuilder, WsConnect}, + signers::local::PrivateKeySigner, sol, }; use eyre::Result; @@ -20,8 +22,9 @@ sol!( "tests/fixtures/emit_logs.json" ); +// Much cleaner return type using impl Provider pub async fn setup_logs_contract() -> Result<( - EmitLogsInstance>, + EmitLogsInstance, String, String, AnvilInstance, @@ -32,25 +35,15 @@ pub async fn setup_logs_contract() -> Result<( Ok((contract, address, endpoint, anvil)) } -pub async fn setup_fake_enclave() -> Result<( - EnclaveInstance>, - String, - String, - AnvilInstance, -)> { - let (provider, endpoint, anvil) = setup_provider().await?; - let contract = Enclave::deploy(provider).await?; - let address = contract.address().to_string(); - Ok((contract, address, endpoint, anvil)) -} - -pub async fn setup_provider() -> Result<(RootProvider, String, AnvilInstance)> { +pub async fn setup_provider() -> Result<(impl Provider, String, AnvilInstance)> { // Set anvil with fast blocktimes for testing let anvil = Anvil::new().block_time_f64(0.01).try_spawn()?; let provider = ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) + .wallet(PrivateKeySigner::from_slice(&anvil.keys()[0].to_bytes())?) + .connect_ws(WsConnect::new(anvil.ws_endpoint())) .await?; + let endpoint = anvil.ws_endpoint(); Ok((provider, endpoint, anvil)) } diff --git a/crates/evm-helpers/tests/listener.rs b/crates/evm-helpers/tests/listener.rs index b120232d19..a5c815ff2a 100644 --- a/crates/evm-helpers/tests/listener.rs +++ b/crates/evm-helpers/tests/listener.rs @@ -3,7 +3,7 @@ use alloy::sol; use e3_evm_helpers::listener::EventListener; use eyre::Result; use helpers::setup_logs_contract; -use std::time::Duration; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; use tokio::time::sleep; sol!( @@ -29,7 +29,7 @@ async fn test_event_listener() -> Result<()> { .add_event_handler(move |event: EmitLogs::ValueChanged| { let tx = tx.clone(); async move { - let _ = tx.clone().try_send(event.value.clone()); + let _ = tx.try_send(event.value.clone()); Ok(()) } }) @@ -39,7 +39,7 @@ async fn test_event_listener() -> Result<()> { .add_event_handler(move |event: EmitLogs::ValueChanged| { let tx_addr = tx_addr.clone(); async move { - let _ = tx_addr.clone().try_send(event.author.to_string()); + let _ = tx_addr.try_send(event.author.to_string()); Ok(()) } }) @@ -74,13 +74,11 @@ async fn test_event_listener() -> Result<()> { ); Ok(()) } -use std::time::{SystemTime, UNIX_EPOCH}; fn time_diff(past_timestamp: u128) -> Result { let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); let time_diff = current_time.saturating_sub(past_timestamp); - let time_diff_string = format!("{}ms", time_diff); - Ok(time_diff_string) + Ok(format!("{}ms", time_diff)) } fn process_message_with_timestamp(input: &str) -> Result<(String, String)> { @@ -94,13 +92,12 @@ fn process_message_with_timestamp(input: &str) -> Result<(String, String)> { #[tokio::test] async fn test_overlapping_listener_handlers() -> Result<()> { - // Here we are going to test that listeners can have overlapping async handlers. - // We want to ensure that long running handlers can run async whilest other handlers respond to - // events without disruption - // It is important that for this test we have Anvil blocktimes set to process fast so we can - // ensure order is maintained + // Test that listeners can have overlapping async handlers. + // Long running handlers should run async while other handlers respond to + // events without disruption. let (contract, _, _, anvil) = setup_logs_contract().await?; let (tx, mut rx) = tokio::sync::mpsc::channel::(10); + let mut event_listener = EventListener::create_contract_listener( &anvil.ws_endpoint(), &contract.address().to_string(), @@ -114,9 +111,9 @@ async fn test_overlapping_listener_handlers() -> Result<()> { async move { let (msg, time_diff) = process_message_with_timestamp(&event.value)?; println!("PublishMessage '{}' ({} since sent)", msg, time_diff); - let tx = tx.clone(); + let _ = tx.try_send("waiting".to_string()); - // Wait 200ms before publishing the message to simulate long running handlers + // Wait 200ms before publishing to simulate long running handlers sleep(Duration::from_millis(200)).await; println!("Sending message: '{msg}'"); let _ = tx.try_send(msg); @@ -128,11 +125,10 @@ async fn test_overlapping_listener_handlers() -> Result<()> { event_listener .add_event_handler(move |event: EmitLogs::ValueChanged| { let tx = tx.clone(); - async move { let (msg, time_diff) = process_message_with_timestamp(&event.value)?; println!("ValueChanged '{}' ({} since sent)", msg, time_diff); - let _ = tx.clone().try_send(msg); + let _ = tx.try_send(msg); Ok(()) } }) @@ -140,8 +136,7 @@ async fn test_overlapping_listener_handlers() -> Result<()> { event_listener.start(); - // For clarity the events should be returned - // roughly in this order: + // Events should be returned roughly in this order: // 0ms : one // 0ms : waiting // 100ms : two @@ -167,7 +162,6 @@ async fn test_overlapping_listener_handlers() -> Result<()> { sleep(Duration::from_millis(100)).await; let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); - contract .setValue(format!("two:{now}")) .send() diff --git a/crates/evm/src/ciphernode_registry_sol.rs b/crates/evm/src/ciphernode_registry_sol.rs index e59b9015ca..ee439d186e 100644 --- a/crates/evm/src/ciphernode_registry_sol.rs +++ b/crates/evm/src/ciphernode_registry_sol.rs @@ -1,14 +1,10 @@ -use crate::{ - event_reader::EvmEventReaderState, - helpers::{ReadonlyProvider, WithChainId}, - EvmEventReader, -}; +use crate::{event_reader::EvmEventReaderState, helpers::EthProvider, EvmEventReader}; use actix::Addr; use alloy::{ primitives::{LogData, B256}, + providers::Provider, sol, sol_types::SolEvent, - transports::BoxTransport, }; use anyhow::Result; use e3_data::Repository; @@ -52,6 +48,7 @@ impl From for EnclaveEvent { } struct CiphernodeRemovedWithChainId(pub ICiphernodeRegistry::CiphernodeRemoved, pub u64); + impl From for e3_events::CiphernodeRemoved { fn from(value: CiphernodeRemovedWithChainId) -> Self { e3_events::CiphernodeRemoved { @@ -81,8 +78,7 @@ impl From for EnclaveEvent { pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option { match topic { Some(&ICiphernodeRegistry::CiphernodeAdded::SIGNATURE_HASH) => { - let Ok(event) = ICiphernodeRegistry::CiphernodeAdded::decode_log_data(data, true) - else { + let Ok(event) = ICiphernodeRegistry::CiphernodeAdded::decode_log_data(data) else { error!("Error parsing event CiphernodeAdded after topic was matched!"); return None; }; @@ -91,8 +87,7 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option< ))) } Some(&ICiphernodeRegistry::CiphernodeRemoved::SIGNATURE_HASH) => { - let Ok(event) = ICiphernodeRegistry::CiphernodeRemoved::decode_log_data(data, true) - else { + let Ok(event) = ICiphernodeRegistry::CiphernodeRemoved::decode_log_data(data) else { error!("Error parsing event CiphernodeRemoved after topic was matched!"); return None; }; @@ -100,28 +95,31 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option< event, chain_id, ))) } - _topic => { trace!( topic=?_topic, - "Unknown event was received by Enclave.sol parser buut was ignored" + "Unknown event was received by CiphernodeRegistry.sol parser but was ignored" ); - return None; + None } } } /// Connects to CiphernodeRegistry.sol converting EVM events to EnclaveEvents pub struct CiphernodeRegistrySolReader; + impl CiphernodeRegistrySolReader { - pub async fn attach( + pub async fn attach

( bus: &Addr>, - provider: &WithChainId, + provider: EthProvider

, contract_address: &str, repository: &Repository, start_block: Option, rpc_url: String, - ) -> Result>> { + ) -> Result>> + where + P: Provider + Clone + 'static, + { let addr = EvmEventReader::attach( provider, extractor, @@ -133,7 +131,7 @@ impl CiphernodeRegistrySolReader { ) .await?; - info!(address=%contract_address, "EnclaveSolReader is listening to address"); + info!(address=%contract_address, "CiphernodeRegistrySolReader is listening to address"); Ok(addr) } @@ -141,15 +139,19 @@ impl CiphernodeRegistrySolReader { /// Wrapper for a reader and a future writer pub struct CiphernodeRegistrySol; + impl CiphernodeRegistrySol { - pub async fn attach( + pub async fn attach

( bus: &Addr>, - provider: &WithChainId, + provider: EthProvider

, contract_address: &str, repository: &Repository, start_block: Option, rpc_url: String, - ) -> Result<()> { + ) -> Result<()> + where + P: Provider + Clone + 'static, + { CiphernodeRegistrySolReader::attach( bus, provider, diff --git a/crates/evm/src/enclave_sol.rs b/crates/evm/src/enclave_sol.rs index a5c1ba354c..6f32a0def9 100644 --- a/crates/evm/src/enclave_sol.rs +++ b/crates/evm/src/enclave_sol.rs @@ -1,26 +1,29 @@ use crate::{ - enclave_sol_reader::EnclaveSolReader, - enclave_sol_writer::EnclaveSolWriter, - event_reader::EvmEventReaderState, - helpers::{ReadonlyProvider, RpcWSClient, SignerProvider, WithChainId}, + enclave_sol_reader::EnclaveSolReader, enclave_sol_writer::EnclaveSolWriter, + event_reader::EvmEventReaderState, helpers::EthProvider, }; use actix::Addr; -use alloy::transports::BoxTransport; +use alloy::providers::{Provider, WalletProvider}; use anyhow::Result; use e3_data::Repository; use e3_events::{EnclaveEvent, EventBus}; pub struct EnclaveSol; + impl EnclaveSol { - pub async fn attach( + pub async fn attach( bus: &Addr>, - read_provider: &WithChainId, - write_provider: &WithChainId, RpcWSClient>, + read_provider: EthProvider, + write_provider: EthProvider, contract_address: &str, repository: &Repository, start_block: Option, rpc_url: String, - ) -> Result<()> { + ) -> Result<()> + where + R: Provider + Clone + 'static, + W: Provider + WalletProvider + Clone + 'static, + { EnclaveSolReader::attach( bus, read_provider, @@ -30,7 +33,9 @@ impl EnclaveSol { rpc_url, ) .await?; + EnclaveSolWriter::attach(bus, write_provider, contract_address).await?; + Ok(()) } } diff --git a/crates/evm/src/enclave_sol_reader.rs b/crates/evm/src/enclave_sol_reader.rs index 933eb07fc2..f9f870f5ad 100644 --- a/crates/evm/src/enclave_sol_reader.rs +++ b/crates/evm/src/enclave_sol_reader.rs @@ -1,9 +1,9 @@ use crate::event_reader::EvmEventReaderState; -use crate::helpers::{ReadonlyProvider, WithChainId}; +use crate::helpers::EthProvider; use crate::EvmEventReader; use actix::Addr; use alloy::primitives::{LogData, B256}; -use alloy::transports::BoxTransport; +use alloy::providers::Provider; use alloy::{sol, sol_types::SolEvent}; use anyhow::Result; use e3_data::Repository; @@ -57,28 +57,27 @@ impl From for EnclaveEvent { pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option { match topic { Some(&IEnclave::E3Requested::SIGNATURE_HASH) => { - let Ok(event) = IEnclave::E3Requested::decode_log_data(data, true) else { + let Ok(event) = IEnclave::E3Requested::decode_log_data(data) else { error!("Error parsing event E3Requested after topic matched!"); return None; }; Some(EnclaveEvent::from(E3RequestedWithChainId(event, chain_id))) } Some(&IEnclave::CiphertextOutputPublished::SIGNATURE_HASH) => { - let Ok(event) = IEnclave::CiphertextOutputPublished::decode_log_data(data, true) else { - error!("Error parsing event CiphertextOutputPublished after topic matched!"); // TODO: provide more info + let Ok(event) = IEnclave::CiphertextOutputPublished::decode_log_data(data) else { + error!("Error parsing event CiphertextOutputPublished after topic matched!"); return None; }; Some(EnclaveEvent::from(CiphertextOutputPublishedWithChainId( event, chain_id, ))) } - _topic => { trace!( topic=?_topic, - "Unknown event was received by Enclave.sol parser buut was ignored" + "Unknown event received by Enclave.sol parser but was ignored" ); - return None; + None } } } @@ -87,14 +86,17 @@ pub fn extractor(data: &LogData, topic: Option<&B256>, chain_id: u64) -> Option< pub struct EnclaveSolReader; impl EnclaveSolReader { - pub async fn attach( + pub async fn attach

( bus: &Addr>, - provider: &WithChainId, + provider: EthProvider

, contract_address: &str, repository: &Repository, start_block: Option, rpc_url: String, - ) -> Result>> { + ) -> Result>> + where + P: Provider + Clone + 'static, + { let addr = EvmEventReader::attach( provider, extractor, diff --git a/crates/evm/src/enclave_sol_writer.rs b/crates/evm/src/enclave_sol_writer.rs index e67bbd727c..65af922f1a 100644 --- a/crates/evm/src/enclave_sol_writer.rs +++ b/crates/evm/src/enclave_sol_writer.rs @@ -1,7 +1,11 @@ -use crate::helpers::{RpcWSClient, SignerProvider, WithChainId}; +use crate::helpers::EthProvider; use actix::prelude::*; use actix::Addr; -use alloy::{primitives::Address, sol}; +use alloy::{ + primitives::Address, + providers::{Provider, WalletProvider}, + sol, +}; use alloy::{ primitives::{Bytes, U256}, rpc::types::TransactionReceipt, @@ -19,20 +23,20 @@ sol!( ); /// Consumes events from the event bus and calls EVM methods on the Enclave.sol contract -pub struct EnclaveSolWriter { - provider: WithChainId, RpcWSClient>, +pub struct EnclaveSolWriter

{ + provider: EthProvider

, contract_address: Address, bus: Addr>, } -impl EnclaveSolWriter { +impl EnclaveSolWriter

{ pub fn new( bus: &Addr>, - provider: &WithChainId, RpcWSClient>, + provider: EthProvider

, contract_address: Address, ) -> Result { Ok(Self { - provider: provider.clone(), + provider, contract_address, bus: bus.clone(), }) @@ -40,10 +44,11 @@ impl EnclaveSolWriter { pub async fn attach( bus: &Addr>, - provider: &WithChainId, RpcWSClient>, + provider: EthProvider

, contract_address: &str, - ) -> Result> { + ) -> Result>> { let addr = EnclaveSolWriter::new(bus, provider, contract_address.parse()?)?.start(); + bus.send(Subscribe::new("PlaintextAggregated", addr.clone().into())) .await?; @@ -54,17 +59,18 @@ impl EnclaveSolWriter { } } -impl Actor for EnclaveSolWriter { +impl Actor for EnclaveSolWriter

{ type Context = actix::Context; } -impl Handler for EnclaveSolWriter { +impl Handler for EnclaveSolWriter

{ type Result = (); + fn handle(&mut self, msg: EnclaveEvent, ctx: &mut Self::Context) -> Self::Result { match msg { EnclaveEvent::PlaintextAggregated { data, .. } => { // Only publish if the src and destination chains match - if self.provider.get_chain_id() == data.e3_id.chain_id() { + if self.provider.chain_id() == data.e3_id.chain_id() { ctx.notify(data); } } @@ -74,13 +80,16 @@ impl Handler for EnclaveSolWriter { } } -impl Handler for EnclaveSolWriter { +impl Handler + for EnclaveSolWriter

+{ type Result = ResponseFuture<()>; + fn handle(&mut self, msg: PlaintextAggregated, _: &mut Self::Context) -> Self::Result { Box::pin({ let e3_id = msg.e3_id.clone(); let decrypted_output = msg.decrypted_output.clone(); - let contract_address = self.contract_address.clone(); + let contract_address = self.contract_address; let provider = self.provider.clone(); let bus = self.bus.clone(); @@ -90,7 +99,7 @@ impl Handler for EnclaveSolWriter { .await; match result { Ok(receipt) => { - info!(tx=%receipt.transaction_hash, "tx") + info!(tx=%receipt.transaction_hash, "Published plaintext output"); } Err(err) => bus.err(EnclaveErrorType::Evm, err), } @@ -99,15 +108,16 @@ impl Handler for EnclaveSolWriter { } } -impl Handler for EnclaveSolWriter { +impl Handler for EnclaveSolWriter

{ type Result = (); + fn handle(&mut self, _: Shutdown, ctx: &mut Self::Context) -> Self::Result { ctx.stop(); } } -async fn publish_plaintext_output( - provider: WithChainId, RpcWSClient>, +async fn publish_plaintext_output( + provider: EthProvider

, contract_address: Address, e3_id: E3id, decrypted_output: Vec, @@ -115,8 +125,17 @@ async fn publish_plaintext_output( let e3_id: U256 = e3_id.try_into()?; let decrypted_output = Bytes::from(decrypted_output); let proof = Bytes::from(vec![1]); - let contract = IEnclave::new(contract_address, provider.get_provider()); - let builder = contract.publishPlaintextOutput(e3_id, decrypted_output, proof); + let from_address = provider.provider().default_signer_address(); + let current_nonce = provider + .provider() + .get_transaction_count(from_address) + .pending() + .await?; + + let contract = IEnclave::new(contract_address, provider.provider()); + let builder = contract + .publishPlaintextOutput(e3_id, decrypted_output, proof) + .nonce(current_nonce); let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } diff --git a/crates/evm/src/event_reader.rs b/crates/evm/src/event_reader.rs index 2db14c0cc1..45ceb39a5c 100644 --- a/crates/evm/src/event_reader.rs +++ b/crates/evm/src/event_reader.rs @@ -1,4 +1,4 @@ -use crate::helpers::WithChainId; +use crate::helpers::EthProvider; use actix::prelude::*; use actix::{Addr, Recipient}; use alloy::eips::BlockNumberOrTag; @@ -6,7 +6,6 @@ use alloy::primitives::Address; use alloy::primitives::{LogData, B256}; use alloy::providers::Provider; use alloy::rpc::types::Filter; -use alloy::transports::{BoxTransport, Transport}; use anyhow::{anyhow, Result}; use e3_data::{AutoPersist, Persistable, Repository}; use e3_events::{BusError, EnclaveErrorType, EnclaveEvent, EventBus, EventId, Subscribe}; @@ -35,12 +34,8 @@ impl EnclaveEvmEvent { pub type ExtractorFn = fn(&LogData, Option<&B256>, u64) -> Option; -pub struct EvmEventReaderParams -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ - provider: WithChainId, +pub struct EvmEventReaderParams

{ + provider: EthProvider

, extractor: ExtractorFn, contract_address: Address, start_block: Option, @@ -56,13 +51,9 @@ pub struct EvmEventReaderState { } /// Connects to Enclave.sol converting EVM events to EnclaveEvents -pub struct EvmEventReader -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ +pub struct EvmEventReader

{ /// The alloy provider - provider: Option>, + provider: Option>, /// The contract address contract_address: Address, /// The Extractor function to determine which events to extract and convert to EnclaveEvents @@ -82,12 +73,8 @@ where rpc_url: String, } -impl EvmEventReader -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ - pub fn new(params: EvmEventReaderParams) -> Self { +impl EvmEventReader

{ + pub fn new(params: EvmEventReaderParams

) -> Self { let (shutdown_tx, shutdown_rx) = oneshot::channel(); Self { contract_address: params.contract_address, @@ -103,7 +90,7 @@ where } pub async fn attach( - provider: &WithChainId, + provider: EthProvider

, extractor: ExtractorFn, contract_address: &str, start_block: Option, @@ -117,7 +104,7 @@ where .await?; let params = EvmEventReaderParams { - provider: provider.clone(), + provider, extractor, contract_address: contract_address.parse()?, start_block, @@ -125,25 +112,22 @@ where state: sync_state, rpc_url, }; - let addr = EvmEventReader::new(params).start(); + let addr = EvmEventReader::new(params).start(); bus.do_send(Subscribe::new("Shutdown", addr.clone().into())); - Ok(addr) } } -impl Actor for EvmEventReader -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ +impl Actor for EvmEventReader

{ type Context = actix::Context; + fn started(&mut self, ctx: &mut Self::Context) { let processor = ctx.address().recipient(); let bus = self.bus.clone(); + let Some(provider) = self.provider.take() else { - tracing::error!("Could not start event reader as provider has already been used."); + error!("Could not start event reader as provider has already been used."); return; }; @@ -156,6 +140,7 @@ where let contract_address = self.contract_address; let start_block = self.start_block; let rpc_url = self.rpc_url.clone(); + ctx.spawn( async move { stream_from_evm( @@ -176,8 +161,8 @@ where } #[instrument(name = "evm_event_reader", skip_all)] -async fn stream_from_evm, T: Transport + Clone>( - provider: WithChainId, +async fn stream_from_evm( + provider: EthProvider

, contract_address: &Address, processor: &Recipient, extractor: fn(&LogData, Option<&B256>, u64) -> Option, @@ -186,8 +171,8 @@ async fn stream_from_evm, T: Transport + Clone>( bus: &Addr>, rpc_url: String, ) { - let chain_id = provider.get_chain_id(); - let provider = provider.get_provider(); + let chain_id = provider.chain_id(); + let provider_ref = provider.provider(); if start_block.unwrap_or(0) == 0 && !is_local_node(&rpc_url) { error!( @@ -197,21 +182,22 @@ async fn stream_from_evm, T: Transport + Clone>( bus.err( EnclaveErrorType::Evm, anyhow!( - "Misconfiguration: Attempted to query historical events from genesis on a non-local node. Please specify a `start_block` for contract address {contract_address} on chain {chain_id} using rpc {rpc_url}" + "Misconfiguration: Attempted to query historical events from genesis on a non-local node. \ + Please specify a `start_block` for contract address {contract_address} on chain {chain_id} using rpc {rpc_url}" ) ); return; } let historical_filter = Filter::new() - .address(contract_address.clone()) + .address(*contract_address) .from_block(start_block.unwrap_or(0)); let current_filter = Filter::new() .address(*contract_address) .from_block(BlockNumberOrTag::Latest); // Historical events - match provider.clone().get_logs(&historical_filter).await { + match provider_ref.get_logs(&historical_filter).await { Ok(historical_logs) => { info!("Fetched {} historical events", historical_logs.len()); for log in historical_logs { @@ -229,11 +215,12 @@ async fn stream_from_evm, T: Transport + Clone>( } } - info!("subscribing to live events"); - match provider.subscribe_logs(¤t_filter).await { + info!("Subscribing to live events"); + match provider_ref.subscribe_logs(¤t_filter).await { Ok(subscription) => { let id: B256 = subscription.local_id().clone(); let mut stream = subscription.into_stream(); + loop { select! { maybe_log = stream.next() => { @@ -241,27 +228,23 @@ async fn stream_from_evm, T: Transport + Clone>( Some(log) => { let block_number = log.block_number; trace!("Received log from EVM"); - let Some(event) = extractor(log.data(), log.topic0(), chain_id) - else { + + let Some(event) = extractor(log.data(), log.topic0(), chain_id) else { trace!("Unknown log from EVM. This will happen from time to time."); continue; }; - trace!("Extracted Evm Event: {}", event); - processor.do_send(EnclaveEvmEvent::new(event, block_number)); + trace!("Extracted EVM Event: {}", event); + processor.do_send(EnclaveEvmEvent::new(event, block_number)); } None => break, // Stream ended } } _ = &mut shutdown => { info!("Received shutdown signal, stopping EVM stream"); - match provider.unsubscribe(id).await { - Ok(_) => { - info!("Unsubscribed successfully from EVM event stream"); - }, - Err(err) => { - error!("Cannot unsubscribe from EVM event stream: {}", err); - } + match provider_ref.unsubscribe(id).await { + Ok(_) => info!("Unsubscribed successfully from EVM event stream"), + Err(err) => error!("Cannot unsubscribe from EVM event stream: {}", err), }; break; } @@ -271,7 +254,8 @@ async fn stream_from_evm, T: Transport + Clone>( Err(e) => { bus.err(EnclaveErrorType::Evm, anyhow!("{}", e)); } - }; + } + info!("Exiting stream loop"); } @@ -279,12 +263,9 @@ fn is_local_node(rpc_url: &str) -> bool { rpc_url.contains("localhost") || rpc_url.contains("127.0.0.1") } -impl Handler for EvmEventReader -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ +impl Handler for EvmEventReader

{ type Result = (); + fn handle(&mut self, msg: EnclaveEvent, _: &mut Self::Context) -> Self::Result { if let EnclaveEvent::Shutdown { .. } = msg { if let Some(shutdown) = self.shutdown_tx.take() { @@ -294,11 +275,7 @@ where } } -impl Handler for EvmEventReader -where - P: Provider + Clone + 'static, - T: Transport + Clone + Unpin, -{ +impl Handler for EvmEventReader

{ type Result = (); #[instrument(name = "evm_event_reader", skip_all)] @@ -306,7 +283,8 @@ where match self.state.try_mutate(|mut state| { let event_id = wrapped.get_id(); trace!("Processing event: {}", event_id); - trace!("cache length: {}", state.ids.len()); + trace!("Cache length: {}", state.ids.len()); + if state.ids.contains(&event_id) { warn!( "Event id {} has already been seen and was not forwarded to the bus", @@ -317,12 +295,11 @@ where let event_type = wrapped.event.event_type(); - // Forward everything else to the event bus + // Forward to the event bus self.bus.do_send(wrapped.event); - // Save processed ids + // Save processed IDs trace!("Storing event(EVM) in cache {}({})", event_type, event_id); - state.ids.insert(event_id); state.last_block = wrapped.block; diff --git a/crates/evm/src/helpers.rs b/crates/evm/src/helpers.rs index 2bd18d3b6a..32bbaa4f30 100644 --- a/crates/evm/src/helpers.rs +++ b/crates/evm/src/helpers.rs @@ -1,14 +1,6 @@ use alloy::{ - network::{Ethereum, EthereumWallet}, - providers::{ - fillers::{ - BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, - WalletFiller, - }, - Identity, Provider, ProviderBuilder, RootProvider, - }, - pubsub::PubSubFrontend, - rpc::client::RpcClient, + network::EthereumWallet, + providers::{Provider, ProviderBuilder, WalletProvider}, signers::local::PrivateKeySigner, transports::{ http::{ @@ -19,16 +11,16 @@ use alloy::{ Http, }, ws::{WebSocketConfig, WsConnect}, - Authorization, BoxTransport, Transport, + Authorization, }, }; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result}; use base64::{engine::general_purpose::STANDARD, Engine}; use e3_config::{RpcAuth, RPC}; use e3_crypto::Cipher; use e3_data::Repository; -use std::{env, io, marker::PhantomData, sync::Arc}; -use zeroize::Zeroizing; +use std::{env, sync::Arc}; + pub trait AuthConversions { fn to_header_value(&self) -> Option; fn to_ws_auth(&self) -> Option; @@ -39,11 +31,8 @@ impl AuthConversions for RpcAuth { match self { RpcAuth::None => None, RpcAuth::Basic { username, password } => { - let auth = format!( - "Basic {}", - STANDARD.encode(Zeroizing::new(format!("{}:{}", username, password))) - ); - HeaderValue::from_str(&auth).ok() + let credentials = STANDARD.encode(format!("{}:{}", username, password)); + HeaderValue::from_str(&format!("Basic {}", credentials)).ok() } RpcAuth::Bearer(token) => HeaderValue::from_str(&format!("Bearer {}", token)).ok(), } @@ -58,65 +47,30 @@ impl AuthConversions for RpcAuth { } } -/// We need to cache the chainId so we can easily use it in a non-async situation -/// This wrapper just stores the chain_id with the Provider #[derive(Clone)] -// We have to be generic over T as the transport provider in order to handle different transport -// mechanisms such as the HttpClient etc. -pub struct WithChainId -where - P: Provider, - T: Transport + Clone, -{ +pub struct EthProvider

{ provider: Arc

, chain_id: u64, - _t: PhantomData, } -impl WithChainId -where - P: Provider, - T: Transport + Clone, -{ +impl EthProvider

{ pub async fn new(provider: P) -> Result { - let chain_id = provider - .get_chain_id() - .await - .map_err(|e| handle_conn_refused(e.into()))?; + let chain_id = provider.get_chain_id().await?; Ok(Self { provider: Arc::new(provider), chain_id, - _t: PhantomData, }) } - pub fn get_provider(&self) -> Arc

{ - self.provider.clone() + pub fn provider(&self) -> &P { + &self.provider } - pub fn get_chain_id(&self) -> u64 { + pub fn chain_id(&self) -> u64 { self.chain_id } } -pub type RpcWSClient = PubSubFrontend; -pub type RpcHttpClient = Http; -pub type SignerProvider = FillProvider< - JoinFill< - JoinFill< - Identity, - JoinFill>>, - >, - WalletFiller, - >, - RootProvider, - T, - Ethereum, ->; - -pub type ReadonlyProvider = RootProvider; - -#[derive(Clone)] pub struct ProviderConfig { rpc: RPC, auth: RpcAuth, @@ -127,171 +81,123 @@ impl ProviderConfig { Self { rpc, auth } } - async fn create_ws_provider(&self) -> Result> { - Ok(ProviderBuilder::new() - .on_ws(self.create_ws_connect()?) - .await - .map_err(|e| handle_conn_refused(e.into()))? - .boxed()) - } - - async fn create_http_provider(&self) -> Result> { - Ok(ProviderBuilder::new() - .on_client(self.create_http_client()?) - .boxed()) - } - - pub async fn create_readonly_provider( - &self, - ) -> Result> { + pub async fn create_readonly_provider(&self) -> Result> { let provider = if self.rpc.is_websocket() { - self.create_ws_provider().await? + ProviderBuilder::new() + .connect_ws(self.create_ws_connect()?) + .await + .context("Failed to connect to WebSocket RPC. Check if the node is running and URL is correct.")? } else { - self.create_http_provider().await? + ProviderBuilder::new().connect_client(self.create_http_client()?) }; - WithChainId::new(provider).await + + EthProvider::new(provider).await } - pub async fn create_ws_signer_provider( + pub async fn create_signer_provider( &self, - signer: &Arc, - ) -> Result, RpcWSClient>> { + signer: &PrivateKeySigner, + ) -> Result> { let wallet = EthereumWallet::from(signer.clone()); - let provider = ProviderBuilder::new() - .with_recommended_fillers() - .wallet(wallet) - .on_ws(self.create_ws_connect()?) - .await - .map_err(|e| handle_conn_refused(e.into()))?; - WithChainId::new(provider).await - } + let provider = if self.rpc.is_websocket() { + ProviderBuilder::new() + .wallet(wallet) + .connect_ws(self.create_ws_connect()?) + .await + .context("Failed to connect to WebSocket RPC. Check if the node is running and URL is correct.")? + } else { + ProviderBuilder::new() + .wallet(wallet) + .connect_client(self.create_http_client()?) + }; - pub async fn create_http_signer_provider( - &self, - signer: &Arc, - ) -> Result, RpcHttpClient>> { - let wallet = EthereumWallet::from(signer.clone()); - let provider = ProviderBuilder::new() - .with_recommended_fillers() - .wallet(wallet) - .on_client(self.create_http_client()?); - WithChainId::new(provider).await + EthProvider::new(provider).await } fn create_ws_connect(&self) -> Result { - let config = WebSocketConfig { - max_frame_size: Some(32 * 1024 * 1024), - max_message_size: Some(32 * 1024 * 1024), - ..Default::default() - }; + let config = WebSocketConfig::default() + .max_frame_size(Some(32 * 1024 * 1024)) + .max_message_size(Some(32 * 1024 * 1024)); - Ok(if let Some(ws_auth) = self.auth.to_ws_auth() { - WsConnect::new(self.rpc.as_ws_url()?) - .with_auth(ws_auth) - .with_config(config) - } else { - WsConnect::new(self.rpc.as_ws_url()?).with_config(config) - }) + let mut ws_connect = WsConnect::new(self.rpc.as_ws_url()?).with_config(config); + + if let Some(auth) = self.auth.to_ws_auth() { + ws_connect = ws_connect.with_auth(auth); + } + + Ok(ws_connect) } - fn create_http_client(&self) -> Result>> { + fn create_http_client(&self) -> Result { let mut headers = HeaderMap::new(); if let Some(auth_header) = self.auth.to_header_value() { headers.insert(AUTHORIZATION, auth_header); } + let client = Client::builder() .default_headers(headers) .build() .context("Failed to create HTTP client")?; + let http = Http::with_client(client, self.rpc.as_http_url()?.parse()?); - Ok(RpcClient::new(http, false)) + Ok(alloy::rpc::client::RpcClient::new(http, false)) } } -pub async fn pull_eth_signer_from_env(var: &str) -> Result> { +pub fn load_signer_from_env(var: &str) -> Result { let private_key = env::var(var)?; - let signer = private_key.parse()?; env::remove_var(var); - Ok(Arc::new(signer)) + private_key.parse().map_err(Into::into) } -pub async fn get_signer_from_repository( +pub async fn load_signer_from_repository( repository: Repository>, - cipher: &Arc, -) -> Result> { - let Some(private_key_encrypted) = repository.read().await? else { - bail!("No private key was found!") - }; + cipher: &Cipher, +) -> Result { + let encrypted_key = repository + .read() + .await? + .ok_or_else(|| anyhow::anyhow!("No private key found in repository"))?; - let encoded_private_key = Zeroizing::new(cipher.decrypt_data(&private_key_encrypted)?); + let decrypted = cipher.decrypt_data(&encrypted_key)?; + let private_key = String::from_utf8(decrypted)?; - let private_key = Zeroizing::new(String::from_utf8(encoded_private_key.to_vec())?); - - let signer = private_key.parse()?; - Ok(Arc::new(signer)) -} - -fn handle_conn_refused(err: anyhow::Error) -> anyhow::Error { - if err.chain().any(|cause| { - cause - .downcast_ref::() - .is_some_and(|ioe| ioe.kind() == io::ErrorKind::ConnectionRefused) - }) { - err.context( - "Failed to connect to RPC: connection refused. \ -Please ensure your local node is running and that the RPC URL is correct.", - ) - } else { - err - } + private_key.parse().map_err(Into::into) } #[cfg(test)] -mod test { +mod tests { use super::*; #[test] - fn test_rpc_type_conversion() -> Result<()> { - // Test HTTP URLs - let http = RPC::from_url("http://localhost:8545/").unwrap(); - assert!(matches!(http, RPC::Http(_))); + fn test_rpc_conversions() -> Result<()> { + // HTTP/HTTPS + let http = RPC::from_url("http://localhost:8545/")?; assert_eq!(http.as_http_url()?, "http://localhost:8545/"); assert_eq!(http.as_ws_url()?, "ws://localhost:8545/"); + assert!(!http.is_secure()); + assert!(!http.is_websocket()); - // Test HTTPS URLs - let https = RPC::from_url("https://example.com/").unwrap(); - assert!(matches!(https, RPC::Https(_))); + let https = RPC::from_url("https://example.com/")?; assert_eq!(https.as_http_url()?, "https://example.com/"); assert_eq!(https.as_ws_url()?, "wss://example.com/"); + assert!(https.is_secure()); + assert!(!https.is_websocket()); - // Test WS URLs - let ws = RPC::from_url("ws://localhost:8545/").unwrap(); - assert!(matches!(ws, RPC::Ws(_))); + // WS/WSS + let ws = RPC::from_url("ws://localhost:8545/")?; assert_eq!(ws.as_http_url()?, "http://localhost:8545/"); assert_eq!(ws.as_ws_url()?, "ws://localhost:8545/"); + assert!(!ws.is_secure()); + assert!(ws.is_websocket()); - // Test WSS URLs - let wss = RPC::from_url("wss://example.com/").unwrap(); - assert!(matches!(wss, RPC::Wss(_))); + let wss = RPC::from_url("wss://example.com/")?; assert_eq!(wss.as_http_url()?, "https://example.com/"); assert_eq!(wss.as_ws_url()?, "wss://example.com/"); + assert!(wss.is_secure()); + assert!(wss.is_websocket()); Ok(()) } - - #[test] - fn test_rpc_type_properties() { - assert!(!RPC::from_url("http://example.com/").unwrap().is_secure()); - assert!(RPC::from_url("https://example.com/").unwrap().is_secure()); - assert!(!RPC::from_url("ws://example.com/").unwrap().is_secure()); - assert!(RPC::from_url("wss://example.com/").unwrap().is_secure()); - - assert!(!RPC::from_url("http://example.com/").unwrap().is_websocket()); - assert!(!RPC::from_url("https://example.com/") - .unwrap() - .is_websocket()); - assert!(RPC::from_url("ws://example.com/").unwrap().is_websocket()); - assert!(RPC::from_url("wss://example.com/").unwrap().is_websocket()); - } } diff --git a/crates/evm/src/registry_filter_sol.rs b/crates/evm/src/registry_filter_sol.rs index 345c2eacd3..6e9c358871 100644 --- a/crates/evm/src/registry_filter_sol.rs +++ b/crates/evm/src/registry_filter_sol.rs @@ -1,7 +1,8 @@ -use crate::helpers::{RpcWSClient, SignerProvider, WithChainId}; +use crate::helpers::EthProvider; use actix::prelude::*; use alloy::{ primitives::{Address, Bytes, U256}, + providers::{Provider, WalletProvider}, rpc::types::TransactionReceipt, sol, }; @@ -18,20 +19,20 @@ sol!( "../../packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json" ); -pub struct RegistryFilterSolWriter { - provider: WithChainId, RpcWSClient>, +pub struct RegistryFilterSolWriter

{ + provider: EthProvider

, contract_address: Address, bus: Addr>, } -impl RegistryFilterSolWriter { +impl RegistryFilterSolWriter

{ pub async fn new( bus: &Addr>, - provider: &WithChainId, RpcWSClient>, + provider: EthProvider

, contract_address: Address, ) -> Result { Ok(Self { - provider: provider.clone(), + provider, contract_address, bus: bus.clone(), }) @@ -39,12 +40,13 @@ impl RegistryFilterSolWriter { pub async fn attach( bus: &Addr>, - provider: &WithChainId, RpcWSClient>, + provider: EthProvider

, contract_address: &str, - ) -> Result> { + ) -> Result>> { let addr = RegistryFilterSolWriter::new(bus, provider, contract_address.parse()?) .await? .start(); + let _ = bus .send(Subscribe::new("PublicKeyAggregated", addr.clone().into())) .await; @@ -53,17 +55,20 @@ impl RegistryFilterSolWriter { } } -impl Actor for RegistryFilterSolWriter { +impl Actor for RegistryFilterSolWriter

{ type Context = actix::Context; } -impl Handler for RegistryFilterSolWriter { +impl Handler + for RegistryFilterSolWriter

+{ type Result = (); + fn handle(&mut self, msg: EnclaveEvent, ctx: &mut Self::Context) -> Self::Result { match msg { EnclaveEvent::PublicKeyAggregated { data, .. } => { // Only publish if the src and destination chains match - if self.provider.get_chain_id() == data.e3_id.chain_id() { + if self.provider.chain_id() == data.e3_id.chain_id() { ctx.notify(data); } } @@ -73,13 +78,16 @@ impl Handler for RegistryFilterSolWriter { } } -impl Handler for RegistryFilterSolWriter { +impl Handler + for RegistryFilterSolWriter

+{ type Result = ResponseFuture<()>; + fn handle(&mut self, msg: PublicKeyAggregated, _: &mut Self::Context) -> Self::Result { Box::pin({ let e3_id = msg.e3_id.clone(); let pubkey = msg.pubkey.clone(); - let contract_address = self.contract_address.clone(); + let contract_address = self.contract_address; let provider = self.provider.clone(); let bus = self.bus.clone(); let nodes = msg.nodes.clone(); @@ -89,7 +97,7 @@ impl Handler for RegistryFilterSolWriter { publish_committee(provider, contract_address, e3_id, nodes, pubkey).await; match result { Ok(receipt) => { - info!(tx=%receipt.transaction_hash,"tx"); + info!(tx=%receipt.transaction_hash, "Transaction published"); } Err(err) => bus.err(EnclaveErrorType::Evm, err), } @@ -98,15 +106,18 @@ impl Handler for RegistryFilterSolWriter { } } -impl Handler for RegistryFilterSolWriter { +impl Handler + for RegistryFilterSolWriter

+{ type Result = (); + fn handle(&mut self, _: Shutdown, ctx: &mut Self::Context) -> Self::Result { ctx.stop(); } } -pub async fn publish_committee( - provider: WithChainId, RpcWSClient>, +pub async fn publish_committee( + provider: EthProvider

, contract_address: Address, e3_id: E3id, nodes: OrderedSet, @@ -118,17 +129,26 @@ pub async fn publish_committee( .into_iter() .filter_map(|node| node.parse().ok()) .collect(); - let contract = NaiveRegistryFilter::new(contract_address, provider.get_provider()); - let builder = contract.publishCommittee(e3_id, nodes, public_key); + let from_address = provider.provider().default_signer_address(); + let current_nonce = provider + .provider() + .get_transaction_count(from_address) + .pending() + .await?; + let contract = NaiveRegistryFilter::new(contract_address, provider.provider()); + let builder = contract + .publishCommittee(e3_id, nodes, public_key) + .nonce(current_nonce); let receipt = builder.send().await?.get_receipt().await?; Ok(receipt) } pub struct RegistryFilterSol; + impl RegistryFilterSol { - pub async fn attach( + pub async fn attach( bus: &Addr>, - provider: &WithChainId, RpcWSClient>, + provider: EthProvider

, contract_address: &str, ) -> Result<()> { RegistryFilterSolWriter::attach(bus, provider, contract_address).await?; diff --git a/crates/evm/tests/evm_reader.rs b/crates/evm/tests/evm_reader.rs index a217bfbf7e..962065617b 100644 --- a/crates/evm/tests/evm_reader.rs +++ b/crates/evm/tests/evm_reader.rs @@ -3,6 +3,7 @@ use alloy::{ node_bindings::Anvil, primitives::{FixedBytes, LogData}, providers::{ProviderBuilder, WsConnect}, + signers::local::PrivateKeySigner, sol, sol_types::SolEvent, }; @@ -12,7 +13,7 @@ use e3_entrypoint::helpers::datastore::get_in_mem_store; use e3_events::{ new_event_bus_with_history, EnclaveEvent, GetHistory, HistoryCollector, Shutdown, TestEvent, }; -use e3_evm::{helpers::WithChainId, EvmEventReader}; +use e3_evm::{helpers::EthProvider, EvmEventReader}; use std::time::Duration; use tokio::time::sleep; @@ -29,7 +30,7 @@ fn test_event_extractor( ) -> Option { match topic { Some(&EmitLogs::ValueChanged::SIGNATURE_HASH) => { - let Ok(event) = EmitLogs::ValueChanged::decode_log_data(data, true) else { + let Ok(event) = EmitLogs::ValueChanged::decode_log_data(data) else { return None; }; Some(EnclaveEvent::from(TestEvent { @@ -47,18 +48,19 @@ async fn evm_reader() -> Result<()> { // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; let rpc_url = anvil.ws_endpoint(); // Get RPC URL - let provider = WithChainId::new( + let provider = EthProvider::new( ProviderBuilder::new() - .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL + .wallet(PrivateKeySigner::from_slice(&anvil.keys()[0].to_bytes())?) + .connect_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; - let contract = EmitLogs::deploy(provider.get_provider()).await?; + let contract = EmitLogs::deploy(provider.provider()).await?; let (bus, history_collector) = new_event_bus_with_history(); let repository = Repository::new(get_in_mem_store()); EvmEventReader::attach( - &provider, + provider.clone(), test_event_extractor, &contract.address().to_string(), None, @@ -109,13 +111,14 @@ async fn ensure_historical_events() -> Result<()> { // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; let rpc_url = anvil.ws_endpoint(); // Get RPC URL - let provider = WithChainId::new( + let provider = EthProvider::new( ProviderBuilder::new() - .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL + .wallet(PrivateKeySigner::from_slice(&anvil.keys()[0].to_bytes())?) + .connect_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; - let contract = EmitLogs::deploy(provider.get_provider()).await?; + let contract = EmitLogs::deploy(provider.provider()).await?; let (bus, history_collector) = new_event_bus_with_history(); let historical_msgs = vec!["these", "are", "historical", "events"]; @@ -132,7 +135,7 @@ async fn ensure_historical_events() -> Result<()> { } EvmEventReader::attach( - &provider, + provider.clone(), test_event_extractor, &contract.address().to_string(), None, @@ -180,13 +183,14 @@ async fn ensure_resume_after_shutdown() -> Result<()> { // NOTE: Anvil must be available on $PATH let anvil = Anvil::new().block_time(1).try_spawn()?; let rpc_url = anvil.ws_endpoint(); // Get RPC URL - let provider = WithChainId::new( + let provider = EthProvider::new( ProviderBuilder::new() - .on_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL + .wallet(PrivateKeySigner::from_slice(&anvil.keys()[0].to_bytes())?) + .connect_ws(WsConnect::new(rpc_url.clone())) // Use RPC URL .await?, ) .await?; - let contract = EmitLogs::deploy(provider.get_provider()).await?; + let contract = EmitLogs::deploy(provider.provider()).await?; let (bus, history_collector) = new_event_bus_with_history(); async fn get_msgs( @@ -218,7 +222,7 @@ async fn ensure_resume_after_shutdown() -> Result<()> { } let addr1 = EvmEventReader::attach( - &provider, + provider.clone(), test_event_extractor, &contract.address().to_string(), None, @@ -255,7 +259,7 @@ async fn ensure_resume_after_shutdown() -> Result<()> { assert_eq!(msgs, ["before", "online", "live", "events"]); let _ = EvmEventReader::attach( - &provider, + provider.clone(), test_event_extractor, &contract.address().to_string(), None, diff --git a/crates/indexer/tests/helpers.rs b/crates/indexer/tests/helpers.rs index 4aca799430..bb796ffd54 100644 --- a/crates/indexer/tests/helpers.rs +++ b/crates/indexer/tests/helpers.rs @@ -1,7 +1,9 @@ +// helpers.rs use alloy::{ + network::Ethereum, node_bindings::{Anvil, AnvilInstance}, - providers::{ProviderBuilder, RootProvider, WsConnect}, - pubsub::PubSubFrontend, + providers::{Provider, ProviderBuilder, WsConnect}, + signers::local::PrivateKeySigner, sol, }; use eyre::Result; @@ -20,20 +22,8 @@ sol!( "tests/fixtures/emit_logs.json" ); -pub async fn setup_logs_contract() -> Result<( - EmitLogsInstance>, - String, - String, - AnvilInstance, -)> { - let (provider, endpoint, anvil) = setup_provider().await?; - let contract = EmitLogs::deploy(provider).await?; - let address = contract.address().to_string(); - Ok((contract, address, endpoint, anvil)) -} - pub async fn setup_fake_enclave() -> Result<( - EnclaveInstance>, + EnclaveInstance, String, String, AnvilInstance, @@ -44,13 +34,15 @@ pub async fn setup_fake_enclave() -> Result<( Ok((contract, address, endpoint, anvil)) } -pub async fn setup_provider() -> Result<(RootProvider, String, AnvilInstance)> { +pub async fn setup_provider() -> Result<(impl Provider, String, AnvilInstance)> { // Set anvil with fast blocktimes for testing let anvil = Anvil::new().block_time_f64(0.01).try_spawn()?; let provider = ProviderBuilder::new() - .on_ws(WsConnect::new(anvil.ws_endpoint())) + .wallet(PrivateKeySigner::from_slice(&anvil.keys()[0].to_bytes())?) + .connect_ws(WsConnect::new(anvil.ws_endpoint())) .await?; + let endpoint = anvil.ws_endpoint(); Ok((provider, endpoint, anvil)) } diff --git a/crates/indexer/tests/indexer.rs b/crates/indexer/tests/indexer.rs index f39cb85bf7..7f5689c8b4 100644 --- a/crates/indexer/tests/indexer.rs +++ b/crates/indexer/tests/indexer.rs @@ -19,6 +19,8 @@ sol!( #[tokio::test] async fn test_indexer() -> Result<()> { let (contract, address, endpoint, _anvil) = setup_fake_enclave().await?; + let address = address.to_string(); + let endpoint = endpoint.to_string(); let mut indexer = EnclaveIndexer::::from_endpoint_address_in_mem(&endpoint, &address).await?; @@ -58,7 +60,7 @@ async fn test_indexer() -> Result<()> { contract .emitInputPublished( Uint::from(e3_id), - Bytes::from(data.clone()), + Bytes::from(data.clone().into_bytes()), Uint::from(1111), Uint::from(1), ) @@ -70,7 +72,7 @@ async fn test_indexer() -> Result<()> { contract .emitInputPublished( Uint::from(e3_id), - Bytes::from(data.clone()), + Bytes::from(data.clone().into_bytes()), Uint::from(2222), Uint::from(2), ) @@ -82,7 +84,7 @@ async fn test_indexer() -> Result<()> { contract .emitInputPublished( Uint::from(e3_id), - Bytes::from(data.clone()), + Bytes::from(data.clone().into_bytes()), Uint::from(3333), Uint::from(3), ) @@ -97,9 +99,9 @@ async fn test_indexer() -> Result<()> { assert_eq!( indexer.get_e3(e3_id).await?.ciphertext_inputs, vec![ - (Bytes::from(data.clone()).to_vec(), 1), - (Bytes::from(data.clone()).to_vec(), 2), - (Bytes::from(data.clone()).to_vec(), 3), + (Bytes::from(data.clone().into_bytes()).to_vec(), 1), + (Bytes::from(data.clone().into_bytes()).to_vec(), 2), + (Bytes::from(data.clone().into_bytes()).to_vec(), 3), ] ); diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index cce2a5cbab..7c827a82a0 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -27,11 +27,11 @@ env_logger = "0.11.5" hex = { version = "0.4.3" } log = { version = "0.4" } reqwest = { version = "0.12.15", features = ["json"] } -risc0-build = { version = "2.0.1", features = ["docker"] } -risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } -risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } -risc0-zkvm = { version = "2.0.0" } -risc0-zkp = { version = "2.0.0", default-features = false } +risc0-build = { version = "2.1.2", features = ["docker"] } +risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-zkvm = { version = "2.1.0" } +risc0-zkp = { version = "2.0.1", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/crates/support/Dockerfile b/crates/support/Dockerfile index 0bdcee5c2c..749c6eb105 100644 --- a/crates/support/Dockerfile +++ b/crates/support/Dockerfile @@ -1,5 +1,5 @@ ARG RUST_VERSION=1.85.0 -ARG RISC0_VERSION=2.0.0 +ARG RISC0_VERSION=2.1.0 ARG SKIP_SOLIDITY=0 FROM rust:${RUST_VERSION}-slim-bookworm AS base-dev diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml index 72e9fdf642..1e26a2dffd 100644 --- a/crates/support/methods/guest/Cargo.toml +++ b/crates/support/methods/guest/Cargo.toml @@ -12,7 +12,7 @@ path = "src/bin/program.rs" [dependencies] alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" -risc0-zkvm = { version = "2.0.0", default-features = false, features = ['std'] } +risc0-zkvm = { version = "2.1.0", default-features = false, features = ['std'] } e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } e3-user-program = { path = "../../program" } bincode = "1.3.3" diff --git a/deploy/local/contracts.sh b/deploy/local/contracts.sh index bcfa1fa321..45506b40c7 100755 --- a/deploy/local/contracts.sh +++ b/deploy/local/contracts.sh @@ -1,7 +1,7 @@ # !/bin/bash # Install the enclave binary -cargo install --path ./crates/cli --bin enclave -f +# cargo install --path ./crates/cli --bin enclave -f # Deploy Contacts (cd packages/evm && rm -rf deployments/localhost && pnpm deploy:mocks --network localhost) diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index c1410740db..7b0b86137e 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -3,7 +3,7 @@ # ──────────────────────────────────────────────────────────────────────────────── FROM ubuntu:24.04 -ARG RISCZERO_VERSION=2.0.0 +ARG RISCZERO_VERSION=2.1.0 ARG CPP_VERSION=2024.1.5 ARG RUST_VERSION=1.85.0 diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 0dbca149e6..fb5c59f58b 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -34,7 +34,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "flate2", "foldhash", @@ -149,7 +149,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "foldhash", "futures-core", @@ -207,7 +207,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -245,47 +244,31 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "2b064bd1cea105e70557a258cd2b317731896753ec08edf51da2d1fced587b05" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-core", - "alloy-eips 0.8.3", - "alloy-genesis 0.8.3", - "alloy-provider 0.8.3", - "alloy-rpc-client 0.8.3", - "alloy-serde 0.8.3", - "alloy-transport-http 0.8.3", -] - -[[package]] -name = "alloy" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" -dependencies = [ - "alloy-consensus 0.12.6", + "alloy-consensus", "alloy-contract", "alloy-core", - "alloy-eips 0.12.6", - "alloy-genesis 0.12.6", - "alloy-network 0.12.6", - "alloy-provider 0.12.6", - "alloy-rpc-client 0.12.6", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", + "alloy-serde", + "alloy-signer", "alloy-signer-local", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", ] [[package]] name = "alloy-chains" -version = "0.1.69" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +checksum = "19a9cc9d81ace3da457883b0bdf76776e55f1b84219a9e9d55c27ad308548d3f" dependencies = [ "alloy-primitives", "num_enum", @@ -294,39 +277,23 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "32c3f3bc4f2a6b725970cd354e78e9738ea1e8961a91898f57bf6317970b1915" dependencies = [ - "alloy-eips 0.8.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.8.3", + "alloy-serde", "alloy-trie", "auto_impl", "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" -dependencies = [ - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.12.6", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 2.0.1", + "derive_more", "either", "k256", "once_cell", "rand 0.8.5", + "secp256k1", "serde", "serde_with", "thiserror 2.0.12", @@ -334,48 +301,34 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" +checksum = "dda014fb5591b8d8d24cab30f52690117d238e52254c6fb40658e91ea2ccd6c3" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] [[package]] name = "alloy-contract" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" +checksum = "9668ce1176f0b87a5e5fc805b3d198954f495de2e99b70a44bed691ba2b0a9d8" dependencies = [ - "alloy-consensus 0.12.6", + "alloy-consensus", "alloy-dyn-abi", "alloy-json-abi", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-network", + "alloy-network-primitives", "alloy-primitives", - "alloy-provider 0.12.6", - "alloy-rpc-types-eth 0.12.6", + "alloy-provider", + "alloy-rpc-types-eth", "alloy-sol-types", - "alloy-transport 0.12.6", + "alloy-transport", "futures", "futures-util", "thiserror 2.0.12", @@ -383,9 +336,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +checksum = "5968f48d7a62587cd874bd84034831da4f7f577ce5de984828e376766efc0f32" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -396,15 +349,14 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", @@ -413,9 +365,9 @@ dependencies = [ [[package]] name = "alloy-eip2124" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -426,32 +378,20 @@ dependencies = [ [[package]] name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -461,73 +401,42 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702 0.4.2", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-eips" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" +checksum = "2f7b2f7010581f29bcace81776cf2f0e022008d05a7d326884763f16f3044620" dependencies = [ "alloy-eip2124", "alloy-eip2930", - "alloy-eip7702 0.5.1", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "auto_impl", "c-kzg", - "derive_more 2.0.1", + "derive_more", "either", - "once_cell", "serde", "sha2", ] [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "c7f723856b1c4ad5473f065650ab9be557c96fbc77e89180fbdac003e904a8d6" dependencies = [ + "alloy-eips", "alloy-primitives", - "alloy-serde 0.8.3", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-genesis" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" -dependencies = [ - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-trie", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -537,23 +446,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27434beae2514d4a2aa90f53832cbdf6f23e4b5e2656d95eaf15f9276e2418b6" +checksum = "ca1e31b50f4ed9a83689ae97263d366b15b935a67c4acb5dd46d5b1c3b27e8e6" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -565,49 +460,24 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "879afc0f4a528908c8fe6935b2ab0bc07f77221a989186f71583f7592831689e" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", "alloy-primitives", - "alloy-rpc-types-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", - "alloy-signer 0.8.3", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", "alloy-sol-types", "async-trait", "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" -dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-rpc-types-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", - "alloy-sol-types", - "async-trait", - "auto_impl", - "derive_more 2.0.1", + "derive_more", "futures-utils-wasm", "serde", "serde_json", @@ -616,41 +486,28 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" +checksum = "ec185bac9d32df79c1132558a450d48f6db0bfb5adef417dbb1a0258153f879b" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", + "alloy-consensus", + "alloy-eips", "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", "hashbrown 0.15.3", "indexmap 2.9.0", @@ -659,7 +516,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -669,66 +526,31 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "b2d918534afe9cc050eabd8309c107dafd161aa77357782eca4f218bef08a660" dependencies = [ "alloy-chains", - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network 0.8.3", - "alloy-network-primitives 0.8.3", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", "alloy-primitives", - "alloy-rpc-client 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru 0.12.5", - "parking_lot", - "pin-project", - "reqwest", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-provider" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" -dependencies = [ - "alloy-chains", - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", - "alloy-primitives", - "alloy-rpc-client 0.12.6", - "alloy-rpc-types-eth 0.12.6", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-signer", "alloy-sol-types", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", "async-stream", "async-trait", "auto_impl", "dashmap", + "either", "futures", "futures-utils-wasm", - "lru 0.13.0", + "lru", "parking_lot", "pin-project", "reqwest", @@ -765,37 +587,14 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc 0.8.3", - "alloy-primitives", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" +checksum = "a15e30dcada47c04820b64f63de2423506c5c74f9ab59b115277ef5ad595a6fc" dependencies = [ - "alloy-json-rpc 0.12.6", + "alloy-json-rpc", "alloy-primitives", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", "async-stream", "futures", "pin-project", @@ -813,71 +612,40 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" +checksum = "4aa10e26554ad7f79a539a6a8851573aedec5289f1f03244aad0bdbc324bfe5c" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", + "alloy-rpc-types-eth", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" -dependencies = [ - "alloy-consensus-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "7a5a8f1efd77116915dad61092f9ef9295accd0b0b251062390d9c4e81599344" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-network-primitives 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" +checksum = "bc1323310d87f9d950fb3ff58d943fdf832f5e10e6f902f405c0eaa954ffbaf1" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-sol-types", "itertools 0.14.0", "serde", @@ -887,20 +655,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1cd73fc054de6353c7f22ff9b846b0f0f145cd0112da07d4119e41e9959207" +checksum = "d05ace2ef3da874544c3ffacfd73261cdb1405d8631765deb991436a53ec6069" dependencies = [ "alloy-primitives", "serde", @@ -909,23 +666,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-signer" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96fbde54bee943cd94ebacc8a62c50b38c7dfd2552dcd79ff61aea778b1bfcc" +checksum = "67fdabad99ad3c71384867374c60bcd311fc1bb90ea87f5f9c779fd8c7ec36aa" dependencies = [ "alloy-primitives", "async-trait", @@ -938,14 +681,14 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" +checksum = "acb3f4e72378566b189624d54618c8adf07afbcf39d5f368f4486e35a66725b3" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-network 0.12.6", + "alloy-consensus", + "alloy-network", "alloy-primitives", - "alloy-signer 0.12.6", + "alloy-signer", "async-trait", "k256", "rand 0.8.5", @@ -954,9 +697,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -968,9 +711,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -987,9 +730,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "alloy-json-abi", "const-hex", @@ -1005,9 +748,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -1015,46 +758,26 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", "serde", ] [[package]] name = "alloy-transport" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "6964d85cd986cfc015b96887b89beed9e06d0d015b75ee2b7bfbd64341aab874" dependencies = [ - "alloy-json-rpc 0.8.3", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" -dependencies = [ - "alloy-json-rpc 0.12.6", + "alloy-json-rpc", + "alloy-primitives", "base64", - "derive_more 2.0.1", + "derive_more", "futures", "futures-utils-wasm", "parking_lot", @@ -1070,27 +793,12 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "ef7c5ea7bda4497abe4ea92dcb8c76e9f052c178f3c82aa6976bcb264675f73c" dependencies = [ - "alloy-json-rpc 0.8.3", - "alloy-transport 0.8.3", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" -dependencies = [ - "alloy-json-rpc 0.12.6", - "alloy-transport 0.12.6", + "alloy-json-rpc", + "alloy-transport", "reqwest", "serde_json", "tower", @@ -1100,14 +808,14 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more 1.0.0", + "derive_more", "nybbles", "serde", "smallvec", @@ -1704,6 +1412,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1879,9 +1603,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "1.0.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" dependencies = [ "blst", "cc", @@ -2260,34 +1984,13 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -2393,7 +2096,8 @@ dependencies = [ name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ - "alloy 0.8.3", + "alloy-dyn-abi", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -3029,6 +2733,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex-literal" version = "0.4.1" @@ -3638,15 +3351,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "lru" version = "0.13.0" @@ -4549,6 +4253,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -4587,6 +4292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -4776,7 +4482,7 @@ checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" dependencies = [ "anyhow", "borsh", - "derive_more 2.0.1", + "derive_more", "elf", "lazy_static", "postcard", @@ -4789,9 +4495,9 @@ dependencies = [ [[package]] name = "risc0-build" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" +checksum = "d17d6657b1fb615c0482bd4b57aae7850911ed7dbdc8e783df20e93f33209a8f" dependencies = [ "anyhow", "cargo_metadata", @@ -4813,8 +4519,8 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +version = "2.1.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" dependencies = [ "anyhow", "bytemuck", @@ -4826,9 +4532,9 @@ dependencies = [ [[package]] name = "risc0-circuit-keccak" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +checksum = "8d339c65b0e011677404bd6bdfe1b0f29748187a568fb2f74df7fb650590181a" dependencies = [ "anyhow", "bytemuck", @@ -4842,9 +4548,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +checksum = "8c6501fd3936aea2dd3e55915f34328fe96e6ca25ef00320242f837ae668785b" dependencies = [ "anyhow", "bytemuck", @@ -4857,14 +4563,14 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +checksum = "c80e0a8f0f56106295bb682dbc27093438e163a5f6384a79e877ab895a11d9ae" dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more 2.0.1", + "derive_more", "paste", "risc0-binfmt", "risc0-core", @@ -4886,10 +4592,10 @@ dependencies = [ [[package]] name = "risc0-ethereum-contracts" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +version = "2.1.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" dependencies = [ - "alloy 0.12.6", + "alloy", "alloy-sol-types", "anyhow", "cfg-if", @@ -4956,9 +4662,9 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +checksum = "0f1014d2efcb3b359aff878c9aeb6aa949a6d91f091a2ffb5ffd8d928a1ab7f3" dependencies = [ "anyhow", "bincode", @@ -4966,7 +4672,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "derive_more 2.0.1", + "derive_more", "getrandom 0.2.16", "hex", "lazy-regex", @@ -5190,17 +4896,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -5222,6 +4917,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -5587,9 +5303,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index f0e480cedc..9399977be1 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -13,12 +13,12 @@ voting-core = { path = "./core" } methods = { path = "./methods" } program-client = { path = "./client" } -alloy-primitives = { version = "0.8", default-features = false, features = [ +alloy-primitives = { version = "1.0", default-features = false, features = [ "rlp", "serde", "std", ]} -alloy-sol-types = { version = "0.8" } +alloy-sol-types = { version = "1.0" } anyhow = { version = "1.0.86" } actix-web = "4.10.2" bincode = { version = "1.3.3" } @@ -27,11 +27,11 @@ env_logger = "0.11.5" hex = { version = "0.4.3" } log = { version = "0.4" } reqwest = { version = "0.12.15", features = ["json"] } -risc0-build = { version = "2.0.1", features = ["docker"] } -risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } -risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.0.0" } -risc0-zkvm = { version = "2.0.0" } -risc0-zkp = { version = "2.0.0", default-features = false } +risc0-build = { version = "2.1.2", features = ["docker"] } +risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-zkvm = { version = "2.1.0" } +risc0-zkp = { version = "2.0.1", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.lock b/examples/CRISP/apps/program/methods/guest/Cargo.lock index 10667ed65f..733cf11055 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.lock +++ b/examples/CRISP/apps/program/methods/guest/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - [[package]] name = "ahash" version = "0.8.12" @@ -24,7 +9,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -45,152 +29,27 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-provider", - "alloy-rpc-client", - "alloy-serde", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", "winnow", ] -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -198,69 +57,17 @@ dependencies = [ "serde_json", ] -[[package]] -name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", "hashbrown 0.15.3", "indexmap", @@ -269,7 +76,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -277,149 +84,21 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - [[package]] name = "alloy-rlp" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ - "alloy-rlp-derive", "arrayvec", "bytes", ] -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -431,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -449,9 +128,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "const-hex", "dunce", @@ -465,9 +144,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -475,66 +154,14 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" -dependencies = [ - "alloy-json-rpc", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", "serde", - "smallvec", - "tracing", ] [[package]] @@ -939,42 +566,6 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] [[package]] name = "auto_impl" @@ -993,33 +584,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64ct" version = "1.7.3" @@ -1098,18 +668,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - [[package]] name = "borsh" version = "1.5.7" @@ -1133,12 +691,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - [[package]] name = "byte-slice-cast" version = "1.2.3" @@ -1180,21 +732,6 @@ dependencies = [ "serde", ] -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - [[package]] name = "cc" version = "1.2.25" @@ -1350,20 +887,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "der" version = "0.7.10" @@ -1385,34 +908,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -1448,17 +950,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "doc-comment" version = "0.3.3" @@ -1481,7 +972,8 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -1604,7 +1096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -1747,15 +1239,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -1763,7 +1246,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -1777,128 +1260,18 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - [[package]] name = "generic-array" version = "0.14.7" @@ -1933,18 +1306,6 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - [[package]] name = "group" version = "0.13.0" @@ -1978,12 +1339,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.3" @@ -2002,12 +1357,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - [[package]] name = "hex" version = "0.4.3" @@ -2032,212 +1381,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "impl-codec" version = "0.6.0" @@ -2275,22 +1418,6 @@ dependencies = [ "serde", ] -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "itertools" version = "0.10.5" @@ -2324,16 +1451,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.13.4" @@ -2414,37 +1531,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "macro-string" version = "0.1.4" @@ -2502,61 +1594,18 @@ dependencies = [ "bitflags 2.9.1", "block", "core-graphics-types", - "foreign-types 0.5.0", + "foreign-types", "log", "objc", "paste", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - [[package]] name = "multimap" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndarray" version = "0.15.6" @@ -2667,49 +1716,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - [[package]] name = "objc" version = "0.2.7" @@ -2719,65 +1725,12 @@ dependencies = [ "malloc_buf", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types 0.3.2", - "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.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -2806,41 +1759,12 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[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.8.0" @@ -2862,38 +1786,12 @@ dependencies = [ "indexmap", ] -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs8" version = "0.10.2" @@ -2904,12 +1802,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "postcard" version = "1.1.1" @@ -2922,15 +1814,6 @@ dependencies = [ "serde", ] -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3121,7 +2004,6 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", - "serde", ] [[package]] @@ -3132,6 +2014,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -3170,6 +2053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -3207,15 +2091,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.9.1", -] - [[package]] name = "regex" version = "1.11.1" @@ -3245,45 +2120,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.12.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" -dependencies = [ - "base64", - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -3302,7 +2138,7 @@ checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" dependencies = [ "anyhow", "borsh", - "derive_more 2.0.1", + "derive_more", "elf", "lazy_static", "postcard", @@ -3315,9 +2151,9 @@ dependencies = [ [[package]] name = "risc0-circuit-keccak" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +checksum = "8d339c65b0e011677404bd6bdfe1b0f29748187a568fb2f74df7fb650590181a" dependencies = [ "anyhow", "bytemuck", @@ -3331,9 +2167,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +checksum = "8c6501fd3936aea2dd3e55915f34328fe96e6ca25ef00320242f837ae668785b" dependencies = [ "anyhow", "bytemuck", @@ -3346,14 +2182,14 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +checksum = "c80e0a8f0f56106295bb682dbc27093438e163a5f6384a79e877ab895a11d9ae" dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more 2.0.1", + "derive_more", "paste", "risc0-binfmt", "risc0-core", @@ -3431,14 +2267,14 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +checksum = "0f1014d2efcb3b359aff878c9aeb6aa949a6d91f091a2ffb5ffd8d928a1ab7f3" dependencies = [ "anyhow", "borsh", "bytemuck", - "derive_more 2.0.1", + "derive_more", "getrandom 0.2.16", "hex", "risc0-binfmt", @@ -3525,12 +2361,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -3571,16 +2401,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", + "windows-sys", ] [[package]] @@ -3607,32 +2428,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "sec1" version = "0.7.3" @@ -3647,29 +2442,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.11.0" @@ -3729,18 +2501,6 @@ dependencies = [ "serde", ] -[[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 = "sha2" version = "0.10.9" @@ -3788,33 +2548,11 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "smallvec" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] [[package]] name = "spin" @@ -3842,40 +2580,12 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - [[package]] name = "subtle" version = "2.6.1" @@ -3906,9 +2616,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", @@ -3916,26 +2626,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "tap" version = "1.0.1" @@ -3952,7 +2642,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -3995,15 +2685,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -4013,78 +2694,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml_datetime" version = "0.6.9" @@ -4102,51 +2711,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.41" @@ -4189,12 +2753,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typenum" version = "1.18.0" @@ -4237,35 +2795,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[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.5" @@ -4291,15 +2826,6 @@ dependencies = [ "libc", ] -[[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.11.0+wasi-snapshot-preview1" @@ -4315,110 +2841,6 @@ dependencies = [ "wit-bindgen-rt", ] -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.59.0" @@ -4510,12 +2932,6 @@ dependencies = [ "bitflags 2.9.1", ] -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - [[package]] name = "wyz" version = "0.5.1" @@ -4525,30 +2941,6 @@ dependencies = [ "tap", ] -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.8.25" @@ -4569,27 +2961,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - [[package]] name = "zeroize" version = "1.8.1" @@ -4609,36 +2980,3 @@ dependencies = [ "quote", "syn 2.0.101", ] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] diff --git a/examples/CRISP/apps/program/methods/guest/Cargo.toml b/examples/CRISP/apps/program/methods/guest/Cargo.toml index 012dd45458..9dc83343b0 100644 --- a/examples/CRISP/apps/program/methods/guest/Cargo.toml +++ b/examples/CRISP/apps/program/methods/guest/Cargo.toml @@ -10,9 +10,9 @@ name = "voting" path = "src/bin/voting.rs" [dependencies] -alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } -alloy-sol-types = "0.8" -risc0-zkvm = { version = "2.0.0", default-features = false, features = ['std'] } +alloy-primitives = { version = "1.0", default-features = false, features = ["rlp", "serde", "std"] } +alloy-sol-types = "1.0" +risc0-zkvm = { version = "2.1.0", default-features = false, features = ['std'] } e3-compute-provider = { path = "../../../../../../crates/compute-provider" } voting-core = { path = "../../core" } bincode = "1.3.3" diff --git a/examples/CRISP/apps/server/Cargo.lock b/examples/CRISP/apps/server/Cargo.lock index dd6cba7692..093f4dcfa9 100644 --- a/examples/CRISP/apps/server/Cargo.lock +++ b/examples/CRISP/apps/server/Cargo.lock @@ -27,7 +27,7 @@ checksum = "daa239b93927be1ff123eebada5a3ff23e89f0124ccb8609234e5103d5a5ae6d" dependencies = [ "actix-utils", "actix-web", - "derive_more 2.0.1", + "derive_more", "futures-util", "log", "once_cell", @@ -49,7 +49,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "flate2", "foldhash", @@ -164,7 +164,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "foldhash", "futures-core", @@ -222,7 +222,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -260,9 +259,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "18e746cb4cea9ab4cda8cb117717b16c21116004f51efd78968ee0f1ffcf2602" dependencies = [ "alloy-consensus", "alloy-contract", @@ -286,38 +285,45 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.69" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +checksum = "19a9cc9d81ace3da457883b0bdf76776e55f1b84219a9e9d55c27ad308548d3f" dependencies = [ "alloy-primitives", "num_enum", - "strum 0.27.1", + "strum", ] [[package]] name = "alloy-consensus" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "659c33e85c4a9f8bb1b9a2400f4f3d0dd52fbc4bd3650e08d22df1e17d5d92ee" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-trie", + "alloy-tx-macros", "auto_impl", "c-kzg", - "derive_more 1.0.0", + "derive_more", + "either", "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", "serde", + "serde_with", + "thiserror 2.0.12", ] [[package]] name = "alloy-consensus-any" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +checksum = "d48fdc146414932cec2114f749f5f65a8960ee7547b1638a97bb0d04160d09e4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -329,10 +335,11 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +checksum = "c711bfed1579611565ab831166c7bbaf123baea785ea945f02ed3620950f6fe1" dependencies = [ + "alloy-consensus", "alloy-dyn-abi", "alloy-json-abi", "alloy-network", @@ -345,14 +352,15 @@ dependencies = [ "alloy-transport", "futures", "futures-util", + "serde_json", "thiserror 2.0.12", ] [[package]] name = "alloy-core" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +checksum = "5968f48d7a62587cd874bd84034831da4f7f577ce5de984828e376766efc0f32" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -363,26 +371,38 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", "winnow", ] +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.12", +] + [[package]] name = "alloy-eip2930" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -391,52 +411,68 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.4.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more 1.0.0", "k256", "serde", + "thiserror 2.0.12", ] [[package]] name = "alloy-eips" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +checksum = "8390cb5c872d53560635dabc02d616c1bb626dd0f7d6893f8725edb822573fed" dependencies = [ + "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", "alloy-primitives", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", - "derive_more 1.0.0", - "once_cell", + "derive_more", + "either", "serde", "sha2", ] [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "a18ce1538291d8409d4a7d826176d461a6f9eb28632d7185f801bda43a138260" dependencies = [ + "alloy-eips", "alloy-primitives", "alloy-serde", "alloy-trie", "serde", ] +[[package]] +name = "alloy-hardforks" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "977d2492ce210e34baf7b36afaacea272c96fbe6774c47e23f97d14033c0e94f" +dependencies = [ + "alloy-chains", + "alloy-eip2124", + "alloy-primitives", + "auto_impl", + "dyn-clone", +] + [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -446,12 +482,13 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +checksum = "0b91481d12dcd964f4a838271d6abffac2d4082695fc3f73a15429166ea1692d" dependencies = [ "alloy-primitives", "alloy-sol-types", + "http 1.3.1", "serde", "serde_json", "thiserror 2.0.12", @@ -460,9 +497,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "c8b245fa9d76cc9fc58cf78844f2d4e481333449ba679b2044f09b983fc96f85" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -477,6 +514,7 @@ dependencies = [ "alloy-sol-types", "async-trait", "auto_impl", + "derive_more", "futures-utils-wasm", "serde", "serde_json", @@ -485,9 +523,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +checksum = "7cecb975fc2f2e1eb09c513428c34e0d8c13e28b5ff1dbdf68e0f64a1a92c5f3" dependencies = [ "alloy-consensus", "alloy-eips", @@ -498,12 +536,16 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +checksum = "f4131fe12c27e13a99d79bc8e02f9ce4f23f98a6f2e90458fe09992e99e46a9a" dependencies = [ "alloy-genesis", + "alloy-hardforks", + "alloy-network", "alloy-primitives", + "alloy-signer", + "alloy-signer-local", "k256", "rand 0.8.5", "serde_json", @@ -515,24 +557,24 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", "hashbrown 0.15.3", - "indexmap", + "indexmap 2.9.0", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -542,9 +584,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "ecac2cbea1cb3da53b4e68a078e57f9da8d12d86e2017db1240df222e2498397" dependencies = [ "alloy-chains", "alloy-consensus", @@ -557,9 +599,12 @@ dependencies = [ "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-anvil", + "alloy-rpc-types-debug", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", "alloy-signer", - "alloy-signer-local", + "alloy-sol-types", "alloy-transport", "alloy-transport-http", "alloy-transport-ipc", @@ -568,13 +613,14 @@ dependencies = [ "async-trait", "auto_impl", "dashmap", + "either", "futures", "futures-utils-wasm", + "http 1.3.1", "lru", "parking_lot 0.12.4", "pin-project", "reqwest", - "schnellru", "serde", "serde_json", "thiserror 2.0.12", @@ -586,21 +632,23 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" +checksum = "db1d3c2316590910ba697485aa75cdafef89735010d338d197f8af5baa79df92" dependencies = [ "alloy-json-rpc", "alloy-primitives", "alloy-transport", "bimap", "futures", + "parking_lot 0.12.4", "serde", "serde_json", "tokio", "tokio-stream", "tower", "tracing", + "wasmtimer", ] [[package]] @@ -627,9 +675,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +checksum = "e0bed8157038003c702dd1861a6b72d4b1a8f46aeffad35e81580223642170fa" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -638,6 +686,7 @@ dependencies = [ "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", + "async-stream", "futures", "pin-project", "reqwest", @@ -647,28 +696,32 @@ dependencies = [ "tokio-stream", "tower", "tracing", + "tracing-futures", "url", "wasmtimer", ] [[package]] name = "alloy-rpc-types" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +checksum = "82fed036edc62cd79476fe0340277a1c47b07c173f6ac0244f24193e1183b8e4" dependencies = [ "alloy-primitives", + "alloy-rpc-types-anvil", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-anvil" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +checksum = "9f2e3dc925ec6722524f8d7412b9a6845a3350c7037f8a37892ada00c9018125" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -678,36 +731,47 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +checksum = "caf6702dd7eb929068ab075869679e745d68c4eb611c5a0cf72617688b85b5f4" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", "alloy-serde", ] +[[package]] +name = "alloy-rpc-types-debug" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e982f72ff47c0f754cb6aa579e456220d768e1ec07675e66cfce970dad70292" +dependencies = [ + "alloy-primitives", + "serde", +] + [[package]] name = "alloy-rpc-types-engine" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" +checksum = "505224e162e239980c6df7632c99f0bc5abbcf630017502810979e9e01f3c86e" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", - "derive_more 1.0.0", + "derive_more", + "rand 0.8.5", "serde", - "strum 0.26.3", + "strum", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "20ff509ca40537042b7cc9bede6b415ef807c9c5c48024e9fe10b8c8ad0757ef" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -717,17 +781,43 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51dc49d5865f2227c810a416c8d14141db7716a0174bfa6cff1c1a984b678b5e" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c962ec5193084873353ad7a65568056b4e704203302e6ba81374e95a22deba4d" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", ] [[package]] name = "alloy-serde" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +checksum = "f9873512b1e99505f4a65e1d3a3105cb689f112f8e3cab3c632b20a97a46adae" dependencies = [ "alloy-primitives", "serde", @@ -736,13 +826,14 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +checksum = "c2d4d95d8431a11e0daee724c3b7635dc8e9d3d60d0b803023a8125c74a77899" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", + "either", "elliptic-curve", "k256", "thiserror 2.0.12", @@ -750,9 +841,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +checksum = "cb03eca937485b258d8e791d143e95b50dbfae0e18f92e1b1271c38959cd00fb" dependencies = [ "alloy-consensus", "alloy-network", @@ -766,9 +857,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -780,15 +871,15 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck", - "indexmap", + "indexmap 2.9.0", "proc-macro-error2", "proc-macro2", "quote", @@ -799,9 +890,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "alloy-json-abi", "const-hex", @@ -817,9 +908,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -827,27 +918,29 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", "serde", ] [[package]] name = "alloy-transport" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "468a871d7ea52e31ef3abf5ccde612cb3723794f484d26dca6a04a3a776db739" dependencies = [ "alloy-json-rpc", + "alloy-primitives", "base64 0.22.1", - "futures-util", + "derive_more", + "futures", "futures-utils-wasm", + "parking_lot 0.12.4", "serde", "serde_json", "thiserror 2.0.12", @@ -860,9 +953,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "6e969c254b189f7da95f07bab53673dd418f8595abfe3397b2cf8d7ba7955487" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -875,9 +968,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" +checksum = "cb134aaa80c2e1e03eebc101e7c513f08a529726738506d8c306ec9f3c9a7f3b" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -886,6 +979,7 @@ dependencies = [ "futures", "interprocess", "pin-project", + "serde", "serde_json", "tokio", "tokio-util", @@ -894,9 +988,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +checksum = "e57f13346af9441cafa99d5b80d95c2480870dd18bd274464f7131df01ad692a" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -912,20 +1006,33 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more 1.0.0", + "derive_more", "nybbles", "serde", "smallvec", "tracing", ] +[[package]] +name = "alloy-tx-macros" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d642ba58c32547ad9742c613f9849a2aedc47914b02948224326e4cb62b91040" +dependencies = [ + "alloy-primitives", + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -1331,6 +1438,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1438,9 +1561,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "1.0.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" dependencies = [ "blst", "cc", @@ -1478,6 +1601,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -1664,6 +1788,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +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.2" @@ -1766,6 +1905,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -1803,6 +1977,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1816,34 +1991,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -1937,11 +2091,18 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -1971,6 +2132,7 @@ dependencies = [ "eyre", "futures", "futures-util", + "once_cell", "tokio", ] @@ -2007,6 +2169,7 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] @@ -2016,6 +2179,9 @@ name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "elliptic-curve" @@ -2032,6 +2198,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", + "serdect", "subtle", "zeroize", ] @@ -2472,7 +2639,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -2491,13 +2658,19 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -2559,6 +2732,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hmac" version = "0.12.1" @@ -2813,6 +2995,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -2866,6 +3054,17 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.9.0" @@ -3036,6 +3235,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2", ] @@ -3153,9 +3353,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" -version = "0.12.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ "hashbrown 0.15.3", ] @@ -3627,7 +3827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.9.0", ] [[package]] @@ -3928,6 +4128,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -3966,6 +4167,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -4027,6 +4229,26 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "regex" version = "1.11.1" @@ -4310,14 +4532,15 @@ dependencies = [ ] [[package]] -name = "schnellru" -version = "0.2.4" +name = "schemars" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -4336,10 +4559,32 @@ dependencies = [ "der", "generic-array", "pkcs8", + "serdect", "subtle", "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -4446,6 +4691,47 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "schemars", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4597,35 +4883,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - [[package]] name = "strum" version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ - "strum_macros 0.27.1", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", + "strum_macros", ] [[package]] @@ -4671,9 +4935,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", @@ -4913,9 +5177,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" dependencies = [ "futures-util", "log", @@ -4967,7 +5231,7 @@ version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", @@ -5058,6 +5322,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "futures", + "futures-task", + "pin-project", + "tracing", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5066,21 +5342,20 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ - "byteorder", "bytes", "data-encoding", "http 1.3.1", "httparse", "log", - "rand 0.8.5", + "rand 0.9.1", "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.69", + "thiserror 2.0.12", "utf-8", ] diff --git a/examples/CRISP/apps/server/Cargo.toml b/examples/CRISP/apps/server/Cargo.toml index 08d9cc40f6..195466db17 100644 --- a/examples/CRISP/apps/server/Cargo.toml +++ b/examples/CRISP/apps/server/Cargo.toml @@ -26,9 +26,9 @@ tokio = "1.38" futures = "0.3.30" # Cryptography and blockchain -alloy = { version = "0.8.3", features = ["full", "rpc-types-eth"] } -alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } -alloy-sol-types = "0.8" +alloy = { version = "1.0.11", features = ["full", "rpc-types-eth"] } +alloy-primitives = { version = "1.0", default-features = false, features = ["rlp", "serde", "std"] } +alloy-sol-types = "1.0" async-trait = { version = "0.1.88" } fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 8f11bf69ae..0cae7c94d2 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -1,6 +1,6 @@ ############### stage 0: base-dev ############### ARG RUST_VERSION=1.85.0 -ARG RISC0_VERSION=2.0.0 +ARG RISC0_VERSION=2.1.0 ARG SKIP_SOLIDITY=0 FROM rust:${RUST_VERSION}-slim-bullseye AS base-dev diff --git a/examples/CRISP/apps/server/src/cli/main.rs b/examples/CRISP/apps/server/src/cli/main.rs index 6b92124c0e..1ed4ce9fd2 100644 --- a/examples/CRISP/apps/server/src/cli/main.rs +++ b/examples/CRISP/apps/server/src/cli/main.rs @@ -4,10 +4,7 @@ mod config; use dialoguer::{theme::ColorfulTheme, FuzzySelect}; use reqwest::Client; -use commands::{ - activate_e3_round, decrypt_and_publish_result, initialize_crisp_round, - participate_in_existing_round, -}; +use commands::initialize_crisp_round; use config::CONFIG; use crisp::logger::init_logger; use log::info; @@ -38,9 +35,6 @@ struct Cli { enum Commands { /// Initialize new E3 round Init, - - /// Participate in an E3 round - Participate, } #[tokio::main] @@ -59,9 +53,6 @@ pub async fn main() -> Result<(), Box> { Some(Commands::Init) => { initialize_crisp_round().await?; } - Some(Commands::Participate) => { - participate_in_existing_round(&client).await?; - } None => { // Fall back to interactive mode if no command was specified let action = select_action()?; @@ -69,9 +60,6 @@ pub async fn main() -> Result<(), Box> { 0 => { initialize_crisp_round().await?; } - 1 => { - participate_in_existing_round(&client).await?; - } _ => unreachable!(), } } @@ -92,7 +80,7 @@ fn select_environment() -> Result Result> { let selections = &[ "Initialize new E3 round.", - "Participate in an E3 round.", + // "Participate in an E3 round.", // "Activate an E3 round.", // "Decrypt Ciphertext & Publish Results", ]; diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index fa8239d951..aafa250f22 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -38,19 +38,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -60,158 +47,27 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-provider", - "alloy-rpc-client", - "alloy-serde", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum 0.27.1", -] - -[[package]] -name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", "winnow", ] -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -219,63 +75,11 @@ dependencies = [ "serde_json", ] -[[package]] -name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", @@ -283,14 +87,14 @@ dependencies = [ "const-hex", "derive_more 2.0.1", "foldhash", - "hashbrown 0.15.3", + "hashbrown", "indexmap", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -298,149 +102,21 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest 0.12.18", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - [[package]] name = "alloy-rlp" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ - "alloy-rlp-derive", "arrayvec", "bytes", ] -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest 0.12.18", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -452,9 +128,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -470,9 +146,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "const-hex", "dunce", @@ -486,9 +162,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -496,68 +172,16 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", "serde", ] -[[package]] -name = "alloy-transport" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.18", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", - "serde", - "smallvec", - "tracing", -] - [[package]] name = "anstream" version = "0.6.19" @@ -749,9 +373,6 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] [[package]] name = "ascii-canvas" @@ -762,28 +383,6 @@ dependencies = [ "term", ] -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "async-trait" version = "0.1.88" @@ -856,12 +455,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64ct" version = "1.7.3" @@ -959,18 +552,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - [[package]] name = "bs58" version = "0.5.1" @@ -1028,21 +609,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - [[package]] name = "camino" version = "1.1.9" @@ -1408,20 +974,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "data-encoding" version = "2.9.0" @@ -1485,7 +1037,6 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "unicode-xid", ] [[package]] @@ -1590,7 +1141,8 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -1856,7 +1408,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest 0.11.27", + "reqwest", "serde", "serde_json", "syn 2.0.101", @@ -1902,7 +1454,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum 0.26.3", + "strum", "syn 2.0.101", "tempfile", "thiserror 1.0.69", @@ -1918,7 +1470,7 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest 0.11.27", + "reqwest", "semver 1.0.26", "serde", "serde_json", @@ -1943,7 +1495,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest 0.11.27", + "reqwest", "serde", "serde_json", "thiserror 1.0.69", @@ -1970,12 +1522,12 @@ dependencies = [ "futures-timer", "futures-util", "hashers", - "http 0.2.12", + "http", "instant", "jsonwebtoken", "once_cell", "pin-project", - "reqwest 0.11.27", + "reqwest", "serde", "serde_json", "thiserror 1.0.69", @@ -2201,21 +1753,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[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" @@ -2350,12 +1887,6 @@ dependencies = [ "slab", ] -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - [[package]] name = "fxhash" version = "0.2.1" @@ -2447,7 +1978,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 0.2.12", + "http", "indexmap", "slab", "tokio", @@ -2455,26 +1986,12 @@ dependencies = [ "tracing", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ - "allocator-api2", - "equivalent", "foldhash", "serde", ] @@ -2538,17 +2055,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http-body" version = "0.4.6" @@ -2556,30 +2062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.3.1", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", + "http", "pin-project-lite", ] @@ -2606,35 +2089,16 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 0.2.12", - "http-body 0.4.6", + "http", + "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", + "socket2", "tokio", + "tower-service", + "tracing", "want", ] @@ -2645,53 +2109,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http 0.2.12", - "hyper 0.14.32", + "http", + "hyper", "rustls", "tokio", "tokio-rustls", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.6.0", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - [[package]] name = "icu_collections" version = "2.0.0" @@ -2850,7 +2274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown", "serde", ] @@ -2878,16 +2302,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -3101,15 +2515,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "macro-string" version = "0.1.4" @@ -3189,23 +2594,6 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndarray" version = "0.15.6" @@ -3354,19 +2742,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - [[package]] name = "object" version = "0.36.7" @@ -3413,50 +2788,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "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.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -3909,7 +3240,6 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", - "serde", ] [[package]] @@ -3920,6 +3250,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -3958,6 +3289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -4056,9 +3388,9 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", + "http", + "http-body", + "hyper", "hyper-rustls", "ipnet", "js-sys", @@ -4072,7 +3404,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper", "system-configuration", "tokio", "tokio-rustls", @@ -4085,45 +3417,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "reqwest" -version = "0.12.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.6.0", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -4297,15 +3590,6 @@ dependencies = [ "base64 0.21.7", ] -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - [[package]] name = "rustls-webpki" version = "0.101.7" @@ -4382,26 +3666,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -4444,29 +3708,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.11.0" @@ -4649,9 +3890,6 @@ name = "smallvec" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] [[package]] name = "socket2" @@ -4735,16 +3973,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", + "strum_macros", ] [[package]] @@ -4760,19 +3989,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - [[package]] name = "subtle" version = "2.6.1" @@ -4789,7 +4005,7 @@ dependencies = [ "fs2", "hex", "once_cell", - "reqwest 0.11.27", + "reqwest", "semver 1.0.26", "serde", "serde_json", @@ -4823,9 +4039,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", @@ -4839,15 +4055,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - [[package]] name = "synstructure" version = "0.13.2" @@ -4950,15 +4157,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "time" version = "0.3.41" @@ -5036,31 +4234,9 @@ dependencies = [ "mio", "pin-project-lite", "socket2", - "tokio-macros", "windows-sys 0.52.0", ] -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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-rustls" version = "0.24.1" @@ -5071,18 +4247,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - [[package]] name = "tokio-tungstenite" version = "0.20.1" @@ -5152,45 +4316,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - [[package]] name = "tower-service" version = "0.3.3" @@ -5253,7 +4378,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 0.2.12", + "http", "httparse", "log", "rand 0.8.5", @@ -5369,12 +4494,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[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.5" @@ -5519,20 +4638,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - [[package]] name = "web-sys" version = "0.3.77" diff --git a/examples/CRISP/lib/risc0-ethereum b/examples/CRISP/lib/risc0-ethereum index 38591d7a13..c09ee29b38 160000 --- a/examples/CRISP/lib/risc0-ethereum +++ b/examples/CRISP/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit 38591d7a1302d437b76937bd3e0432005b33f616 +Subproject commit c09ee29b386d2b1486724509868d1115db36929f diff --git a/templates/default/lib/risc0-ethereum b/templates/default/lib/risc0-ethereum index 63a5dbe2dd..c09ee29b38 160000 --- a/templates/default/lib/risc0-ethereum +++ b/templates/default/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit 63a5dbe2dd168065c7cf1b803cb01eff16904ef4 +Subproject commit c09ee29b386d2b1486724509868d1115db36929f From adab2cb40baaa03952b9e565e83a8b4a7b5135b0 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:14:20 +0500 Subject: [PATCH 080/106] Update Commit ID for Support (#525) --- crates/support/Cargo.lock | 1204 ++++------- crates/support/Cargo.toml | 6 +- crates/support/host/Cargo.toml | 2 +- crates/support/methods/guest/Cargo.lock | 2528 +++++------------------ crates/support/methods/guest/Cargo.toml | 2 +- crates/support/program/Cargo.toml | 4 +- 6 files changed, 973 insertions(+), 2773 deletions(-) diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index 10c71ef180..91fd95040e 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -34,7 +34,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "flate2", "foldhash", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -149,7 +149,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "foldhash", "futures-core", @@ -182,7 +182,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -196,9 +196,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" @@ -207,7 +207,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -245,47 +244,31 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-core", - "alloy-eips 0.8.3", - "alloy-genesis 0.8.3", - "alloy-provider 0.8.3", - "alloy-rpc-client 0.8.3", - "alloy-serde 0.8.3", - "alloy-transport-http 0.8.3", -] - -[[package]] -name = "alloy" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4ae82946772d69f868b9ef81fc66acb1b149ef9b4601849bec4bcf5da6552e" +checksum = "2b064bd1cea105e70557a258cd2b317731896753ec08edf51da2d1fced587b05" dependencies = [ - "alloy-consensus 0.12.6", + "alloy-consensus", "alloy-contract", "alloy-core", - "alloy-eips 0.12.6", - "alloy-genesis 0.12.6", - "alloy-network 0.12.6", - "alloy-provider 0.12.6", - "alloy-rpc-client 0.12.6", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", + "alloy-serde", + "alloy-signer", "alloy-signer-local", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", ] [[package]] name = "alloy-chains" -version = "0.1.69" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +checksum = "19a9cc9d81ace3da457883b0bdf76776e55f1b84219a9e9d55c27ad308548d3f" dependencies = [ "alloy-primitives", "num_enum", @@ -294,39 +277,23 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbf458101ed6c389e9bb70a34ebc56039868ad10472540614816cdedc8f5265" +checksum = "32c3f3bc4f2a6b725970cd354e78e9738ea1e8961a91898f57bf6317970b1915" dependencies = [ - "alloy-eips 0.12.6", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-trie", "auto_impl", "c-kzg", - "derive_more 2.0.1", + "derive_more", "either", "k256", "once_cell", "rand 0.8.5", + "secp256k1", "serde", "serde_with", "thiserror 2.0.12", @@ -334,48 +301,34 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc982af629e511292310fe85b433427fd38cb3105147632b574abc997db44c91" +checksum = "dda014fb5591b8d8d24cab30f52690117d238e52254c6fb40658e91ea2ccd6c3" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] [[package]] name = "alloy-contract" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0a0c1ddee20ecc14308aae21c2438c994df7b39010c26d70f86e1d8fdb8db0" +checksum = "9668ce1176f0b87a5e5fc805b3d198954f495de2e99b70a44bed691ba2b0a9d8" dependencies = [ - "alloy-consensus 0.12.6", + "alloy-consensus", "alloy-dyn-abi", "alloy-json-abi", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-network", + "alloy-network-primitives", "alloy-primitives", - "alloy-provider 0.12.6", - "alloy-rpc-types-eth 0.12.6", + "alloy-provider", + "alloy-rpc-types-eth", "alloy-sol-types", - "alloy-transport 0.12.6", + "alloy-transport", "futures", "futures-util", "thiserror 2.0.12", @@ -383,9 +336,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +checksum = "5968f48d7a62587cd874bd84034831da4f7f577ce5de984828e376766efc0f32" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -396,15 +349,14 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", @@ -413,9 +365,9 @@ dependencies = [ [[package]] name = "alloy-eip2124" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -426,32 +378,20 @@ dependencies = [ [[package]] name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -461,73 +401,42 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702 0.4.2", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-eips" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e86967eb559920e4b9102e4cb825fe30f2e9467988353ce4809f0d3f2c90cd4" +checksum = "2f7b2f7010581f29bcace81776cf2f0e022008d05a7d326884763f16f3044620" dependencies = [ "alloy-eip2124", "alloy-eip2930", - "alloy-eip7702 0.5.1", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "auto_impl", "c-kzg", - "derive_more 2.0.1", + "derive_more", "either", - "once_cell", "serde", "sha2", ] [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "c7f723856b1c4ad5473f065650ab9be557c96fbc77e89180fbdac003e904a8d6" dependencies = [ + "alloy-eips", "alloy-primitives", - "alloy-serde 0.8.3", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-genesis" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40de6f5b53ecf5fd7756072942f41335426d9a3704cd961f77d854739933bcf" -dependencies = [ - "alloy-eips 0.12.6", - "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-trie", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -537,23 +446,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27434beae2514d4a2aa90f53832cbdf6f23e4b5e2656d95eaf15f9276e2418b6" +checksum = "ca1e31b50f4ed9a83689ae97263d366b15b935a67c4acb5dd46d5b1c3b27e8e6" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -565,49 +460,24 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network-primitives 0.8.3", - "alloy-primitives", - "alloy-rpc-types-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", - "alloy-signer 0.8.3", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a33a38c7486b1945f8d093ff027add2f3a8f83c7300dbad6165cc49150085e" +checksum = "879afc0f4a528908c8fe6935b2ab0bc07f77221a989186f71583f7592831689e" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", "alloy-primitives", - "alloy-rpc-types-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", - "alloy-signer 0.12.6", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", "alloy-sol-types", "async-trait", "auto_impl", - "derive_more 2.0.1", + "derive_more", "futures-utils-wasm", "serde", "serde_json", @@ -616,50 +486,37 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-primitives", - "alloy-serde 0.8.3", - "serde", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db973a7a23cbe96f2958e5687c51ce2d304b5c6d0dc5ccb3de8667ad8476f50b" +checksum = "ec185bac9d32df79c1132558a450d48f6db0bfb5adef417dbb1a0258153f879b" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", + "alloy-consensus", + "alloy-eips", "alloy-primitives", - "alloy-serde 0.12.6", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "indexmap 2.9.0", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -669,66 +526,31 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus 0.8.3", - "alloy-eips 0.8.3", - "alloy-json-rpc 0.8.3", - "alloy-network 0.8.3", - "alloy-network-primitives 0.8.3", - "alloy-primitives", - "alloy-rpc-client 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru 0.12.5", - "parking_lot", - "pin-project", - "reqwest", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-provider" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b03bde77ad73feae14aa593bcabb932c8098c0f0750ead973331cfc0003a4e1" +checksum = "b2d918534afe9cc050eabd8309c107dafd161aa77357782eca4f218bef08a660" dependencies = [ "alloy-chains", - "alloy-consensus 0.12.6", - "alloy-eips 0.12.6", - "alloy-json-rpc 0.12.6", - "alloy-network 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", "alloy-primitives", - "alloy-rpc-client 0.12.6", - "alloy-rpc-types-eth 0.12.6", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-signer", "alloy-sol-types", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", "async-stream", "async-trait", "auto_impl", "dashmap", + "either", "futures", "futures-utils-wasm", - "lru 0.13.0", + "lru", "parking_lot", "pin-project", "reqwest", @@ -760,42 +582,19 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc 0.8.3", - "alloy-primitives", - "alloy-transport 0.8.3", - "alloy-transport-http 0.8.3", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", + "syn 2.0.103", ] [[package]] name = "alloy-rpc-client" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445a3298c14fae7afb5b9f2f735dead989f3dd83020c2ab8e48ed95d7b6d1acb" +checksum = "a15e30dcada47c04820b64f63de2423506c5c74f9ab59b115277ef5ad595a6fc" dependencies = [ - "alloy-json-rpc 0.12.6", + "alloy-json-rpc", "alloy-primitives", - "alloy-transport 0.12.6", - "alloy-transport-http 0.12.6", + "alloy-transport", + "alloy-transport-http", "async-stream", "futures", "pin-project", @@ -813,71 +612,40 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157deaec6ba2ad7854f16146e4cd60280e76593eed79fdcb06e0fa8b6c60f77" +checksum = "4aa10e26554ad7f79a539a6a8851573aedec5289f1f03244aad0bdbc324bfe5c" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", + "alloy-rpc-types-eth", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any 0.8.3", - "alloy-rpc-types-eth 0.8.3", - "alloy-serde 0.8.3", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604dea1f00fd646debe8033abe8e767c732868bf8a5ae9df6321909ccbc99c56" -dependencies = [ - "alloy-consensus-any 0.12.6", - "alloy-rpc-types-eth 0.12.6", - "alloy-serde 0.12.6", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "7a5a8f1efd77116915dad61092f9ef9295accd0b0b251062390d9c4e81599344" dependencies = [ - "alloy-consensus 0.8.3", - "alloy-consensus-any 0.8.3", - "alloy-eips 0.8.3", - "alloy-network-primitives 0.8.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.8.3", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e13d71eac04513a71af4b3df580f52f2b4dcbff9d971cc9a52519acf55514cb" +checksum = "bc1323310d87f9d950fb3ff58d943fdf832f5e10e6f902f405c0eaa954ffbaf1" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-consensus-any 0.12.6", - "alloy-eips 0.12.6", - "alloy-network-primitives 0.12.6", + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.12.6", + "alloy-serde", "alloy-sol-types", "itertools 0.14.0", "serde", @@ -887,20 +655,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1cd73fc054de6353c7f22ff9b846b0f0f145cd0112da07d4119e41e9959207" +checksum = "d05ace2ef3da874544c3ffacfd73261cdb1405d8631765deb991436a53ec6069" dependencies = [ "alloy-primitives", "serde", @@ -909,23 +666,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-signer" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96fbde54bee943cd94ebacc8a62c50b38c7dfd2552dcd79ff61aea778b1bfcc" +checksum = "67fdabad99ad3c71384867374c60bcd311fc1bb90ea87f5f9c779fd8c7ec36aa" dependencies = [ "alloy-primitives", "async-trait", @@ -938,14 +681,14 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6e72002cc1801d8b41e9892165e3a6551b7bd382bd9d0414b21e90c0c62551" +checksum = "acb3f4e72378566b189624d54618c8adf07afbcf39d5f368f4486e35a66725b3" dependencies = [ - "alloy-consensus 0.12.6", - "alloy-network 0.12.6", + "alloy-consensus", + "alloy-network", "alloy-primitives", - "alloy-signer 0.12.6", + "alloy-signer", "async-trait", "k256", "rand 0.8.5", @@ -954,23 +697,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -980,16 +723,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "alloy-json-abi", "const-hex", @@ -999,15 +742,15 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.101", + "syn 2.0.103", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -1015,46 +758,26 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", "serde", ] [[package]] name = "alloy-transport" -version = "0.8.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "6964d85cd986cfc015b96887b89beed9e06d0d015b75ee2b7bfbd64341aab874" dependencies = [ - "alloy-json-rpc 0.8.3", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec325c2af8562ef355c02aeb527c755a07e9d8cf6a1e65dda8d0bf23e29b2c" -dependencies = [ - "alloy-json-rpc 0.12.6", + "alloy-json-rpc", + "alloy-primitives", "base64", - "derive_more 2.0.1", + "derive_more", "futures", "futures-utils-wasm", "parking_lot", @@ -1070,27 +793,12 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc 0.8.3", - "alloy-transport 0.8.3", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.12.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a082c9473c6642cce8b02405a979496126a03b096997888e86229afad05db06c" +checksum = "ef7c5ea7bda4497abe4ea92dcb8c76e9f052c178f3c82aa6976bcb264675f73c" dependencies = [ - "alloy-json-rpc 0.12.6", - "alloy-transport 0.12.6", + "alloy-json-rpc", + "alloy-transport", "reqwest", "serde_json", "tower", @@ -1100,14 +808,14 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more 1.0.0", + "derive_more", "nybbles", "serde", "smallvec", @@ -1131,9 +839,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -1146,33 +854,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -1238,7 +946,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1271,7 +979,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "itertools 0.13.0", "num-bigint", "num-integer", @@ -1364,7 +1072,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1402,7 +1110,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1445,7 +1153,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] @@ -1531,7 +1239,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1610,7 +1318,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1621,7 +1329,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1638,14 +1346,14 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" @@ -1676,9 +1384,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bincode" @@ -1704,6 +1412,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1754,9 +1478,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -1797,7 +1521,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1823,9 +1547,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byte-slice-cast" @@ -1835,9 +1559,9 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" dependencies = [ "bytemuck_derive", ] @@ -1850,7 +1574,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1879,9 +1603,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "1.0.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" dependencies = [ "blst", "cc", @@ -1894,9 +1618,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" dependencies = [ "serde", ] @@ -1926,9 +1650,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.25" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "jobserver", "libc", @@ -1937,9 +1661,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -1968,9 +1692,9 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "const-hex" @@ -2156,7 +1880,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2167,7 +1891,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2233,7 +1957,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2243,16 +1967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.101", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", + "syn 2.0.103", ] [[package]] @@ -2261,19 +1976,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -2284,7 +1987,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "unicode-xid", ] @@ -2338,7 +2041,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2375,12 +2078,19 @@ dependencies = [ "proc-macro-error", ] +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave?rev=1bf6340#1bf6340124ac2ef8ce6d409307d5455ef68ed8ab" dependencies = [ - "alloy 0.8.3", + "alloy-dyn-abi", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -2388,7 +2098,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave?rev=1bf6340#1bf6340124ac2ef8ce6d409307d5455ef68ed8ab" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -2487,7 +2197,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2563,7 +2273,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2735,9 +2445,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -2782,7 +2492,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2868,7 +2578,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -2927,7 +2637,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -3032,9 +2742,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -3065,9 +2775,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -3078,6 +2788,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex-literal" version = "0.4.1" @@ -3172,9 +2891,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.6" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", "hyper", @@ -3205,9 +2924,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ "base64", "bytes", @@ -3389,7 +3108,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3416,7 +3135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "serde", ] @@ -3486,9 +3205,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" dependencies = [ "jiff-static", "log", @@ -3499,13 +3218,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3587,7 +3306,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3605,14 +3324,14 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libm" @@ -3687,22 +3406,13 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "lru" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] @@ -3719,7 +3429,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3758,14 +3468,14 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "merlin" @@ -3815,9 +3525,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -3830,7 +3540,7 @@ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -4010,7 +3720,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4079,7 +3789,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4137,7 +3847,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4177,9 +3887,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", "thiserror 2.0.12", @@ -4213,7 +3923,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4246,9 +3956,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -4297,12 +4007,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4379,7 +4089,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4393,17 +4103,17 @@ dependencies = [ [[package]] name = "proptest" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", "bitflags 2.9.1", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.1", + "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -4448,7 +4158,7 @@ dependencies = [ "prost 0.12.6", "prost-types", "regex", - "syn 2.0.101", + "syn 2.0.103", "tempfile", ] @@ -4462,7 +4172,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4475,7 +4185,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4559,9 +4269,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -4589,6 +4299,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -4627,15 +4338,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.9.3", ] [[package]] @@ -4666,9 +4378,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags 2.9.1", ] @@ -4684,6 +4396,26 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.103", +] + [[package]] name = "regex" version = "1.11.1" @@ -4736,9 +4468,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.19" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", @@ -4754,12 +4486,10 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", @@ -4816,7 +4546,7 @@ checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" dependencies = [ "anyhow", "borsh", - "derive_more 2.0.1", + "derive_more", "elf", "lazy_static", "postcard", @@ -4829,9 +4559,9 @@ dependencies = [ [[package]] name = "risc0-build" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" +checksum = "d17d6657b1fb615c0482bd4b57aae7850911ed7dbdc8e783df20e93f33209a8f" dependencies = [ "anyhow", "cargo_metadata", @@ -4853,8 +4583,8 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +version = "2.1.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" dependencies = [ "anyhow", "bytemuck", @@ -4866,9 +4596,9 @@ dependencies = [ [[package]] name = "risc0-circuit-keccak" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +checksum = "8d339c65b0e011677404bd6bdfe1b0f29748187a568fb2f74df7fb650590181a" dependencies = [ "anyhow", "bytemuck", @@ -4882,9 +4612,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +checksum = "8c6501fd3936aea2dd3e55915f34328fe96e6ca25ef00320242f837ae668785b" dependencies = [ "anyhow", "bytemuck", @@ -4897,14 +4627,14 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +checksum = "c80e0a8f0f56106295bb682dbc27093438e163a5f6384a79e877ab895a11d9ae" dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more 2.0.1", + "derive_more", "paste", "risc0-binfmt", "risc0-core", @@ -4926,10 +4656,10 @@ dependencies = [ [[package]] name = "risc0-ethereum-contracts" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.0.0#38591d7a1302d437b76937bd3e0432005b33f616" +version = "2.1.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" dependencies = [ - "alloy 0.12.6", + "alloy", "alloy-sol-types", "anyhow", "cfg-if", @@ -4996,9 +4726,9 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +checksum = "0f1014d2efcb3b359aff878c9aeb6aa949a6d91f091a2ffb5ffd8d928a1ab7f3" dependencies = [ "anyhow", "bincode", @@ -5006,7 +4736,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "derive_more 2.0.1", + "derive_more", "getrandom 0.2.16", "hex", "lazy-regex", @@ -5100,9 +4830,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -5149,9 +4879,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "once_cell", "ring", @@ -5231,14 +4961,15 @@ dependencies = [ ] [[package]] -name = "schnellru" -version = "0.2.4" +name = "schemars" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -5262,6 +4993,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -5329,7 +5081,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5346,9 +5098,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -5367,15 +5119,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.9.0", + "schemars", "serde", "serde_derive", "serde_json", @@ -5385,14 +5138,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5483,18 +5236,15 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -5532,7 +5282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5581,7 +5331,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5594,7 +5344,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5616,9 +5366,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" dependencies = [ "proc-macro2", "quote", @@ -5627,14 +5377,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5654,7 +5404,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5723,7 +5473,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5734,17 +5484,16 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -5847,7 +5596,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5897,9 +5646,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -5909,18 +5658,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.9.0", "serde", @@ -5932,9 +5681,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" @@ -5953,9 +5702,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags 2.9.1", "bytes", @@ -5995,20 +5744,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -6179,9 +5928,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -6214,7 +5963,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "wasm-bindgen-shared", ] @@ -6249,7 +5998,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6278,9 +6027,9 @@ dependencies = [ [[package]] name = "wasmtimer" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446" dependencies = [ "futures", "js-sys", @@ -6351,7 +6100,7 @@ dependencies = [ "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.2", + "windows-strings", ] [[package]] @@ -6362,7 +6111,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -6373,24 +6122,24 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" dependencies = [ + "windows-link", "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] @@ -6402,15 +6151,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-strings" version = "0.4.2" @@ -6471,29 +6211,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6506,12 +6230,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6524,12 +6242,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6542,24 +6254,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6572,12 +6272,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6590,12 +6284,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6608,12 +6296,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -6626,17 +6308,11 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] @@ -6696,28 +6372,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -6737,7 +6413,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "synstructure", ] @@ -6758,7 +6434,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -6791,7 +6467,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 7c827a82a0..8a7860070e 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -13,12 +13,12 @@ e3-support-host = { path = "./host" } e3-user-program = { path = "./program" } e3-support-types = { path = "./types" } methods = { path = "./methods" } -alloy-primitives = { version = "0.8", default-features = false, features = [ +alloy-primitives = { version = "1.0", default-features = false, features = [ "rlp", "serde", "std", ]} -alloy-sol-types = { version = "0.8" } +alloy-sol-types = { version = "1.0" } anyhow = { version = "1.0.86" } actix-web = "4.10.2" bincode = { version = "1.3.3" } @@ -37,7 +37,7 @@ serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/crates/support/host/Cargo.toml b/crates/support/host/Cargo.toml index 38a7b4169d..e0ead4ef0b 100644 --- a/crates/support/host/Cargo.toml +++ b/crates/support/host/Cargo.toml @@ -15,7 +15,7 @@ methods = { workspace = true } risc0-ethereum-contracts = { workspace = true } risc0-zkvm = { workspace = true } tokio = { workspace = true } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } diff --git a/crates/support/methods/guest/Cargo.lock b/crates/support/methods/guest/Cargo.lock index 0bf043a9cf..ae2ef0abe2 100644 --- a/crates/support/methods/guest/Cargo.lock +++ b/crates/support/methods/guest/Cargo.lock @@ -2,29 +2,13 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -45,145 +29,20 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-provider", - "alloy-rpc-client", - "alloy-serde", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", + "alloy-json-abi 1.2.0", + "alloy-primitives 1.2.0", + "alloy-sol-type-parser 1.2.0", + "alloy-sol-types 1.2.0", "itoa", "serde", "serde_json", - "winnow 0.7.10", -] - -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", + "winnow", ] [[package]] @@ -192,62 +51,22 @@ version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", + "alloy-primitives 0.8.25", + "alloy-sol-type-parser 0.8.25", "serde", "serde_json", - "thiserror 2.0.12", - "tracing", ] [[package]] -name = "alloy-network" -version = "0.8.3" +name = "alloy-json-abi" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", + "alloy-primitives 1.2.0", + "alloy-sol-type-parser 1.2.0", "serde", "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", ] [[package]] @@ -260,16 +79,16 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "indexmap", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand", + "rand 0.8.5", "ruint", "rustc-hash", "serde", @@ -278,40 +97,30 @@ dependencies = [ ] [[package]] -name = "alloy-provider" -version = "0.8.3" +name = "alloy-primitives" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest", - "schnellru", + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash", + "hashbrown 0.15.4", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.1", + "ruint", + "rustc-hash", "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", + "sha3", + "tiny-keccak", ] [[package]] @@ -320,130 +129,71 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ - "alloy-rlp-derive", "arrayvec", "bytes", ] [[package]] -name = "alloy-rlp-derive" -version = "0.3.12" +name = "alloy-sol-macro" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" dependencies = [ + "alloy-sol-macro-expander 0.8.25", + "alloy-sol-macro-input 0.8.25", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", + "syn 2.0.103", ] [[package]] -name = "alloy-signer" -version = "0.8.3" +name = "alloy-sol-macro" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", + "alloy-sol-macro-expander 1.2.0", + "alloy-sol-macro-input 1.2.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.103", ] [[package]] -name = "alloy-sol-macro" +name = "alloy-sol-macro-expander" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", + "alloy-sol-macro-input 0.8.25", + "const-hex", + "heck", + "indexmap", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", + "syn-solidity 0.8.25", + "tiny-keccak", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ - "alloy-sol-macro-input", + "alloy-sol-macro-input 1.2.0", "const-hex", "heck", "indexmap", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", - "syn-solidity", + "syn 2.0.103", + "syn-solidity 1.2.0", "tiny-keccak", ] @@ -459,89 +209,76 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.98", - "syn-solidity", + "syn 2.0.103", + "syn-solidity 0.8.25", ] [[package]] -name = "alloy-sol-type-parser" -version = "0.8.25" +name = "alloy-sol-macro-input" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ - "serde", - "winnow 0.7.10", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.103", + "syn-solidity 1.2.0", ] [[package]] -name = "alloy-sol-types" +name = "alloy-sol-type-parser" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", "serde", + "winnow", ] [[package]] -name = "alloy-transport" -version = "0.8.3" +name = "alloy-sol-type-parser" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ - "alloy-json-rpc", - "base64", - "futures-util", - "futures-utils-wasm", "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower 0.5.2", - "tracing", - "url", - "wasmtimer", + "winnow", ] [[package]] -name = "alloy-transport-http" -version = "0.8.3" +name = "alloy-sol-types" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower 0.5.2", - "tracing", - "url", + "alloy-json-abi 0.8.25", + "alloy-primitives 0.8.25", + "alloy-sol-macro 0.8.25", + "const-hex", + "serde", ] [[package]] -name = "alloy-trie" -version = "0.7.9" +name = "alloy-sol-types" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", + "alloy-json-abi 1.2.0", + "alloy-primitives 1.2.0", + "alloy-sol-macro 1.2.0", "serde", - "smallvec", - "tracing", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "ark-bn254" @@ -596,7 +333,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -629,7 +366,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "itertools 0.13.0", "num-bigint", "num-integer", @@ -671,7 +408,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -722,7 +459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -760,7 +497,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -803,7 +540,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -889,7 +626,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -911,7 +648,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -921,7 +658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -931,82 +668,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "async-trait" -version = "0.1.88" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.75" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base16ct" @@ -1014,17 +700,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bincode" @@ -1058,9 +738,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -1098,23 +778,11 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - [[package]] name = "borsh" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1122,34 +790,28 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" dependencies = [ "bytemuck_derive", ] @@ -1162,7 +824,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -1173,42 +835,27 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - [[package]] name = "cc" -version = "1.2.23" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -1241,6 +888,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1270,18 +937,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1298,15 +965,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1315,7 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -1330,25 +997,11 @@ dependencies = [ "typenum", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -1365,34 +1018,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -1403,7 +1035,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", "unicode-xid", ] @@ -1428,17 +1060,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "doc-comment" version = "0.3.3" @@ -1453,16 +1074,17 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave?rev=1bf6340#1bf6340124ac2ef8ce6d409307d5455ef68ed8ab" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives 1.2.0", "fhe", "fhe-traits", ] @@ -1470,7 +1092,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave?rev=1bf6340#1bf6340124ac2ef8ce6d409307d5455ef68ed8ab" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -1517,14 +1139,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] name = "either" -version = "1.12.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elf" @@ -1545,7 +1167,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -1580,36 +1202,36 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "ethnum" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -1635,11 +1257,11 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1658,10 +1280,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", - "thiserror 1.0.61", + "thiserror 1.0.69", "zeroize", "zeroize_derive", ] @@ -1681,10 +1303,10 @@ dependencies = [ "num-traits", "prost", "prost-build", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "sha2", - "thiserror 1.0.61", + "thiserror 1.0.69", "zeroize", ] @@ -1693,7 +1315,7 @@ name = "fhe-traits" version = "0.1.0-beta.7" source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -1705,7 +1327,7 @@ dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand", + "rand 0.8.5", "rayon", ] @@ -1716,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -1739,15 +1361,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -1755,7 +1368,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -1766,131 +1379,21 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - [[package]] name = "generic-array" version = "0.14.7" @@ -1904,26 +1407,26 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] [[package]] name = "group" @@ -1932,7 +1435,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1940,8 +1443,8 @@ dependencies = [ name = "guests" version = "0.1.0" dependencies = [ - "alloy-primitives", - "alloy-sol-types", + "alloy-primitives 0.8.25", + "alloy-sol-types 0.8.25", "anyhow", "bincode", "e3-compute-provider", @@ -1960,15 +1463,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -1982,12 +1479,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[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" @@ -2013,403 +1504,160 @@ dependencies = [ ] [[package]] -name = "http" -version = "1.3.1" +name = "impl-codec" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "bytes", - "fnv", - "itoa", + "parity-scale-codec", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "impl-trait-for-tuples" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ - "bytes", - "http", + "proc-macro2", + "quote", + "syn 2.0.103", ] [[package]] -name = "http-body-util" -version = "0.1.3" +name = "include_bytes_aligned" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" [[package]] -name = "httparse" -version = "1.10.1" +name = "indexmap" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.4", + "serde", +] [[package]] -name = "hyper" -version = "1.6.0" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", + "either", ] [[package]] -name = "hyper-tls" -version = "0.6.0" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", + "either", ] [[package]] -name = "hyper-util" -version = "0.1.7" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower 0.4.13", - "tower-service", - "tracing", + "either", ] [[package]] -name = "icu_collections" -version = "2.0.0" +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "k256" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "keccak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "cpufeatures", ] [[package]] -name = "icu_normalizer" -version = "2.0.0" +name = "keccak-asm" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", + "digest 0.10.7", + "sha3-asm", ] [[package]] -name = "icu_normalizer_data" -version = "2.0.0" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] -name = "icu_properties" -version = "2.0.1" +name = "lean-imt" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", + "hashbrown 0.15.4", ] [[package]] -name = "icu_properties_data" -version = "2.0.1" +name = "libc" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] -name = "icu_provider" -version = "2.0.0" +name = "libm" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] -name = "idna" -version = "1.0.3" +name = "light-poseidon" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint", + "thiserror 1.0.69", ] [[package]] -name = "idna_adapter" -version = "1.2.1" +name = "linux-raw-sys" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] -name = "impl-codec" -version = "0.6.0" +name = "log" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "lean-imt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" -dependencies = [ - "hashbrown 0.15.2", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "num-bigint", - "thiserror 1.0.61", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.2", -] +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "macro-string" @@ -2419,7 +1667,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -2433,9 +1681,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -2443,9 +1691,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "merlin" @@ -2455,7 +1703,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core", + "rand_core 0.6.4", "zeroize", ] @@ -2465,63 +1713,20 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "block", "core-graphics-types", - "foreign-types 0.5.0", + "foreign-types", "log", "objc", "paste", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.59.0", -] - [[package]] name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - -[[package]] -name = "native-tls" -version = "0.2.14" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "ndarray" @@ -2578,7 +1783,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "serde", "smallvec", ] @@ -2633,49 +1838,6 @@ dependencies = [ "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 = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - [[package]] name = "objc" version = "0.2.7" @@ -2685,112 +1847,38 @@ dependencies = [ "malloc_buf", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.5.0", - "cfg-if", - "foreign-types 0.3.2", - "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.98", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", + "syn 2.0.103", ] [[package]] @@ -2799,20 +1887,14 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[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.10" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 1.0.61", + "thiserror 2.0.12", "ucd-trie", ] @@ -2826,37 +1908,11 @@ dependencies = [ "indexmap", ] -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkcs8" @@ -2868,12 +1924,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "postcard" version = "1.1.1" @@ -2887,28 +1937,22 @@ dependencies = [ ] [[package]] -name = "potential_utf" -version = "0.1.2" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerovec", + "zerocopy", ] -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -2919,7 +1963,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand", + "rand 0.8.5", ] [[package]] @@ -2935,9 +1979,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] @@ -2961,31 +2005,31 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags 2.9.1", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.9.1", + "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -3020,7 +2064,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.98", + "syn 2.0.103", "tempfile", ] @@ -3034,7 +2078,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -3054,13 +2098,19 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "radium" version = "0.7.0" @@ -3074,8 +2124,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", "serde", ] @@ -3086,7 +2147,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -3095,16 +2166,26 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", + "serde", ] [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -3133,20 +2214,11 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.5.0", -] - [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -3156,9 +2228,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3167,48 +2239,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.9" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rfc6979" @@ -3222,28 +2255,28 @@ dependencies = [ [[package]] name = "risc0-binfmt" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f147f96a8a3058e699a5d39fc7e59d982f633751543ff4437cc0fb21f40b2e0" +checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" dependencies = [ "anyhow", "borsh", - "derive_more 2.0.1", + "derive_more", "elf", "lazy_static", "postcard", "risc0-zkp", "risc0-zkvm-platform", - "semver 1.0.23", + "semver 1.0.26", "serde", "tracing", ] [[package]] name = "risc0-circuit-keccak" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6af6fc80443a05d9e8e25aeba78082fc58e8a3c6a6b92017cae0a404494ba9" +checksum = "8d339c65b0e011677404bd6bdfe1b0f29748187a568fb2f74df7fb650590181a" dependencies = [ "anyhow", "bytemuck", @@ -3257,9 +2290,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7bdd11df4ed470b3c032ac4c5bfb2729f6151af33ee255b66169de0c35611e" +checksum = "8c6501fd3936aea2dd3e55915f34328fe96e6ca25ef00320242f837ae668785b" dependencies = [ "anyhow", "bytemuck", @@ -3272,14 +2305,14 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "2.0.2" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c98a4d9e438aac2e661b8376f6dd48b17a0949b29dbb0aed6e88e62de0bd5940" +checksum = "c80e0a8f0f56106295bb682dbc27093438e163a5f6384a79e877ab895a11d9ae" dependencies = [ "anyhow", "bit-vec", "bytemuck", - "derive_more 2.0.1", + "derive_more", "paste", "risc0-binfmt", "risc0-core", @@ -3296,14 +2329,14 @@ checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" dependencies = [ "bytemuck", "bytemuck_derive", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "risc0-groth16" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a800c55717c52f764325bdb18a164843d417a4c8c8a123b7d4206705c11a54c3" +checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -3322,9 +2355,9 @@ dependencies = [ [[package]] name = "risc0-zkos-v1compat" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa44e7cc6642e621c6f3eea56f57a765f8e599bf327f4d0f74921693234a5d62" +checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" dependencies = [ "include_bytes_aligned", "no_std_strings", @@ -3332,9 +2365,9 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023ed128cab28e4078330fffb65e9d079b3198958e3de6835f70c7ff285afeb4" +checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" dependencies = [ "anyhow", "blake2", @@ -3346,7 +2379,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core", + "rand_core 0.6.4", "risc0-core", "risc0-zkvm-platform", "serde", @@ -3357,15 +2390,15 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5881af78a17ca292037ef38383233f8d617ab679d68cc07c865e3ddabef1db80" +checksum = "0f1014d2efcb3b359aff878c9aeb6aa949a6d91f091a2ffb5ffd8d928a1ab7f3" dependencies = [ "anyhow", "borsh", "bytemuck", - "derive_more 2.0.1", - "getrandom", + "derive_more", + "getrandom 0.2.16", "hex", "risc0-binfmt", "risc0-circuit-keccak", @@ -3377,7 +2410,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rrs-lib", - "semver 1.0.23", + "semver 1.0.26", "serde", "sha2", "stability", @@ -3386,13 +2419,14 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed76ab12e5af4c93a3996e0609696cfdd0caebe8746af171ef583fa6e4af134" +checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" dependencies = [ "bytemuck", "cfg-if", - "getrandom", + "getrandom 0.2.16", + "getrandom 0.3.3", "libm", "stability", ] @@ -3419,9 +2453,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825df406ec217a8116bd7b06897c6cc8f65ffefc15d030ae2c9540acc9ed50b6" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -3435,7 +2469,8 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand", + "rand 0.8.5", + "rand 0.9.1", "rlp", "ruint-macro", "serde", @@ -3449,12 +2484,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -3478,42 +2507,24 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.26", ] [[package]] name = "rustix" -version = "0.38.34" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", + "windows-sys", ] [[package]] @@ -3540,32 +2551,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "sec1" version = "0.7.3" @@ -3580,29 +2565,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.11.0" @@ -3614,18 +2576,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -3647,7 +2609,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -3662,23 +2624,11 @@ dependencies = [ "serde", ] -[[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 = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -3697,9 +2647,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -3718,36 +2668,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", + "rand_core 0.6.4", ] [[package]] name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "spin" @@ -3772,48 +2700,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.103", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.98", -] - [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3828,9 +2728,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" dependencies = [ "proc-macro2", "quote", @@ -3846,27 +2746,19 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", + "syn 2.0.103", ] [[package]] -name = "synstructure" -version = "0.13.2" +name = "syn-solidity" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ + "paste", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -3877,23 +2769,24 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.61", + "thiserror-impl 1.0.69", ] [[package]] @@ -3907,13 +2800,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] @@ -3924,16 +2817,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", + "syn 2.0.103", ] [[package]] @@ -3945,141 +2829,28 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[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-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", + "winnow", ] -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -4089,20 +2860,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.103", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -4117,23 +2888,17 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -4155,9 +2920,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -4165,197 +2930,40 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[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" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.98", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets", -] +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "windows-sys" -version = "0.52.0" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "windows-targets", + "wit-bindgen-rt", ] [[package]] @@ -4433,28 +3041,22 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] [[package]] -name = "winnow" -version = "0.7.10" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "memchr", + "bitflags 2.9.1", ] -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - [[package]] name = "wyz" version = "0.5.1" @@ -4464,69 +3066,24 @@ dependencies = [ "tap", ] -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "synstructure", -] - [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", - "synstructure", + "syn 2.0.103", ] [[package]] @@ -4546,38 +3103,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", + "syn 2.0.103", ] diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml index 1e26a2dffd..261d50139c 100644 --- a/crates/support/methods/guest/Cargo.toml +++ b/crates/support/methods/guest/Cargo.toml @@ -13,7 +13,7 @@ path = "src/bin/program.rs" alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "0.8" risc0-zkvm = { version = "2.1.0", default-features = false, features = ['std'] } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } e3-user-program = { path = "../../program" } bincode = "1.3.3" anyhow = "1.0.86" diff --git a/crates/support/program/Cargo.toml b/crates/support/program/Cargo.toml index 63f32477d9..db68369e4d 100644 --- a/crates/support/program/Cargo.toml +++ b/crates/support/program/Cargo.toml @@ -6,5 +6,5 @@ edition = "2024" [dependencies] fhe_rs = { workspace = true } fhe-traits = { workspace = true } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } -e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } From ccc895950fd3637a03ad2eeec42b8d9b0bc6f4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Wed, 18 Jun 2025 11:28:37 +0000 Subject: [PATCH 081/106] Alloy version bug (#526) * Fix version * Update lockfile --- crates/support/methods/guest/Cargo.toml | 4 +- pnpm-lock.yaml | 219 ++++++++++-------------- 2 files changed, 95 insertions(+), 128 deletions(-) diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml index 261d50139c..80179781f5 100644 --- a/crates/support/methods/guest/Cargo.toml +++ b/crates/support/methods/guest/Cargo.toml @@ -10,8 +10,8 @@ name = "program" path = "src/bin/program.rs" [dependencies] -alloy-primitives = { version = "0.8", default-features = false, features = ["rlp", "serde", "std"] } -alloy-sol-types = "0.8" +alloy-primitives = { version = "1.0", default-features = false, features = ["rlp", "serde", "std"] } +alloy-sol-types = "1.0" risc0-zkvm = { version = "2.1.0", default-features = false, features = ['std'] } e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } e3-user-program = { path = "../../program" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ee9df4037..b05add2bad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,10 +75,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 version: 1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -87,13 +87,13 @@ importers: version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(21c4d7a5429e39aca71bda0cc08815c6) + version: 5.0.0(cb16358cc88a50382973a3462bc448f8) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -105,13 +105,13 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -8953,7 +8953,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -8978,10 +8978,10 @@ snapshots: '@babel/helpers': 7.27.6 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -9022,7 +9022,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9039,7 +9039,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -9060,14 +9060,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9082,9 +9075,9 @@ snapshots: '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9099,7 +9092,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9108,13 +9101,13 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9132,7 +9125,7 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9150,7 +9143,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9177,7 +9170,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9221,14 +9214,14 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: @@ -9267,7 +9260,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9328,7 +9321,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9374,7 +9367,7 @@ snapshots: '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.27.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9494,7 +9487,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) '@babel/types': 7.27.6 @@ -9708,19 +9701,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.27.5 '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.27.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9925,11 +9906,10 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -9959,7 +9939,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10254,7 +10234,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10581,7 +10561,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10834,7 +10814,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -10858,7 +10838,7 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -10881,7 +10861,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -10894,7 +10874,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10908,7 +10888,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11132,42 +11112,40 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.0 '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -11177,12 +11155,11 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': @@ -11191,7 +11168,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -11251,20 +11228,19 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(21c4d7a5429e39aca71bda0cc08815c6)': + '@nomicfoundation/hardhat-toolbox@5.0.0(cb16358cc88a50382973a3462bc448f8)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -11277,7 +11253,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11292,7 +11268,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11307,7 +11283,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -12088,9 +12064,9 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 @@ -12173,10 +12149,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -12259,14 +12235,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - typescript: 5.8.3 - '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -12275,20 +12243,19 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': @@ -12526,7 +12493,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12542,7 +12509,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12556,7 +12523,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13262,7 +13229,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -13535,7 +13502,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -14735,7 +14702,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15043,7 +15010,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15161,7 +15128,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -15212,7 +15179,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -15552,7 +15519,7 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -15630,7 +15597,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15681,7 +15648,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15964,7 +15931,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17112,7 +17079,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -17134,7 +17101,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -18357,7 +18324,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -18439,7 +18406,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -19196,7 +19163,7 @@ snapshots: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 @@ -19244,7 +19211,7 @@ snapshots: typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19650,7 +19617,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: From 211d68d1b061f201f80d77338ccb7697046ceff0 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:55:07 +0500 Subject: [PATCH 082/106] Update Risc0 Zkvm Eth version (#528) --- crates/support/Cargo.lock | 103 +++++++++------- crates/support/Cargo.toml | 4 +- crates/support/methods/guest/Cargo.lock | 157 +++--------------------- deploy/local/contracts.sh | 2 +- examples/CRISP/apps/program/Cargo.lock | 103 +++++++++------- examples/CRISP/apps/program/Cargo.toml | 4 +- examples/CRISP/lib/risc0-ethereum | 2 +- templates/default/lib/risc0-ethereum | 2 +- 8 files changed, 144 insertions(+), 233 deletions(-) diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index 91fd95040e..da9bebcc53 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -244,9 +244,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b064bd1cea105e70557a258cd2b317731896753ec08edf51da2d1fced587b05" +checksum = "8a66e45d962abb2e1e8a505d97af34d92137b82f6cabbfb373406a9220dc7dca" dependencies = [ "alloy-consensus", "alloy-contract", @@ -277,15 +277,16 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c3f3bc4f2a6b725970cd354e78e9738ea1e8961a91898f57bf6317970b1915" +checksum = "2bcb57295c4b632b6b3941a089ee82d00ff31ff9eb3eac801bf605ffddc81041" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-trie", + "alloy-tx-macros", "auto_impl", "c-kzg", "derive_more", @@ -301,9 +302,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda014fb5591b8d8d24cab30f52690117d238e52254c6fb40658e91ea2ccd6c3" +checksum = "3ab669be40024565acb719daf1b2a050e6dc065fc0bec6050d97a81cdb860bd7" dependencies = [ "alloy-consensus", "alloy-eips", @@ -315,9 +316,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9668ce1176f0b87a5e5fc805b3d198954f495de2e99b70a44bed691ba2b0a9d8" +checksum = "8ba5d28e15c14226f243d6e329611840135e1b0fa31feaea57c461e0b03b4c7b" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -331,6 +332,7 @@ dependencies = [ "alloy-transport", "futures", "futures-util", + "serde_json", "thiserror 2.0.12", ] @@ -401,9 +403,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7b2f7010581f29bcace81776cf2f0e022008d05a7d326884763f16f3044620" +checksum = "4f853de9ca1819f54de80de5d03bfc1bb7c9fafcf092b480a654447141bc354d" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -421,9 +423,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f723856b1c4ad5473f065650ab9be557c96fbc77e89180fbdac003e904a8d6" +checksum = "8500bcc1037901953771c25cb77e0d4ec0bffd938d93a04715390230d21a612d" dependencies = [ "alloy-eips", "alloy-primitives", @@ -446,12 +448,13 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca1e31b50f4ed9a83689ae97263d366b15b935a67c4acb5dd46d5b1c3b27e8e6" +checksum = "f4997a9873c8639d079490f218e50e5fa07e70f957e9fc187c0a0535977f482f" dependencies = [ "alloy-primitives", "alloy-sol-types", + "http 1.3.1", "serde", "serde_json", "thiserror 2.0.12", @@ -460,9 +463,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879afc0f4a528908c8fe6935b2ab0bc07f77221a989186f71583f7592831689e" +checksum = "a0306e8d148b7b94d988615d367443c1b9d6d2e9fecd2e1f187ac5153dce56f5" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -486,9 +489,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec185bac9d32df79c1132558a450d48f6db0bfb5adef417dbb1a0258153f879b" +checksum = "3eef189583f4c53d231dd1297b28a675ff842b551fb34715f562868a1937431a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -526,9 +529,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d918534afe9cc050eabd8309c107dafd161aa77357782eca4f218bef08a660" +checksum = "ea624ddcdad357c33652b86aa7df9bd21afd2080973389d3facf1a221c573948" dependencies = [ "alloy-chains", "alloy-consensus", @@ -550,6 +553,7 @@ dependencies = [ "either", "futures", "futures-utils-wasm", + "http 1.3.1", "lru", "parking_lot", "pin-project", @@ -587,9 +591,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15e30dcada47c04820b64f63de2423506c5c74f9ab59b115277ef5ad595a6fc" +checksum = "e43d00b4de38432304c4e4b01ae6a3601490fd9824c852329d158763ec18663c" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -612,9 +616,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa10e26554ad7f79a539a6a8851573aedec5289f1f03244aad0bdbc324bfe5c" +checksum = "3bf22ddb69a436f28bbdda7daf34fe011ee9926fa13bfce89fa023aca9ce2b2f" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -624,9 +628,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a8f1efd77116915dad61092f9ef9295accd0b0b251062390d9c4e81599344" +checksum = "5958f2310d69f4806e6f6b90ceb4f2b781cc5a843517a7afe2e7cfec6de3cfb9" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -635,9 +639,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1323310d87f9d950fb3ff58d943fdf832f5e10e6f902f405c0eaa954ffbaf1" +checksum = "1826285e4ffc2372a8c061d5cc145858e67a0be3309b768c5b77ddb6b9e6cbc7" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -647,7 +651,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "thiserror 2.0.12", @@ -655,9 +659,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05ace2ef3da874544c3ffacfd73261cdb1405d8631765deb991436a53ec6069" +checksum = "906ce0190afeded19cb2e963cb8507c975a7862216b9e74f39bf91ddee6ae74b" dependencies = [ "alloy-primitives", "serde", @@ -666,9 +670,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fdabad99ad3c71384867374c60bcd311fc1bb90ea87f5f9c779fd8c7ec36aa" +checksum = "c89baab06195c4be9c5d66f15c55e948013d1aff3ec1cfb0ed469e1423313fce" dependencies = [ "alloy-primitives", "async-trait", @@ -681,9 +685,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb3f4e72378566b189624d54618c8adf07afbcf39d5f368f4486e35a66725b3" +checksum = "8a249a923e302ac6db932567c43945392f0b6832518aab3c4274858f58756774" dependencies = [ "alloy-consensus", "alloy-network", @@ -770,9 +774,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6964d85cd986cfc015b96887b89beed9e06d0d015b75ee2b7bfbd64341aab874" +checksum = "6d1ae10b1bc77fde38161e242749e41e65e34000d05da0a3d3f631e03bfcb19e" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -793,9 +797,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7c5ea7bda4497abe4ea92dcb8c76e9f052c178f3c82aa6976bcb264675f73c" +checksum = "b234272ee449e32c9f1afbbe4ee08ea7c4b52f14479518f95c844ab66163c545" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -822,6 +826,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "alloy-tx-macros" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75ef8609ea2b31c799b0a56c724dca4c73105c5ccc205d9dfeb1d038df6a1da" +dependencies = [ + "alloy-primitives", + "darling", + "proc-macro2", + "quote", + "syn 2.0.103", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -4583,8 +4600,8 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "2.1.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" +version = "2.2.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.2.0#382d76a8040068243a5d13e3de50fcca4224b0d6" dependencies = [ "anyhow", "bytemuck", @@ -4656,8 +4673,8 @@ dependencies = [ [[package]] name = "risc0-ethereum-contracts" -version = "2.1.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" +version = "2.2.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.2.0#382d76a8040068243a5d13e3de50fcca4224b0d6" dependencies = [ "alloy", "alloy-sol-types", diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 8a7860070e..6abdcf423c 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -28,8 +28,8 @@ hex = { version = "0.4.3" } log = { version = "0.4" } reqwest = { version = "0.12.15", features = ["json"] } risc0-build = { version = "2.1.2", features = ["docker"] } -risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } -risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.2.0" } +risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.2.0" } risc0-zkvm = { version = "2.1.0" } risc0-zkp = { version = "2.0.1", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } diff --git a/crates/support/methods/guest/Cargo.lock b/crates/support/methods/guest/Cargo.lock index ae2ef0abe2..cc21a3c82a 100644 --- a/crates/support/methods/guest/Cargo.lock +++ b/crates/support/methods/guest/Cargo.lock @@ -35,67 +35,28 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ - "alloy-json-abi 1.2.0", - "alloy-primitives 1.2.0", - "alloy-sol-type-parser 1.2.0", - "alloy-sol-types 1.2.0", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", "itoa", "serde", "serde_json", "winnow", ] -[[package]] -name = "alloy-json-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" -dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-type-parser 0.8.25", - "serde", - "serde_json", -] - [[package]] name = "alloy-json-abi" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ - "alloy-primitives 1.2.0", - "alloy-sol-type-parser 1.2.0", + "alloy-primitives", + "alloy-sol-type-parser", "serde", "serde_json", ] -[[package]] -name = "alloy-primitives" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash", - "hashbrown 0.15.4", - "indexmap", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.8.5", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - [[package]] name = "alloy-primitives" version = "1.2.0" @@ -133,59 +94,27 @@ dependencies = [ "bytes", ] -[[package]] -name = "alloy-sol-macro" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" -dependencies = [ - "alloy-sol-macro-expander 0.8.25", - "alloy-sol-macro-input 0.8.25", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.103", -] - [[package]] name = "alloy-sol-macro" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ - "alloy-sol-macro-expander 1.2.0", - "alloy-sol-macro-input 1.2.0", + "alloy-sol-macro-expander", + "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", "syn 2.0.103", ] -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" -dependencies = [ - "alloy-sol-macro-input 0.8.25", - "const-hex", - "heck", - "indexmap", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.103", - "syn-solidity 0.8.25", - "tiny-keccak", -] - [[package]] name = "alloy-sol-macro-expander" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ - "alloy-sol-macro-input 1.2.0", + "alloy-sol-macro-input", "const-hex", "heck", "indexmap", @@ -193,26 +122,10 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.103", - "syn-solidity 1.2.0", + "syn-solidity", "tiny-keccak", ] -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" -dependencies = [ - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "syn 2.0.103", - "syn-solidity 0.8.25", -] - [[package]] name = "alloy-sol-macro-input" version = "1.2.0" @@ -226,17 +139,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.103", - "syn-solidity 1.2.0", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" -dependencies = [ - "serde", - "winnow", + "syn-solidity", ] [[package]] @@ -249,28 +152,15 @@ dependencies = [ "winnow", ] -[[package]] -name = "alloy-sol-types" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" -dependencies = [ - "alloy-json-abi 0.8.25", - "alloy-primitives 0.8.25", - "alloy-sol-macro 0.8.25", - "const-hex", - "serde", -] - [[package]] name = "alloy-sol-types" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ - "alloy-json-abi 1.2.0", - "alloy-primitives 1.2.0", - "alloy-sol-macro 1.2.0", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", "serde", ] @@ -1084,7 +974,7 @@ version = "0.1.0" source = "git+https://github.com/gnosisguild/enclave?rev=1bf6340#1bf6340124ac2ef8ce6d409307d5455ef68ed8ab" dependencies = [ "alloy-dyn-abi", - "alloy-primitives 1.2.0", + "alloy-primitives", "fhe", "fhe-traits", ] @@ -1443,8 +1333,8 @@ dependencies = [ name = "guests" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.25", - "alloy-sol-types 0.8.25", + "alloy-primitives", + "alloy-sol-types", "anyhow", "bincode", "e3-compute-provider", @@ -2126,7 +2016,6 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", - "serde", ] [[package]] @@ -2737,18 +2626,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn-solidity" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.103", -] - [[package]] name = "syn-solidity" version = "1.2.0" diff --git a/deploy/local/contracts.sh b/deploy/local/contracts.sh index 45506b40c7..bcfa1fa321 100755 --- a/deploy/local/contracts.sh +++ b/deploy/local/contracts.sh @@ -1,7 +1,7 @@ # !/bin/bash # Install the enclave binary -# cargo install --path ./crates/cli --bin enclave -f +cargo install --path ./crates/cli --bin enclave -f # Deploy Contacts (cd packages/evm && rm -rf deployments/localhost && pnpm deploy:mocks --network localhost) diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index fb5c59f58b..91da2bd237 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -244,9 +244,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b064bd1cea105e70557a258cd2b317731896753ec08edf51da2d1fced587b05" +checksum = "8a66e45d962abb2e1e8a505d97af34d92137b82f6cabbfb373406a9220dc7dca" dependencies = [ "alloy-consensus", "alloy-contract", @@ -277,15 +277,16 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c3f3bc4f2a6b725970cd354e78e9738ea1e8961a91898f57bf6317970b1915" +checksum = "2bcb57295c4b632b6b3941a089ee82d00ff31ff9eb3eac801bf605ffddc81041" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-trie", + "alloy-tx-macros", "auto_impl", "c-kzg", "derive_more", @@ -301,9 +302,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda014fb5591b8d8d24cab30f52690117d238e52254c6fb40658e91ea2ccd6c3" +checksum = "3ab669be40024565acb719daf1b2a050e6dc065fc0bec6050d97a81cdb860bd7" dependencies = [ "alloy-consensus", "alloy-eips", @@ -315,9 +316,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9668ce1176f0b87a5e5fc805b3d198954f495de2e99b70a44bed691ba2b0a9d8" +checksum = "8ba5d28e15c14226f243d6e329611840135e1b0fa31feaea57c461e0b03b4c7b" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -331,6 +332,7 @@ dependencies = [ "alloy-transport", "futures", "futures-util", + "serde_json", "thiserror 2.0.12", ] @@ -401,9 +403,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7b2f7010581f29bcace81776cf2f0e022008d05a7d326884763f16f3044620" +checksum = "4f853de9ca1819f54de80de5d03bfc1bb7c9fafcf092b480a654447141bc354d" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -421,9 +423,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f723856b1c4ad5473f065650ab9be557c96fbc77e89180fbdac003e904a8d6" +checksum = "8500bcc1037901953771c25cb77e0d4ec0bffd938d93a04715390230d21a612d" dependencies = [ "alloy-eips", "alloy-primitives", @@ -446,12 +448,13 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca1e31b50f4ed9a83689ae97263d366b15b935a67c4acb5dd46d5b1c3b27e8e6" +checksum = "f4997a9873c8639d079490f218e50e5fa07e70f957e9fc187c0a0535977f482f" dependencies = [ "alloy-primitives", "alloy-sol-types", + "http 1.3.1", "serde", "serde_json", "thiserror 2.0.12", @@ -460,9 +463,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879afc0f4a528908c8fe6935b2ab0bc07f77221a989186f71583f7592831689e" +checksum = "a0306e8d148b7b94d988615d367443c1b9d6d2e9fecd2e1f187ac5153dce56f5" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -486,9 +489,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec185bac9d32df79c1132558a450d48f6db0bfb5adef417dbb1a0258153f879b" +checksum = "3eef189583f4c53d231dd1297b28a675ff842b551fb34715f562868a1937431a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -526,9 +529,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d918534afe9cc050eabd8309c107dafd161aa77357782eca4f218bef08a660" +checksum = "ea624ddcdad357c33652b86aa7df9bd21afd2080973389d3facf1a221c573948" dependencies = [ "alloy-chains", "alloy-consensus", @@ -550,6 +553,7 @@ dependencies = [ "either", "futures", "futures-utils-wasm", + "http 1.3.1", "lru", "parking_lot", "pin-project", @@ -587,9 +591,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15e30dcada47c04820b64f63de2423506c5c74f9ab59b115277ef5ad595a6fc" +checksum = "e43d00b4de38432304c4e4b01ae6a3601490fd9824c852329d158763ec18663c" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -612,9 +616,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa10e26554ad7f79a539a6a8851573aedec5289f1f03244aad0bdbc324bfe5c" +checksum = "3bf22ddb69a436f28bbdda7daf34fe011ee9926fa13bfce89fa023aca9ce2b2f" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -624,9 +628,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a8f1efd77116915dad61092f9ef9295accd0b0b251062390d9c4e81599344" +checksum = "5958f2310d69f4806e6f6b90ceb4f2b781cc5a843517a7afe2e7cfec6de3cfb9" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -635,9 +639,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1323310d87f9d950fb3ff58d943fdf832f5e10e6f902f405c0eaa954ffbaf1" +checksum = "1826285e4ffc2372a8c061d5cc145858e67a0be3309b768c5b77ddb6b9e6cbc7" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -647,7 +651,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "thiserror 2.0.12", @@ -655,9 +659,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05ace2ef3da874544c3ffacfd73261cdb1405d8631765deb991436a53ec6069" +checksum = "906ce0190afeded19cb2e963cb8507c975a7862216b9e74f39bf91ddee6ae74b" dependencies = [ "alloy-primitives", "serde", @@ -666,9 +670,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fdabad99ad3c71384867374c60bcd311fc1bb90ea87f5f9c779fd8c7ec36aa" +checksum = "c89baab06195c4be9c5d66f15c55e948013d1aff3ec1cfb0ed469e1423313fce" dependencies = [ "alloy-primitives", "async-trait", @@ -681,9 +685,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb3f4e72378566b189624d54618c8adf07afbcf39d5f368f4486e35a66725b3" +checksum = "8a249a923e302ac6db932567c43945392f0b6832518aab3c4274858f58756774" dependencies = [ "alloy-consensus", "alloy-network", @@ -770,9 +774,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6964d85cd986cfc015b96887b89beed9e06d0d015b75ee2b7bfbd64341aab874" +checksum = "6d1ae10b1bc77fde38161e242749e41e65e34000d05da0a3d3f631e03bfcb19e" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -793,9 +797,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.15.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7c5ea7bda4497abe4ea92dcb8c76e9f052c178f3c82aa6976bcb264675f73c" +checksum = "b234272ee449e32c9f1afbbe4ee08ea7c4b52f14479518f95c844ab66163c545" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -822,6 +826,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "alloy-tx-macros" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75ef8609ea2b31c799b0a56c724dca4c73105c5ccc205d9dfeb1d038df6a1da" +dependencies = [ + "alloy-primitives", + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -4519,8 +4536,8 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "2.1.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" +version = "2.2.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.2.0#382d76a8040068243a5d13e3de50fcca4224b0d6" dependencies = [ "anyhow", "bytemuck", @@ -4592,8 +4609,8 @@ dependencies = [ [[package]] name = "risc0-ethereum-contracts" -version = "2.1.0" -source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.1.0#c09ee29b386d2b1486724509868d1115db36929f" +version = "2.2.0" +source = "git+https://github.com/risc0/risc0-ethereum?tag=v2.2.0#382d76a8040068243a5d13e3de50fcca4224b0d6" dependencies = [ "alloy", "alloy-sol-types", diff --git a/examples/CRISP/apps/program/Cargo.toml b/examples/CRISP/apps/program/Cargo.toml index 9399977be1..896f5316ef 100644 --- a/examples/CRISP/apps/program/Cargo.toml +++ b/examples/CRISP/apps/program/Cargo.toml @@ -28,8 +28,8 @@ hex = { version = "0.4.3" } log = { version = "0.4" } reqwest = { version = "0.12.15", features = ["json"] } risc0-build = { version = "2.1.2", features = ["docker"] } -risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } -risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.1.0" } +risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.2.0" } +risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v2.2.0" } risc0-zkvm = { version = "2.1.0" } risc0-zkp = { version = "2.0.1", default-features = false } serde = { version = "1.0.208", features = ["derive", "std"] } diff --git a/examples/CRISP/lib/risc0-ethereum b/examples/CRISP/lib/risc0-ethereum index c09ee29b38..382d76a804 160000 --- a/examples/CRISP/lib/risc0-ethereum +++ b/examples/CRISP/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit c09ee29b386d2b1486724509868d1115db36929f +Subproject commit 382d76a8040068243a5d13e3de50fcca4224b0d6 diff --git a/templates/default/lib/risc0-ethereum b/templates/default/lib/risc0-ethereum index c09ee29b38..382d76a804 160000 --- a/templates/default/lib/risc0-ethereum +++ b/templates/default/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit c09ee29b386d2b1486724509868d1115db36929f +Subproject commit 382d76a8040068243a5d13e3de50fcca4224b0d6 From 2cc545c72f6e2478926bfa1ddcb952734d56a259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 19 Jun 2025 19:16:58 +0000 Subject: [PATCH 083/106] Get template running in workspace (#529) * Fix submodules * Add gitignore * Update gitignore * Update support build * Update control scripts to use enclave rev * revertme * Coordinate github build * Add comment * Add support build * Add feature to avoid risc0 compilation * Update scripts and caches * Add support ctl * Add simple test to program * Update dockerignore * Try alter dockerignore * Add shell functionality * Add fixtures * Update curl test * Move to root support curl_test * Use correct fixtures path * Update risc0 in Dockerfile * Fix wrong version * Update docker build script * Update pnpm lock * Add ImageID to workspace template gitignore * Update gitignore * Ensure we are running in dev mode --- .github/workflows/support-docker.yml | 2 +- .gitmodules | 2 +- crates/Dockerfile | 1 + crates/cli/Cargo.toml | 1 + crates/cli/build.rs | 22 ++ crates/cli/src/cli.rs | 9 +- crates/cli/src/main.rs | 1 + crates/cli/src/program.rs | 4 + crates/cli/src/rev.rs | 6 + crates/support-scripts/ctl/container | 38 ++- crates/support-scripts/src/lib.rs | 8 + crates/support/.dockerignore | 2 +- crates/support/app/Cargo.toml | 9 +- crates/support/app/src/main.rs | 37 ++- crates/support/curl_test.sh | 5 + crates/support/fixtures/payload.json | 15 + crates/support/scripts/build.sh | 22 +- examples/CRISP/lib/risc0-ethereum | 2 +- package.json | 10 +- pnpm-lock.yaml | 302 +++++++++++++++++- pnpm-workspace.yaml | 1 + templates/default/.gitignore | 4 + templates/default/contracts/ImageID.sol | 2 +- templates/default/enclave.config.yaml | 6 + templates/default/foo | 0 templates/default/lib/risc0-ethereum | 2 +- templates/default/scripts/dev_all.sh | 74 +---- .../default/scripts/dev_all_concurrently.sh | 22 ++ templates/default/scripts/dev_all_tmux.sh | 41 +++ templates/default/scripts/dev_frontend.sh | 6 + 30 files changed, 537 insertions(+), 119 deletions(-) create mode 100644 crates/cli/build.rs create mode 100644 crates/cli/src/rev.rs create mode 100755 crates/support/curl_test.sh create mode 100644 crates/support/fixtures/payload.json create mode 100644 templates/default/foo create mode 100755 templates/default/scripts/dev_all_concurrently.sh create mode 100755 templates/default/scripts/dev_all_tmux.sh diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 5e086a8463..79c51ce0d7 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -24,7 +24,7 @@ jobs: - name: Generate version tag id: version run: | - echo "version=$(date +'%Y%m%d')-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + echo "version=${GITHUB_SHA::8}" >> $GITHUB_OUTPUT - name: Set up BuildKit uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry diff --git a/.gitmodules b/.gitmodules index b8ad5e5e47..b663ca7ab4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/risc0/risc0-ethereum [submodule "templates/default/lib/risc0-ethereum"] path = templates/default/lib/risc0-ethereum - url = https://github.com/gnosisguild/risc0-ethereum + url = https://github.com/gnosisguild/risc0-ethereum diff --git a/crates/Dockerfile b/crates/Dockerfile index 951e9cb8fc..d365005563 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -57,6 +57,7 @@ COPY crates/tests/Cargo.toml ./tests/Cargo.toml # COPY ./crates/entrypoint/build.rs ./entrypoint/build.rs RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./entrypoint/build.rs +RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./cli/build.rs RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ if [ "$d" = "./cli/" ] || [ "$d" = "./enclaveup/" ]; then \ diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 2b9e6e04b5..fc7bd4fb67 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -5,6 +5,7 @@ edition.workspace = true license.workspace = true description = "E3 - Enclave CLI" repository = "https://github.com/gnosisguild/enclave/crates/cli" +build = "build.rs" [[bin]] name = "enclave" diff --git a/crates/cli/build.rs b/crates/cli/build.rs new file mode 100644 index 0000000000..e4ed9c0dc6 --- /dev/null +++ b/crates/cli/build.rs @@ -0,0 +1,22 @@ +use std::process::Command; + +fn main() { + // Get git SHA + let output = Command::new("git") + .args(&["rev-parse", "--short", "HEAD"]) + .output(); + + let git_sha = match output { + Ok(output) if output.status.success() => String::from_utf8(output.stdout) + .unwrap_or_else(|_| "unknown".to_string()) + .trim() + .to_string(), + _ => "unknown".to_string(), + }; + + // Set environment variable for compilation + println!("cargo:rustc-env=GIT_SHA={}", git_sha); + + // Rebuild if git HEAD changes + println!("cargo:rerun-if-changed=.git/HEAD"); +} diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index a55933a2db..a4817d2c98 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -6,7 +6,7 @@ use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::program::{self, ProgramCommands}; use crate::wallet::WalletCommands; -use crate::{config_set, init, net, password, wallet}; +use crate::{config_set, init, net, password, rev, wallet}; use crate::{print_env, start}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; @@ -84,6 +84,7 @@ impl Cli { { // Existing init branch match self.command { + Commands::Rev => rev::execute().await?, Commands::Init {path, template} => init::execute(path, template).await?, Commands::ConfigSet { rpc_url, @@ -115,7 +116,7 @@ impl Cli { false, ) .await?; - } + }, _ => bail!( "Configuration file not found. Run `enclave config-set` to create a configuration." ), @@ -165,6 +166,7 @@ impl Cli { Commands::Password { command } => password::execute(command, &config).await?, Commands::Wallet { command } => wallet::execute(command, config).await?, Commands::Net { command } => net::execute(command, &config).await?, + Commands::Rev => rev::execute().await?, } close_all_connections(); @@ -224,6 +226,9 @@ pub enum Commands { /// Compile an Enclave project Compile, + /// Return the git_sha rev that the cli was compiled against + Rev, + /// Program management commands Program { #[command(subcommand)] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 89d78edf95..2ae051a92e 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -24,6 +24,7 @@ mod password_delete; mod password_set; mod print_env; mod program; +mod rev; mod start; mod wallet; mod wallet_set; diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index d272a8f6be..ccb12bdd1d 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -9,12 +9,16 @@ pub enum ProgramCommands { /// Compile the program code Compile, + + /// Get a shell into the docker environment that the program runs in + Shell, } pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { match command { ProgramCommands::Start => e3_support_scripts::program_start(config.program()).await?, ProgramCommands::Compile => e3_support_scripts::program_compile().await?, + ProgramCommands::Shell => e3_support_scripts::program_shell().await?, }; Ok(()) diff --git a/crates/cli/src/rev.rs b/crates/cli/src/rev.rs new file mode 100644 index 0000000000..55a88900d3 --- /dev/null +++ b/crates/cli/src/rev.rs @@ -0,0 +1,6 @@ +pub const GIT_SHA: &str = env!("GIT_SHA"); + +pub async fn execute() -> anyhow::Result<()> { + println!("{}", GIT_SHA); + Ok(()) +} diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 09bf95edb3..73080c41de 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -1,8 +1,20 @@ #!/usr/bin/env bash + +GIT_SHA=$(enclave rev) CONTAINER_NAME="e3-support.1" -IMAGE="ghcr.io/gnosisguild/e3-support:hacknet" +IMAGE="ghcr.io/gnosisguild/e3-support:$GIT_SHA" CACHE_PREFIX="e3-support" +# Check if the image exists locally or remotely if not bail +# Every time we push we build support so every build of enclave should have support built too. +# This solves the problem where a person will be using the cli with a specific `enclave rev` but our latest +# support scripts have changed which will break the support behaviour for the user. +# The user can then upgrade their cli once they are ready and then the support image will match their version +if ! docker image inspect "$IMAGE" >/dev/null 2>&1 && ! docker manifest inspect "$IMAGE" >/dev/null 2>&1; then + echo "Support scripts not found for git sha \"$GIT_SHA\" Please recompile the support scripts for this version of the enclave cli within the source repository" + exit 1 +fi + # Function to cleanup cleanup() { echo "Stopping container and processes..." @@ -17,27 +29,25 @@ cleanup() { # Set trap for signals trap cleanup EXIT INT TERM -# Pull the latest image to ensure we have the most recent version -# NOTE: This might cause issues if the CLI is not up to date -echo "Pulling latest image: $IMAGE" -docker pull "$IMAGE" || { - echo "Warning: Failed to pull latest image, using cached version" -} - -# Ensure directories exist with proper permissions -mkdir -p "$(pwd)/target" -chmod -R 777 "$(pwd)/target" +mkdir -p "$(pwd)/.enclave/caches"/{target,registry,git,risc0-cache,risc0-circuits} +chmod -R 777 "$(pwd)/.enclave/caches" if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then + echo "Running exec $IMAGE..." docker exec -it "$CONTAINER_NAME" bash -c "$*" else + echo "Running start $IMAGE..." docker run -it --rm \ --name "$CONTAINER_NAME" \ --platform linux/amd64 \ - -p 13151:13151 \ + --network=host \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ - -v "$(pwd)/target:/app/target" \ + -v "$(pwd)/.enclave/caches/target:/app/target" \ + -v "$(pwd)/.enclave/caches/registry:/home/devuser/.cargo/registry" \ + -v "$(pwd)/.enclave/caches/git:/home/devuser/.cargo/git" \ + -v "$(pwd)/.enclave/caches/risc0-cache:/home/devuser/.risc0/cache" \ + -v "$(pwd)/.enclave/caches/risc0-circuits:/home/devuser/.risc0/circuits" \ -v "${CACHE_PREFIX}-cargo-cache:/usr/local/cargo" \ "$IMAGE" bash -c "$*" -fi \ No newline at end of file +fi diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 438fd6981f..09ac784863 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -53,6 +53,14 @@ pub async fn program_compile() -> Result<()> { Ok(()) } +pub async fn program_shell() -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/ctl/shell"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) +} + pub async fn program_start(program_config: &ProgramConfig) -> Result<()> { let cwd = env::current_dir()?; let script = cwd.join(".enclave/support/ctl/start"); diff --git a/crates/support/.dockerignore b/crates/support/.dockerignore index c521e78a32..381cbeb22e 100644 --- a/crates/support/.dockerignore +++ b/crates/support/.dockerignore @@ -1,3 +1,3 @@ /target /contracts -/tests +Elf.sol diff --git a/crates/support/app/Cargo.toml b/crates/support/app/Cargo.toml index 0ad1a998d4..2a14b4dd3f 100644 --- a/crates/support/app/Cargo.toml +++ b/crates/support/app/Cargo.toml @@ -10,8 +10,15 @@ serde.workspace = true serde_json.workspace = true tokio.workspace = true e3-compute-provider.workspace = true -e3-support-host.workspace = true e3-support-types.workspace = true reqwest.workspace = true anyhow.workspace = true hex.workspace = true + +[dependencies.e3-support-host] +workspace = true +optional = true + +[features] +default = ["risc0"] +risc0 = ["e3-support-host"] diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index 6f5ff5c689..111e5004fe 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,6 +1,9 @@ -use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; +use actix_web::{ + http::Method, middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult, +}; use anyhow::bail; use e3_compute_provider::FHEInputs; +#[cfg(feature = "risc0")] use e3_support_host::Risc0Output; use e3_support_types::{ComputeRequest, ComputeResponse, WebhookPayload}; use serde::{Deserialize, Deserializer, Serialize}; @@ -23,27 +26,33 @@ async fn call_webhook( ciphertext, proof, }; - println!("callback_url: {}", callback_url); println!("payload: {:?}", payload); - reqwest::Client::new() .post(callback_url) .json(&payload) .send() .await? .error_for_status()?; - println!("✓ Webhook called successfully for E3 {}", e3_id); Ok(()) } -async fn run_computation_async(fhe_inputs: FHEInputs) -> anyhow::Result<(Risc0Output, Vec)> { +#[cfg(feature = "risc0")] +async fn run_computation_async(fhe_inputs: FHEInputs) -> anyhow::Result<(Vec, Vec)> { println!("running computation..."); - let result = + let (risc0_output, ciphertext) = tokio::task::spawn_blocking(move || e3_support_host::run_compute(fhe_inputs)).await??; println!("have result from computation!"); - Ok(result) + let proof: Vec = risc0_output.seal.into(); + Ok((proof, ciphertext)) +} + +#[cfg(not(feature = "risc0"))] +async fn run_computation_async(fhe_inputs: FHEInputs) -> anyhow::Result<(Vec, Vec)> { + println!("NOOP: risc0 feature not enabled, skipping actual computation"); + // Return dummy data + Ok((vec![0u8; 32], vec![1u8; 64])) } async fn handle_webhook_delivery( @@ -63,9 +72,8 @@ async fn process_computation_background( callback_url: &str, fhe_inputs: FHEInputs, ) -> anyhow::Result<()> { - let (risc0_output, ciphertext) = run_computation_async(fhe_inputs).await?; + let (proof, ciphertext) = run_computation_async(fhe_inputs).await?; println!("computation finished!"); - let proof: Vec = risc0_output.seal.into(); println!("handling webhook delivery..."); handle_webhook_delivery(e3_id, callback_url, proof, ciphertext).await?; println!("✓ Computation completed for E3 {}", e3_id); @@ -74,32 +82,25 @@ async fn process_computation_background( async fn handle_compute(req: web::Json) -> ActixResult { println!("Processing computation..."); - let e3_id = req .e3_id .ok_or_else(|| actix_web::error::ErrorBadRequest("e3_id is required"))?; - let callback_url = req .callback_url .clone() .ok_or_else(|| actix_web::error::ErrorBadRequest("callback_url is required"))?; - let fhe_inputs = FHEInputs { params: req.params.clone(), ciphertexts: req.ciphertext_inputs.clone(), }; - println!("fhe_inputs.params = {:?}", fhe_inputs.params); - let callback_url = callback_url.clone(); - // Process computation in background tokio::spawn(async move { if let Err(e) = process_computation_background(e3_id, &callback_url, fhe_inputs).await { eprintln!("✗ Background computation failed for E3 {}: {:?}", e3_id, e); } }); - Ok(HttpResponse::Ok().json(ProcessingResponse { status: "processing".to_string(), e3_id, @@ -116,17 +117,15 @@ async fn handle_health_check() -> ActixResult { #[actix_web::main] async fn main() -> anyhow::Result<()> { env_logger::init(); - let bind_addr = "0.0.0.0:13151"; let server = HttpServer::new(move || { App::new() .wrap(Logger::default()) .route("/run_compute", web::post().to(handle_compute)) .route("/health", web::get().to(handle_health_check)) + .route("/health", web::head().to(handle_health_check)) }) .bind(bind_addr)?; - println!("🚀 FHE Compute Service listening on http://{}", bind_addr); - server.run().await.map_err(Into::into) } diff --git a/crates/support/curl_test.sh b/crates/support/curl_test.sh new file mode 100755 index 0000000000..0d3bf87d00 --- /dev/null +++ b/crates/support/curl_test.sh @@ -0,0 +1,5 @@ +curl -X POST \ + -H "Content-Type: application/json" \ + -d @./fixtures/payload.json \ + http://localhost:13151/run_compute + diff --git a/crates/support/fixtures/payload.json b/crates/support/fixtures/payload.json new file mode 100644 index 0000000000..24f2b1c7a4 --- /dev/null +++ b/crates/support/fixtures/payload.json @@ -0,0 +1,15 @@ +{ + "e3_id": 0, + "params": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001", + "ciphertext_inputs": [ + [ + "0x0a8a6c08021080101a806ca049c3e165dd0d724db8e7ff91bd3cbdcaa21b19e3f5d254b350b328207a2d854f4b244107b674477d101f50daafd23feca3771c0923bfc2a19a419e095aa967a0d7ed0c7b59665acbe2fe8ea7a99874546e2092f93f37be13879d8dd6364d06b18f3fdf4a678d31b7456222e772f9c6c49ba9e4d7541fd859905f357acc380e3bc259eb987a800d20feb5fc4ec89a5d6ba519ffcd7d75e6ceb448852592db96bf1ba3e29054b4aad860a6f433eda762cce5960a23f19ca5f6dff895bf5bb78a15e3808a608b9ed38603481edaa9208f0887841ac4af289cf6b6486042dbf5e2ac1b53199beeef6129a45df4c6521664f304b955108539dd14596065a14d3f339936b421dd47bb66b2a49b367e40c8f9dd09697bc04aef671d1db930b0855326a8eb31975415d500b0040e6e56f40b6574e5ff2cb154d6168015522e504de9b25ecdcf3837d854017be5c80bb847f368958cc1ae157e82475ee52c9dc7b5e5ef334201c370af95a3af1c790ea9e27a538e44e3d82a6b0181b7ad883e4f7def4d2706c208b3e7441d9afcca4dce9247fab7762a6ce2d1624b3e18672610f219bc9755c8314265185fdcaa3dc203bd79ec6e6ed4a7b0b3ad5db383cbf290acb4ae9eaa8904d3216df99b68acd1efaa78207b89aa7814d05835b501680dfbf8d8079dc01312ca147f54234f010370df9ffbcfedc737c87bded7a901cea5a3077ee7fc4af96f8e6386245abf707a6b68f1fabc4b6b0d1704c45852aba599db14fb1cb62d6a1740d5813d6bacda9107fb6b0a1e26c2d5388fbafd9d53b6c0e26298742d3c20ec17cde0720805295ccc8d5fc930bf683b83ab644c8c59b55d4a0418938f44f597cdec69c97c8a1baef1f674cc18afaab16a3138ec1ac664c200659b55f18fabb7db1b17251e63b05a556f129659504f6a2a0207cbf2ffe353aa816ef078ad4f6ec2a6a2e5a7bac9b3104b1b6c234811e1bbd415594151b73a334b4c3f28dd865348568b3a4fa406e56dd7b1b0562859c8cc1d0dbd2b72d34c5e4c9a7625024b6e3918e1346aa9c82280787c4de8842620ff78483eebe5349de09703afe32eb938e68c2030e9c0a8e4ec730279a1eb63291801d391cc89b6d13febfaf85c82c832af74681c0483efb6ca8a384b33775720246832bbcaec495efd92f72602e682a75c9d9f6d0ad35e73d1a4017a3868adb52ebe5a080ff6c1b8c7355eb39730b59c3c6e9a24c483bc997eabbdfa778eebe9d3f44e2e195b8740ed960bb27dc1fe08edd8bac12b264cecbe548dfd8264ed7669d7534a24f098aee146d46fc5efb6ada42af40899b0de9ffe27fdfbdbc6f914d6be23d9bc15691876a7d64c7aaa0fd58132f514fd3e772ae6b8dfc76e939576efec7bec78214a7aa2675402cbfd1c44f39af967004ac409b6743ca4f3a7acd50ad4af945c4d2abe0397079eb39735cc7ee1418026bc6822b8e42d0dc46b1e2c7db2862fa057c312c3c76e82d2e0987d27b7225e4b40eb67edcc2b35e671884937f2992c25c00fd8cd24e987ffb0674627dd613b2393040a70d5f7caa12010651d0d7ebddf17acff6b156562e61086e68971955c03fe0a7355038ea108302df3f47a91dbcd4fdc24a5e37920923f61c3a8cb665dc41687c3f6108f4dfd4536e305fa394a92e554f5fe3cbcb7f6c1a2b6799ef2690315ba07964fdafc64944d6c54a600362cdc6e4e00d1747cfcf9c433422607d51ce54dff2d7c09dcbf9fc282d4621c8d881e6643eabb28ed20188d6cf67ab7ba7f45fab1aca01d26b4a0076a6b6f029427ad2cc7babda3fb75cc044d70cf4aa9b6da079d318b5b4d8379a1913e80c5268ca4151db34da60343ecfd5fbc4fa5749cbdc8d432180dff3a480c8acfa6197c400c42e3f8eacebbd769e4ddd2374de9c750f84063a827715457272559035fdcb6e39fdaac699d7285be86d3aa64486085d3ad9c43344c9b3736c2469b9c7eb00cf98f0466f07f738cd3c96e12ef0728f20116ad462fa9cba27b7b7b0f6b18e94050c19fd674e43a2127bff51045ba975540790ef36fe3bfc2db738475b36f6abf5e9140bcddc95b1ef31992c38e9c96553d662f5f9b352b33237cc46efdf5f2e35980f07342678ade5ac5258463973f4d05f63edd0479723ae6a701989433c7d0dd4534d82e73acf22e4486d1c61e890e0246020b4b21563a4290ec4361b91517cf8c63847d48b36d8fb36c0dddc454f80671bf2d9d71f35307bc789948e27d9f23b079fe2ee1ba9e0504de1ca324c24bd915e049394bbf7c28fd327ab906a18abb6f33b40cf01a1217961948e8417adb55d54b7ad18e04c8da27f881bd554cfa46636e11d0a60ae5dd7f2e7ad27800ce53e0ac3dcb2e8556485b874b16f49486f9d26acd1d6afbcb06e1da93717fb6e94f8f0cd80840ad3f1ead39dd3faa2fc7818228963b1db2400984f94513ddb427176a63e4af53da9c31f9d279439a53b07e19ab68085f5ebd9091b2cdf4fd85d19ea757cdaf462b13871ed5a918b48aace7c5ac1287bcca734c65c5e330de3c96ea6eda9ab1450afb830e5afc88b2b925955097c4ad1609465368fda745843da614a97f7411d79268b4f2361e9bd83c83528dbf1a87fc6f89a7e2abd6bfa27c1be2270d28b6963142a07e6ee8608806f34247e2848e7a5befc8bc87b221fca7bce629d1c72e242f40e44edf71f062501947d68b2fcc6e038ce8a43dac30e7eff4e74f3c9d8f642ae90b57a6ab886bfb60d3ba42840270b15830a75538cc33fcc2bb149217530754ff370719d125f2b41096cfa4c745de9089e69dbd086a06a704abf108331a20a5ca1a72b723ffa157c6c1cc7b8a97bbbf3928f014748c9fa89542eaa6016c664eebd6cb01db4839c2083d5a4cc38a871cffeb3a52667c593ef5bf65c11b4ea4732bd3a6fbeb8ac389de161c565a6653499ffab5a71b09ace40dd79b6d7ee919db59541ed7ab694d817e37e467dc8429bd58b8ebdaa6c1380b0269a87e6fbea6edcaac0b42f5798cf0cde4a3d5cf5ddb724858b63fae88826b115d00c00bf0a909c1d364ba5766c890eb4fb865b2edb3d6726c61d449406a438c7f1c853329a62cc791f928ff449c4f289aef8a72da06b772aedb21113c27e79fdff81550f7f5269ead35348116eaf8401459efd3da0ee6918429ba16335d535f0af3d33d8a4c146bbe390b0ae6228aa41b37ba9177f5fdec944ff8156cb4ba786145caa47e4c3513be0fb8e9cbb220aa647f9c87cec202b8d625c639c8324e6233a10d0d74dcbe6d391cb7f5bd3e9ce30299cb4e01e569bfdc0324d503737e9c28c58e3269deb1688bc70c0db4c6e4c088c5d1aaf31c598c010a5590fc03d9262601741dbf0662aa71f14fc4cb3643fd6559b3407f2f3469ca208187e22f6bcca28df708aa93e8dc85a64489565cd69966cbad6a0ed805bff40c1c9ab84ccc6c4fc5ba8aa71720274301702df3c874813977ce2f2026213924a66557b88fb526e12b943bf9bdbc496c2e35c4193457650797b599b6362bb6869939c0fbb51486112a8ec38ce49d3b3a3990895f0aefba7bfb928357551589346830eb3882cc840965eb55b8860a2594e613cde2613663327c062feaa3bfbe192c5c53a29166add212d7ace1bc858fc65725163dd5fcce9e12f1102e320ecc623904339e370514e0ebc4a3ec8ab11bd099ff8805695436548433fad5a69d7e08b3b8e1569a0eb79a77e2252442434393008bc2bdb003b2175b79f47593d99146d041c6df7abf8bbed6a957e7deca154d53d597625849050c453ac2b8bccbf3b49989d8d0276223dcb97e9d3f209640fa2d455538fffff1502987953d5a34e27088515bd08cabce3d9ff2e35ed40f3b464a1797896eb05f79714a855b013d864714e16a553ecf79f71ee935871bccaa30c408e188a48f4538413ae13fd2091fa1a36acc981753e937ddb90a20af6f9eb2679ba5ba50a77d69b5ee62f11d1bad3d3efe31bdf108f1620417933170bc9062c739b3848ac61f68cc02b01987b74d33a6ef2025dc512e412153ef6a69fbd767516582dd090ad42b4e74c726cf49fa79f7ee18fa003420f5559f345c5b7deaaafdf33dd1664926ec339da5e08cec6a207f264323d70f90109a3621fb5bf2ce0672aa9c4bb52f66a0b661866c9792328bcf9b39c0073bab28757a006c9c3d862d6e208a16f35714f4e562fc10881f503277e035b9bdb9b2851204f5fe78347c6cb34fe3094fc5b41433fd509bbddb549840ded7aea3e13e3226893852e037c12f1ddff92ae671db83e64f24245e2148194b006448bfc6a3ca1b961c49f6850f8115f3c17c7452cef01aa260a2f648bcc4551ed00ae3b124f0bb37a2b50a206483cdd72673bc366c88396b76ecd789bc32c52a59cfb322a1758d7be23599e2f41a9d50aa3ca12739f0ea9fa82840dbb113fffd6e9e1fed7af23938c81d1801b1551216180f6a891b50a4336f67d4bcec74d8748ca2289da14cdb975c22a00f746183fb2407c38f006a246e9b1f562ad6a0ddc95f820c9768975310558044df1c44c6abc099753272ec06650a4a1117cdc10662bd19f66d9c2d8596ca2eab7137fc731f53a93154f37dc24b254d1c03d1d85244dfda7fb8ffe8711f6bdab0da62f7bc77f172c4d485f878aeb1ba4fc9ef1883bac943982341a39753ec2ef9b5c305d706a8b48c69a119986e4a35ba87036ccf1a2f3306f07b5776a25659b7256581a9bc471dd86c4f07b348dda7bd4f9f902e41b0155b0307209d5d61c400c1347b4de54caf3161ccb3d7f0b28661d57e737dc625ae60c587d3c55fe039dfc5afde9d4c159e1945f42586617501ad8b1aa0d8cd2449ab7f6df7aed7cb73b90c06753456b929039012451957670d1ac9370f28e5b6581965f8b143ddf2e2e5fbb6d8e43f7de75ee7358749047e97169899285e85b6fcfd4e4bf3238e8ac109e6b399c9209469b7804390970b9d0bfdae2ddb5a9e3bec72bbf458e1a23faca596cd1a432ba9e294503a97870e42ecabd3b5e372b9021d96951e98b85e4899f18d818189e64497f89d9e3ea93fafdb6ab31d88322e6f82341535ca39520827b8af3966c16ef6bcebabe58546f206b63745214c8d2b2d31ab1a54638402ac48ce253e8de8226f3640f989ff5968a1809dc010feb1a8693782aba839563c8c18d2d23a7969878f1585019a0c4475f3413479eee743f29d26a1bdde1922bf9fc61bbdd0ab390fe7cf74cc7ced8242c2c024e097fd17a96dc1e6cf5974d8b9469aade07334da346f589890a1d98fdbeb3a268c165ed4caf2655a2133095aa1e4574f260d79355123feff27cad8b5c51cc1e8bfba3af0834e90875e34129253e9d4659ef75ff71cfc49fe82b1c57b3f1deb3e9a37daf35e37f52cfe98a56ed9d3633ab21d39376a4c6e55771983ee57693b2dc28e6a935f84071d2729d308b8ad192568800ada82ae9ee44269189951f120939fc73f2318f75ed4d89cc135ddf2a5d648dfc530d55c63ca4283ffb7153fe86a37a549878995e4fd48dbc816e3a7eb705f8373ca1d1c3cc07de5cbb5dd5b0ff68a8e6f64f76c60e3362a10851321383a7f98aac1e0006c0fbe193c2a7827a298fd7d5e30cbc661b93172e4e6144f6bf2d23abcb7b8740b6f8459f3bce6177f6d0a92a26e9683c76f0e6b615cb09d251896d30c23e0ec1ce88433b8f8ba00014382bc87e0769588b5b5b970046dc9274e56d466ee4ef59d4287185aa4e6b9dc241145421443ab0c631b579462513a87468a7ea08c4f76d2d4d788017a4892a4efe60207f7c884bcd6a72ed45ceb6e99246f18b0b94d854a27a1084224299ea2669029ed01957952ce10075804bdff3d4ae0e58115319fc146481902fad05923e1bdf3a1511bdbeda1ae9d587edaa02acf0ac613889c4ab7e8b5bdd28e85427921e15c0b4f1c8404bc76d40d138e5deb02d632d7aa4d2fe8460ab8136928b456ddd4f642dc24ac0e0c21946392b8ec5f74f4ee9ff0f66d1042333396d4cf14f0cd6c8d76746af2440d70b22810e34f5d34d679a82118320fdb397e65fe2279337a226161197e72a3146d006f24fa88647293d959d8956a480cee9c298d734ace59297f0e51506da0ae462fa966d869bcb7923278b4e74926384ff9ef102a71d74dac0290e670d1123440484aeec7c77ea1388214422c27994239017c1b2473540b662bc30222affca45b054fc1903991bcff310321fa37af7af15f2051d11d8b12a44f20ed4dabc8f4be5c2ed91c35e9ba597db04fa8c1169c1765fca0e7884446c4787cae17ea7970d566ce218de3c76a7e65cdce6eade69e8aab807093057f4489606ba4ef49e70fc78974ac2d7305cabf142f3d0277dd995b13eef79b0fc397b60bce1827bb75e7cecaec8ee33ef0e0fc01600c8d6e4961801639aeb287159f7e7ca0aa151772a66952ba9c91a803c59d15c81e2431faa3274aac8bb2feafb490f46acc508d4d018b39a140f69ae252f798abf2d3671fd6ab08995b4a4ed85be958b7f44b837453b6596b610b7abe2d06842fb4e95142367e80d2dabe6b8c17c27316747328bc93d665dca6280654557bd14caa9ed1c808bf12bc2cc47ef2f4773f7fe596dd6ebde449ca20bd3946e67074229a69ac1f08dee5d9ace9c3d9ab7dfdfd9771fc6c7c2366116ebd7417dec676d1ee48de0a4a498c2eb031c89a82ba8f6916989ccf32c3c029af45a08d0d30199897d05b29a120c299812e7c8f992383992324861d57f27a553cb6b50a39003b567a293f496969bf5a6f4a3a197fd41b3fcabad659b426398942cd8b79fda00d644ec1429e60c3f16d3000c7b751818a548722026deeae5bc9dd295debbf52296adfce9e8715d6649942cc23bf80b38c2dc82f8ed1cfa30a0d9bb1d8c4a4eece32fb7d8e3e792ca8879785151a0e5443b63f81c9e52f842c2dd5633ca97a1d550bdcf7b165cb04cb381984483f0a49e79dbc578ca731d0bdc7e48921ec371f40b28ca92b99f2c6a022c23f23f9ac8eaf9e9cbd7a35fe8546dde4cbe7024ef9cc1b161e56fe8d8394372ea871efbcde6ab292797853a8feb11fb95ec02ec9ffddef8eb58e94b949a33c08fcdc5190ce14b60e82ca9012bd9869f376b6bed0d8582ff1f782e2821fd410a5249ec3bb5ea0efbc01df1c5859c179a7d64d2645f6fa02ca93d88c998f644dcd892d25a6a9a449bcebbc87f4b0861b5af3165bd30638e61236ff2f857160a8ae9cf9309efbc8fe94ff8e6fc7454f1c81ddce47dcc0bb80192352b4e25554250151c21a21104abdbe8507348763beff441739eed1aca278a244e812e5efaca70127a16a3c9c64779b2de4eaf936e5f159f8f38d5197575fc83ecae499b6a0e427dadc7717e166009a4026ba04938a55f00dab1587a4fdf75d89ae6d0c9c21debd128445fc922804097bfe260311fb19aa1d1835c1f0db069982e7a9e2ce09ff8913bf9e3fcc9988de2ffc237acac8f54f95b6e1794513c89e2dad62b5775f588f5fc6d2a48a43b9174332040bc89a27e1512facefba82d77f9a3216a36f28271502bb784cfd5f5715c806f04b46273bab8fc0a8b12f39d4d4da79bdb865598a774e710e44327ca33bc39d70e93d36cd05bbc3d56b997d9f2ec01c46e64af25b6005091d0c04de503d46a046c9a146aa35f0b06a7bd877e84d2cf52d6bf8c353d807c4d962eee67f2d5aafc6071fd62a10120abe17fac0281a0478d53b37eba1cd17e31ef4af12f42f52694982300f2a046fb3af606a9ff257cfe9ab0171f4ddc6e45d2613c16fd3336394c13764b98a2fe8f22f85bdca4967bb7c0cd0711fdaea11f56be8dc79ca079bed6d73957d3fa816ae883613bcb98699b833d55e22167a4c5303e5a5a0e8c3f5f385b269b9297eaca3aa023b91ac1cfe193042fa92a26ccdd96f522d729335b5abdc6aab80eefdf02e85a97b4a0a21d5173ad451294cbeb99288a1d6acccb087a4d9b3218dc3ad84868b3b21d01acd4cfc3a97a3579f2f23db1d955307008d9251999d362bec24d50ce11038fff143d70b5b8523c60fb2f56ea4b5101046e46b219c09f181ab3d0c6edb7cf2c7f901427314f0f0ef6636f7d670c8b241d8ce9d3161e1a7d736e47135c6167e26422d684515dc6d90dde11f2a38423ef2cf9b25c8ce0c97d1f8fbd3f4b7d5a3cf97d6424bd532345c4e4024bd3ed6ceac4c922632d42bb4f187509d63f32fb0181cd061e8ccdc45f2a30702389c798490e9b82a0b4c23dae3bf95e246312eaecdda39d9d4b601fca0b2bda3d26250fd35655d2517f068927965273a9a6d14cfe908f0466befdee963b766bd18a85b9af93dae09688d10cfeabdd3405737bd9ce484b16184772c3a40c9695fb54dba677bd1db8aa64b69ef2069e14493e7e18b9e86cfdbbb85198d73a932a6e972d830a0de56fda439507dc95e27db1c1512774aa91a4042ad17e2c356e94cf3bcdd247b39e5825440f65552b006db2923cca9e22f200fb21e6b7a7534e67d5a79670cd03659cc3501d752613341c413558de1ce4b52d2d3d5243b0e1f1c3a3d14bc6ae6947cd11157040804d2412d27b20d567e0ba88c03c1b60196fccb44a43a75ea0d0b70e465bdbcafaf74df63f5d1f5d958a59da490bd166dd18c60a726d0b56a1c67b04241a7f169fad65144ba0f0150abcec159c1693089ee93dcc37c2d099dc7f68181971aeef873a7e20d7772413d5cd245f3d9a5e56e0807139872bc332ae7df88ff36f4ced695582e986706d686359bf23903f994e5fa239c30fcb3dc85d3f8e28197a50b31c58dd19a8d33286fb03f923323072fe91a337a8d63aeb8b33e35011db017acd3287ac3e222f4534fd097e102eec9f22031b0ff0eae8ebdda1f1eb36cb540160fe985cfa28b36490fd350b5fe78a76758eb8bd26234832075e2435fcae22f60d6206cfe7bad8e5858e17800d3f55cfed826b920ec582674cf1ffa0c2517540b3742b09f0117cfb63cd68b13bf61f10742ab301a859122d862cd2c9bb9a70e58cad3c896686f937b21f653b35275c7b292b044d0e82868467f5d293f6e6ec7370c9ee7721b44dc6f19470726fe79dbe51f2a03bcf462f2194b0caaecc00550ef59edc6aa9acce9c2128263b782c5aba11e01ddba83c94e394d805c635b5ba01d55742554b3f2c80a05ca7257bfda43583e9e5cec06d9d0d55fd36ba42bda87662243a2978ee3427ade52075573018cd0b429fe7276f9fcff19f5df1596d76e253f8d6228821a5da697abcfe70ecc243934b0f75361f607ab8a2ee00dc5a2db003089039fd19d63c569aed4795debd782b262e8b968c5bcdeba373be6a41dfa08ad64da32ef7cb42c13a0f757c13e2d40bd8e9eb209b345bbb422ac8627f20b2d3db75f7f497f338f96ec013c81044e5761f0a562aebe1471cf5c47cacfabaaa93f9d659a90c3919f7fc4a9a9c1fd0435cdcc64815378aefeb182c95883cc6e18032e67067c59b2ccc094fb9d52f571873fbb59960050e2a04bece86a4d23640a0e251ba502ec4e2b3e0851ca98f88bd707a0aa4f2b507c15e4b6d38f2aebaab994ff884cb4ec0b3e7742b9f912bc63db025722787b5bbd7318fa362e83687e33233fc419ec2b65336cc88b10c73944f20ee4b57cc6d01e00505b0197be281a316006deb57ca466fd8e1c67122a8d95289f1bc4ebea5f30c3bfb7bdd322a4a993560e075951375fd901ae2a6b531b35ffb0c0797b3aca5e13d0063ea60e2ad9af26e2ff31b6dab7d7705e5475daa187aed78b2814c460742140e4375f9feeff8f0e67750bce584f0c2aa1627ea49f7cec1fda009dc47479359982a75c0a0e9e62e30e8ed113053cb4995e04997b2d1610fa58915ea4c87af5ef7e86d839a98a42686648e6210220fbc3392815c72d67a2e7d9d84590a4a733c4fe5e539ce418be57eebe16b2d8059d61f61a6f4c9a314d99973557fb2a57f54e3ff24398954d71fb9403ee44cee0e83dc8a90af13a57ba60b9040b575ee7045246e1279439f88a875d9dcfde6d9b132e46cafb43f5353a623b11b0d357e19470f764a53c43922feb3a9995bc8535ae4e577166837090775fdb4d94ee07bc13e780110207ca424fef4cbeb95bfe4da4fb151a8b3f2e864071a964c4746867f4fbc091b62a30860b9d61658f14615736eb244cc923a16fb5462290769d4e9cef84918aa806baf16cfb383397165ddd39ce9e9ea1524133eabe820447c1bd50878a1569db9fcbceca624e9e7695b7cfaafcd2e9ff876f05f6da03848caede660b8bba9dbe898ca05c0a076ee95ff213cad1b3854b51349aebe065a2b1d1f5c9ab080c27a15a9120ef9193eabe60f38505f62d3d473d9236f81d0a359c506eb4530185b8071178b8545df1f831e93d3992282df185d698471522868bee153dfa1678571fa9a800b035ec08d37f62b19849410db87915464260c7678b485e053a90bbac8b364aefc448aeb176231eb7800b17648023a9acaa69c193b9fff902f6f1c09dc10141b931f38a53860f20c57f3b2f2ab8e0c0d858a13ee3d0f73395929528854d9a2a8fac97fdc4384516ed54c114c96dc88f0dcdb2f921be29778a1b61b2c4b6339d6844227a7bf3b8c344f0b1f2eef8a27048ea785c7181a018721400b1c4b604497de4546d954c76186dc12986cbf08aa90bee611ac28c426c2040dd29e8437a2d11c29a1dac00476012338911e0fa245df97a6cdb8ef23d13506a838f19c43fd33b11476782d58135ed7189da165e41fa04890f15409062f391e381adaf33619571ccfcbcd60742e2d430dcab8425ce7dfbd46ef3a72e027a376f1a2fd1e92e78b86d5d82d45a66f9e55a32fa4b0096f5abe089187c8b032b4b9f224042bd0a45a5b6fd3e29c167b5e715cc89549fb40e2e4e96fbced9de4b4ea8e4018c665d17d6076208141a94bc5362583b2bbffc9fc8d79306be6a310c95a9b6be38ce429237b74c332e1ee1bea197917a1a2e4b7abf7abe3eacee0a945b138df1fd6b8942788cad7f116ed1dc5a419b1ce1fc3965ee17a3766ebd58c5ab61058cf6ee1f321c518614646cea26911914851c312f372583f385e79a1dd2ece6455dd30245dc046742a8b25763e6cb7e940432f46d10c5be70d81954067ff3f9db070df81cfc4da0db1d2a733e2770febf22858a766e984ca8b7b607cd749bd3a8ea0147d840bd24ab0022688bf942b651bc0a5651a479392eb507da1a3d9de2015e57b72ac1abcabe2c407ce6894087e565e27bd3ee9eb156d384839c01c5357df067e95fdb896b956906a734d5f6cf767882f2a45ab63e46f984030ad9a51b82e38ef8ccbdba7a0617f5ff499433d168a7d60194c076c3a66c1b52bf9cd0efcdc4cfc92b7f3c7a4dd0f7a12c1cd58a477a072033c156a7fc81ae128b9b3d50cc41acdb56b129ec2edb6d1b81ecd60737217382157ac1ea63e56c28f82c6d3facde849d4bb5cff9e749a88f7afeb464225d6f334c03f70b3da3bc743e7f7c5eaa46937c4e412a498ea1063ce4115d74565faf6f6f81cddac4595a32ab8f9867494e4793d1b5965558e264f7b65085441007adde5634feaebaca9cb0c4fbd33942fcdd7ece91664c54524f00d6dfb9563421527dcd219ff54b2578dede9ab9e2e01b5e5012385de900747caa4eeb772943fefffcf862be39080c2614c4d2d02ade05f30129d01007643e2e5105de0775f8f9bd63a83be110ac8b47d5c1986fad0fb3f7cfef8230b9e6eeceec85df2758631b1fc5bcbb91a3f8de6f7251a31e22ddf822cadd66adaadccd0a8853cda0ea06e2825aa6a8530412d88cf37845bc0443d3de39f7338c5898f82c268f60278d366235768c692946009a93d9f6f21ccd38b52301dab871016fe534b0528cde20e8d30bb8b3143875d84aefd0e2264b39098578871d0ede2cbcb274251ee0ce92ded6edd794089b7f9ad131a1ed69f349ab91b8d82f2cc76d9e3ad216404964d2a8d2e9226c3121730770cf43be4ec216cabd1c637b652c15964bbbd8bb22ef6080eecfac4b99bf87e16f4973299cfcf0d666317b178ab8c56b3ca8d7b0da257ae7f875db68ec2da25722ac7fcc1a1fbcfb3b8b771db8f6b4f9d079265cec3a343fa4a90c8281a3e2068d915fd4ccb1bc8a679e11595bd84f9024404e986316b450c87352f7e818a48083573af94b41571ac81aeef6c9c97436e622143bd2fdd82a54ecf0d3a254528c0218bc322cc72d5ba4e6e737cd1321b55145727772337b5667ac8a60b783c30130dd7961b2e63159cc9ef866219d2e316f5bb54cd399a4a5c3f465b924337f1f9d522087ef76bbe4a605dbf72ca09ef27274c77e765df97eb974f84b39a228f65d5558439cc7259dc4ea0b308c2afb7346236496dfe89a4b4986558d6822fb409ab59dd2d9552cb595a40b83aa7bd1cf0562bc97cf704f25d710799dbea51cd0cab61d3891a1fdbbe46343c593fca944acfff6887eef099f895a13772aca46265b3a87d4792beabcb97827205da5b93aa61275f2f619743caec9327fa981bcc549393c0b58ac2f076f10506378bf963cbe55b0f06c9a71c251d22990aee58e31587857028c107f5e610c1c780b378e78bb2b761aedb9e764cd7bc26b5425197ab833892b8454ab02e91215340f032ce6f35249517289ff62266a30d636c532f065b5540c1c55e746ce4c605f53f3844dfc12c24c4ab941613cb2acf8571219a1ad04ec2f5568f454c089b82186afa26a0b8d5ad36a79d73f1ab9a9ae3980e41ac827ecb5bab47a86841f14134aae92f2debb3813f315d909bf3dcc16707ba9fed3f471ad442108468661fcec68424f7cdaa62cf35a2b355437d42269a551f87866cec04d0e421aff55f7c80ab439ded71b50dd03365fa71167537fc450b83fa442e1c91de25c09d07d51bb1775e95d75e74420fa51c71770ae1c0830a56d648fef688ef9779406ed4b5e965a9a667947f28f241d0a22e8f01df4c18ef4e3cb5304ade9fe45747050250e64f9585d5de7f783b37ba9368f482bd5a4d2d9d1ecf819ebb0be6442a531d7a1c458078e399f37b4f251adb56b7c972355c6a0de6b7cbc740fec8065035d7166acd87390f13d5baf7d6edf176275181f288cb1b24242291d133d8838b69e6c9351f090abf52da73ee16b8a98c808a2afb0c486dd186e245075b1f28d70068aba8b907215901ac0dabcc3417f08aa1fa485941860865dc0d904d39bf2f18fce14030ae958879ce9deaf78b83cb4de9a57efbe56a7aabd834cfcce75123ca9f036f3cef1d56937a84d3bb92744a515252b0f3bdc9d82a03ad639f7e13fc8d6fee9aa8a561c787c391d237f4ad892f1d50e37284ccdf7539afa53c53bf97326d72d71a9b70133029aa169b998c3ea757dd2555180a4beb95825c6f39bfae8c15bcdb4be0a6cca7eea462f562ab23f53ca0a800d440746bdb3b4aeac234eac7acf05288181a72ac40fe2a8e0cdc0ff5282bc0aed6ed99b7f060cf92cfd8beea2ee30b2463bdb8ff236ac3068ca5d7c295ec61417fc6b802f1bcf425bdecd2342a962d2ee7ea00e1850830e5f45667fc150b30f0fa2effe1adac431da05b4eae913636ac6c69fb9666d889ce21a21725e444355b200efb4d9296738840e88ead1798cfe9dd4918ddf02c78dff8bdfc382287fdf8980d88b513224cf2afb3d73f248b99e3e97eb414ee266b3cee0d08a9880b0acb157fca424420319bdfe587734d568cde589bb80bfbd79924e3393ac550271e6fa13d70f8491a276157f5fd11ab6b09e94288304486bcc2b636c79af0d64496b7513f6bb34ae9a656e5d0e44605852076fa4c606e5d9131b9ac6f1fdc4e415d663cca6e76fa6a43483d97f17e4de38104db7974643cc068862c1c56b903cef19fcb16150c0b7c7c1172c58e388c33a1b55c728ab95954c515afba56bff5147acf7f3005942714c1cd3b24ed9f3b4b8418c5d6d3a3442d7cb0870f0a5bca6fb4ce31c87e59f320c34d57aff72e2c7de0eeb3998f4a5841f949909d786932b41b05f2dd4e190ba7284045fadc4c0b057c79d00d30e30aa31dbb02c5867fe2d81612eb64316979adc69f9e7668d12aa8b1cc28e7606aaf8a03f11caa67ebb821cf69bfbeff78c544759ab760ca211defd33f0018adf69eab503634dc2958a0231418fad840600b915ccb318193d0716f1206fec5846ccfbd43f985bf9474846b710b5456b9cc2275bc9bc83375e83c87b31668927523d50bff35ca11d8f5c2d23e5423b3a9a496eaec7145e419425e0b5644046c1a60b363a6e06ebbd668138ad4521b1cf09f591a80ed36ae37671b90330a180fc97be3d579940fbf9368de2178a087ecf9eeebdb81fe6e8e2f0549f7ca790d78914c4cc74731e092033f57d918e74fbb664d7e47760a6e1adfc6e67706465ddffa05dff9435eaef6b218668819274764123b4f1a1f1c16f01df4c102efa17752d0357de1184d5ac0b72150e56394c09a8007178f014905b420c81b1a457ef7cfa268cfb4b16216a8238b95466cb11e02824feaf841e7594a65eaaef75f6de5043db3a8dbba764e98add0dbeab420a93f874c5de458fe73e3b175df6c97052c10641d7a8ad310f4416ed84e837c6088e9685394d9a41d8b7e35fd49de1544c90c6113bb16d8cf6e7b365762122260a6c7ce36ac0e0c914e558423791d7c22cf505eb6debdc82c15eeab882e6214e018be2174ba8a3e1f0fdd87c9883d5e3c65cc8c649dcd268cb41f3488adaddde719ed5fd9ca571126cdd6ec76e9f1e831cddf9bb932d26586f934382e15038286ca068160636beb3e1af45c45b42976385adbc2c216875b1d4c6e743c21c241ab4c592e9b95565d0dcbef265446fa1aab340017c87a70a9aec75a8456e52affccbe4011c71287d69c6252acaa8ef47131f1403ff927ac985c40d724e5685c3f482acda6216710d83351c8671dc4a2e693398af92ecb0c9888b9a664c9d70054287738467f9ce13902ff41f4b8f1270eadd50f3a6f3e255275795531eaf8caf034925caffe36343540848f6e6f03033cbbf9c517e06cba124401b2c5985ea60eb52ad88ed9af17b251ba2ba3c59b0b2dcdaaed59bc3a34527f2df832a0d0d6b08cc2e801d332e445e921bd8de2b285d0e4e3d87b1d638aadaf75e0a265b5e1b1170d80bd73b8ad3342a7a981d43835835a62e1c73f3ec7293eff4e91607bb9a365876981a3c93d9aff0831380c6858c6c45c54249843ac6693d530f445dad5afd0f1b7316efc5262225b79cc44942a88bd00a1d98122b730cbae148b7abbc1a6a8dc454d53ef6ead421709ef84b5e7ddaa33c047b3902d4c78c09f8b91f4244068c3dcad9da3f3411a75380ff86d46b50c15e37da32d5869b9de60b907154ccbd6e667c4ab8ddcd730b23d96d0c841932742ec4351e58e6f878eb3d66c268ea3bc2745dee1e8e905293c647cfba938cfda9636868be0a645249fa1165965e02d8eba91860f28cedfffdf435eb5b9c5eab18956af4ea5c449435d6d2927b8206d9192bc0bc1a75f98ececea21d8087551e8b709279372cdcea4f5ecd29efbb7261040180448e293a7d2e71fa407a1962e5c970c603ac44fb4636b37582957b2b7eaf93408118a40ecf8175c8c3d4497df790407182a45f4ceaefb4df68294eec6f8308f5ad7808de8af5eda19d1ca224b3dda516412d2eb76d14bceaaff94ecc976b7f0a761d712825373a5a634245d2df02eec2950c2bd5c125022e6af75f9ff4448cc8c84c2e3081f7e4c1c3c4fd8439db822ac30ac24e8747269bc72b6c71e2d6c6a3720cc54a1d95636054a8e437227c09fea15a46b214ff445dd91a1c8f6fcf5878b6ed8e624aea8777549a80106e5e9b9428e64c3d5630878c033a0e14b5bc306102f380c1d7eaded4ad20b92660fcdb1fd8547d7fd7663bc1b298941b1b4bc15a6964feee961612cc398ca14a74c30982811db9cafdaac5bb5e22d3fc055738f42853f6007fbd198d0414621540386075ebef65a953cf072321d8c2cb8fd3b9f114ff88bca9d0717179b2733f83fbd6ef6b6f645605e3e20675e4b7eb519eb9bd0a50e1e73b8b93418a1677e4c42c371e720fad30134ee2ec4130fc7157f40817cca05ba1e6e585bd8aacf73c0b0ca4fb0de263199277e772594901418a7bc92ca3b787cdf103910bf7a25a48693501f0c1d3d81652fc7af935ec8aa70772d64249e1d68c1c5ad5705e67e9af387a7ba1faae7a69474dd10ca50c1691bf1dd7ba3cf0335ae341701db62bdf231219296c30a991dc370994a08c9204c00c043ff685dd26dbf4298a005cb2352fbd453abf8303739e2731c1ea0406cfa434550a3b93c486a8563de78e8f02bb2ed5ddb358efd6ed39a7610ab2cd00a4c5f29323a0a6a7783a5f5d1e43f88bc428841b0b46bceee1f60e52c16f2e833b15c48736a62050db111808952fa12572f9a52c7f5c31f77fa8159fa95e1d0a10f9e2aa831d98c8d8d2d97d1aa768694de823e78db257ac05fba35708acea795adff54fdbbd9caa9329601abecd27a679b75c53fde5386ca188d83c02097b82064337e402f58df7c1ba86466fbf23392b3c055fae44d72e5c21acf8e281e087b1952be9500d93c6d0d415c4b1fbea5f31dad8064ab7cda41b8eb8052285e64fbfa6fa12db84230c47aa582905926135766e87b4722d8d78ac1affd2318b5b52d37faeb2ac6cc36095f8de3be2cb7a8dda78e6642efaa0bd3d8866509d622adec0d6c1b628f7ca3ac62cd898a5cf870557847c6ea326b4cf4081e2bff183b45cf2689d174562538e34325b07524fcc8cce4cec5fdd8d74c9605d62f93e8ebdb4be0944583dc1d6e2aeb74b6ae978643ae71342e9e1072d717881d2c1e488e87d8b31a38e3e77c37c5402851573ba66482f175f1327174469b7850428a026d8545e9e150e8c739309bb6867f5a26d637eab865a3d97ed91520aa9f8ea9eb1e80ab7c4d7f5a095dcc3eed11427b4a02b9bbb9d7a708290793421ebb69d827d3cf69bbc755d9b7d90320cdabe81a19479639af5d8926d99e9ecd999333e110f4622ca0cd1d003394dcf4547cddc0fbc157709590ea56f1a39e642d0232cd667535b2ee233025ec1846f80850747034bc1491e5fd7b09c3133c0b3a04393f788a5f63d67bd70f45cf446b07e91da3797b2e485fda1f60344558a7a24c5858bd753b422fd568ef37992782ed90b811e3250e1f61ff01b7ef8020e55d76544c5277befc6662c5605d3a02944d6e81cbec2133a9ef3b9a686ee4e3ab58e8ddb1a082af6d91a2686c59b041ad900ba1a1ba9e867b078c3086a5fe8938bc34bf2719610e9319b2692a9f3e6ada18b014ef59ffe8503ce28775d59ec62347bc9ef646f35c099350391354d454852dcbadf2da9f74ff890847c6ccc0f304061d18d3e9d5d1bcb7bcff2ff297c48cd3c2a9930b3d55aa49856c2696c98559990909d2d966407e2dae527a39074863b15186fba55d0c33fbb46ac4a1e596bc647552447e9fbf93e70fc89a88373d8a19d3c29ce4d980b8580e5bc199b8d1f166f60e88e766c1cdb658b93a82704be97e12532141a409ce9a1767118b77379c57b00b085dc643f84a849cf4dbb0b00442a8be01b1496ea5b6f21c43d2f85ef6265fc58ac2a29247cc8ffb3b333daeb386f42b816ba68fa3373691ded54143ccc8473d279a00574a3732f7ca0217d431907e7ada6237ef2e556b04ef999b41fb5d4acd9145a54152367fc86ee509fbf088dddf2c486fbbce8293f3e248046739346f891cb428328e5a161a3ce49fce92410044922346c480ae00523cbd86c2ebc962ee95c6dc4d36447ad88668e6fba64c41da002e371bcc83d7c9f3df5685cae0581272b923ca29878e19fe6f16cfa72ae1dd24dd88aa3704ddc26e2164214e4b9fdc6a494ca7986df01c2196bb6062d34e4c6b29988c2b68bdfd96840aa8d6998ce2058294614e0331ccd2e8e86e5205a55a69db78afa706de10a4c1766255f9a71effc0a29f7c49fad73067d6486fbcde0c88d15e54f3153ce8eccc76a1cac24ba2f710aa16e1f93a1a235e628940c05b6a4ebc53073b767de18b5aecf118afef486fa033b451f145d2c03ebdf47fd8a6a1a42d05d4c2e28c6edd9c0733fe8bbf0f7d1fd1710cdcfd34eb82f80f0b42e05b5d40ae7fe7823deaf5af004d8cb50d8ebbe9b465882c2fd0267c82edf7255df91653080e94d0da44f1919241ff187219d33e385ea43cb36da7e652b3b5b9a229c4c74eb7f1a3011e2cc2edb93fdb00bf7fafbb28d3b5e4d626b29cbac94ec19a772eb7e27dcc38d6309b5feff03bcce8907f6b9720b02f08a8456954cf7718c04461c44ead0c36679dd414eb34f03f29d10db68507ed1f5d08b3754b4974feddc85dd22968f283fc83ad2b4a7feae9e1522415c7f0f818df363b01c1dc9405c5bbab8257ede9dbf02e10736c14e88b293481620719a27378c3ae015357ece9e706a8b1dc8fbb5a2dfb373f63e84bc5393d42d21eee4b5be99e6fe6fef77746049ea781930ae07f924b745b83862b6da37133aca7b6745c46fb035129352a45a7566ef3a53d5ad265421521fdcde90d29849ba7ca321206aa343902ad0efda87ec812d39f512be76121dcce4cce858ee66c743d37de0007e8a63f3ab0fab3e87a90a03377a8d1f38ee93c2b7ec561594e62b43da5862d51e14106bb162a5b54c119e03cd16b46d90b1567f4d5f22e9f8505bfe26d5affad99ba842cc72254a57465819b3484cefb02ff4324d7418f6d5d50727da163e032f275183a4b2f4950843a35cf916a4810aad2580b0de2328d41f4ff8f224cc15626a226da66ccb21869166bfb00c144bcd5d2113aaea3a6652644648b4299440a4015babfb199cb8b89eb599a956eade5e79e86cf87e4c05dc753c749407ca82189741db092ab2cbea875cf4a60335f3b61809b630e5754513b4eafe32da1e9e02bf6dd322f64155c1c17819fa76cbd196d192a7a81ec50df7ba0bd91681aa065cd0511cd05be43bd1c790a508fb131f91d6b71545170cba29c6c69665e01d6866c24635cfb50c6d24f83368342ef09936e31309ba3ddc3542b40aa63cf3ac272ea028a9bcf50b89f8c9f4fd8fab27ecc296d5c313b8c925ede2ca17576e428323b4476252e4a13752d09bfa48b6c15e3df8a3beb91f9c5237fd9df890e5af4a30bb9322d09f193a0ecf40eac9c3654f5fe88e7fd702bfa8c2bf5afe1ecf212d1fa20e1bd6236d709e286f55bb244f3521ecedc94e4039523f55f49c428442ae8a72cb8a104ee227c161b6e48d38ff676d8b262f5476040e0b025d0853bbc9a88192b927fb1d0d770f74b06b1b76c46dcc9eaa6cbce637aba6a980d1313ea76183061f793fe3df6a2c7e5badffbef0cc2d4a7272a3d781000874000c6dedb13d8e65574b3a766b6553b72b93e3fe81c85220da7cb4627ae062f90db660cdbae98f22c173fdcfeab0214fb35383f197113e96a0d2342fefa2f75e297a92e8c65b971e2338862af1a34b2d1eda3b44559edf38ad0985c68d032c45a50ab146d73e106905515b086a56a2efdd0a59bf7f20010a8a6c08021080101a806cc40a5a5e343aee2824b13e7ed4fb4de0cf1398b32fc5a5fdb22e7730f36fabf13b2fb370c2f839f5d0fb6fd3682a98d458a311083ebe20f8476b3abe63c6f9782b1e3e21e6cfbf16dad7bc61747f79a13313874ceab8b619f97b9110d2d07eefe65d7dfd3c347980634fe855caf2796d865a3258abb0d109eab7029d8453cdba2d0b99585cd8757816da59704f028b688535d5a7105a49b6c4bcb38912965e064b485f8599c31808f6b13a16ac2546a24668a3f1a9fb26b14e0b1a3dcd0250192fbc1dfb33c48631ce125084c4fdc2770dc8ec6208997a1bbc99f14eb2bc3050c5177d3678f37011484d7cb8f8d81f8f14f1b9b5a559c210e858480f9ae76408ac7431e01e31317858d4676f2550ea4a5e59a4da03cb11f68fd7091a1489a2a391616171a6ca733254f8d731ca91c11819e3135b2010f54948a3853b966d55d8c8c993e8ec1ded1efcbcbdadcb0468ce3cb1dac35561ed369d3f6b655a92960c4cf4520d0b7fd5505248d7cf9825c5ea35d991db943bb42a867255341fa9a9381389353c6004df18f1c629bf2de786a0291830c7f1f6bce65e2654f7cdbb3c4dbbdc4e62f7417e53d9e8fb1b8ff0ec4a9804bc2ea029561324292767c2c92ee5d31a3d1273dae232ceefc3168036e35723f0cbacf7ebd0a879f9f7bc0e24c90def80706379272b9384682a8d58b6cf28bd17fdc0a04d9e14b3330275eb50a5a9f1ace136a98358f985d549853045e5c0bdd61cb9b01bff8226a46b98734d51dac928c3806b1ab4bafa245f658c33be6e0ff4103cbe7806dea0f7071ef60a877757fc64bdcf2ab4bde05e9fd9d2145ff576cf0b3dbb4b0c674588216bf5e381f506895967ce837263f94095a537b5972dfc5fb6de8d99ea8b8be00fb04fd83dcb2bda36e420f9d87e43e0c559b95605a6effac66372464ae2680c45c67ccd68996e21f080416ae45bd621de88893d537b4c70223a47f8419ed20cbb6a19a095f2122b5df8306b2e1e665a5300269f399ac20a10dfa85252a3c8b70a47e6c11391cfed49f06425f6f140524cf2f23450d975b62303b4f2b478848c83e879222654fcc5f7cb0a34499e3ced1800722da54aef809a9d7654ee0837c41423145a54d1d40d22719a9f659156e184f406493ff7e48a0e37f31dd968d990a1edccebda1f6b55e6f9e46646b5cdad66de43718de1eba0fe11d43cf38a6bf428ce5e79eb2332d6e50583c7baa349301190d3e53f4495f07a0966c47d800dba1e53c7da241287cc77f5f6cd38aef7f91e751ed918af8802a768c536d19fdb15654c380171303378b6fed33cdf61c1f526f61b0c3e9e0cac4bb88de5fb55108f35d3ae47d9f8914c3d883b7a80afd4c2875a38d166a98d78169c448330b8a07956ba52845c1145a82f19fbad4ac171d17940d5c449e7526bb9f7190928123cd98d8a78a8eefde90be4ff4597ac102432faa1752b334b05b7d52049aecc0acc9934bb486300a23f5aea60a754ec895f1ecbc1710a32e559b79d2754acb000ee648ae5c782425ce3dc26a22d85575a8b02016853c471e05f189507f4ab700a5177ca1d501bbd54eb93e5c9ee92f79f79fc5377edd7694bca346cc67a4c0baaee03354f57b8d57b065a1b8df0131cb7583b1b6aaf6f8ab37839006f328aa6b2e5f8bc8488e7f90307a4917b9a0f78cc8b2b2e68d41363dd29d0f890a84f3bdea1cdc0f47fd620059c90524dffbfe9d1d9c48fedd4aed0c5e0dfb4c81b91fe9f4d0b611d4793dab526423dfab0d530dee889fedda823ec9a7213a7323503da49125cb9d93b0dd4ce641bd815a9009c9cd769f32de500358b1fb01e023b54e09783820bbb25e2009f9bd9f8fa8bddc64cdc90180edbdad11ba15674c9c8097428fc49b59643b68a11c6c0ba00d2a8a3001a9b1e4352b31c639a57698a18a049302bc95f78024dc9b9e8457723735d60fca2f0b5934360236fcf1b17c044efb507a6c3d69b05659f538eb4a97eb34636f6053f6619ecde2aabefe6409051c7567b17cfafff93111130a7f84270d91a2c758085cf88ea878e70ed4ced7f3641c67eb2545f2c76024735a274d3521642f6582ef7003840e7f012350fd514b72fa66f59bf865084857c215644edb9e0e75143b1afe221b345982588049715eb0042126ad8ddc70428928f47ed79579855383c75ab7df7a11e9216e995b1171fc55031110852e893950457e423f3bc861686908a2af5c65edb2e5c5716d27f0dc175e89099c8f3289042e2a0c7b8dad546a5097bbb0ec5a4487a97106e3b1f2cc81f966cdadf47e9fdec40623634911a9ef493476c39b3b15a29312668574853ad0202c24cead2e186e39477695cbce98dbeff3d1086144404927296824b84b6b28886f9e7924bb64b550c174dac2f806f916e78619d0b9bed92928fc9319361dafed6f682a839ea049626a74dd3accb61b028968d5fd162684a6357d5b221360cd8adde9f6ec52b803aa2c9d2f9f2cdd1223ecfeb212bbae78329f07a586fcd016f75490fc943a755ef7aec1fd5dfacdabfd71e92ffb00e823afd7c7c33e9c32f7fe0253978f7b654063bc766a23b5848a6b91d151cb8c7af5d49d2142ea518e2ae2424ca8a90684d97cc6c13ebad034a043fbecfcfe529b5cf75b6139cc4e1f3fe90575c4b8d06c07f4cc465d02f074b610be717b1123fb24245fe30c411018e4838b2eebc7c65663494790e08424abdd84e9752b0e689dc6539b802bd2daaf9bb9a24a6f322add96b80f24e79d499340823cdf69f67faf66ddc92055941b9991377ba0118ea86257132e7f99325715bffa7242ecddfe8051b05bf16f8b21df98c78f25eeb125537534032ab0b0de1b9e4c94064172e37880f05893e818904435d045369fa78cd80c2ca56779b461348d44615ab44dab10bbf7fcbb8da1f3757901a39dc4dba0de65b4a3362ecb07e81623a2d7b05685e197169311433dbee448ba93e80b0d0580e5ed231a4fa78251fa02830a437df8e76c668e7cf8394c3fa838552e82c97be755536da9372165d7afbb2997931d736d5388a732edb5aa54774adb45aad60829ea0b56d897c9060af9e5763fab6f5f231c115fe5ede8a6fefb9669b8a9d6f92235528afe5be1c19592e317cde339bc2fe9f5b6b40f00495002320fadac0855ffdb593c1d459ffdca721f624ef1d47d3f4e3329269480274d1f7aec1c86c9bb65adf4a36b06e6cad4774e7a5c5636cc6e9b1fe5ebad9cb30f5afc8b31ec16dbda5e3808ec9f5a9ad1de5fe8cd9ba29b295ca25a341833b33e1c8745eb44e9fb910c438545777ec875fc7ccd2f79d62f947c82e3f2daac82bbab2ecfa4ed3f39129e1c4a0f91eab6bc8a7303ecf55eb666c0039a9b733fb1e6d7d6cb0a852a26bc160529223f78dcfb388d6a0ef4929321bb8b561c5cfa2cbdb04a23d500056f847f393040495b7270588f2f7477cc90ed91093910b093ea510c4b96891380d539e1c971de0d352475838f22f5e4d10c089edf27838a0ca092c700f88401b62a8e62a9578cab647d1dfd53b031a7602751983f7a852f444b6a50651753072fdebfb67a86e420034492eeb94531e86652e08063233c84ab3121def3794d54189b08c3d55705f0af6d4e664188fc6115e985240238afea4eb1e26b91a0f451427b401dc1cdc816fc7f769ad463900d85563fd950fbe0a51713873fa97673e702084b00bdcb4028ac0a5974259de8657ab5b5e0df66c28c2307896103b142e4024c6416df4e4cb1ad934a348ab4a94932e75d063b71e8557e3bfea407e774c434afbda9a418a5bf39ee37e82e9780a67f94cad916ba6ae63735873528318180a8e7a9d60b366f2a8a05a2b368fd36685d1546d88218e7ca99b585e0aa228eea2aa8a896c77ec2569c9a6678e441f6fc44c4da7b3c8eb805e711adcd0d0ab0bc64cba3134a046752d2911748f5e07ec796837ab7787fb533308826a397686a53411d731d341127bd62d7a469ade421859f4fac7d3a7dc3f79ae824b8280489aaf45b7f1b73aaf82900f6bdf0340b9443f242c389449efd6ffed88eb38de8547afd55f7fd59e8c064126d094fba943369f5477d963c36fcad0eead625393ad7b2f903e7e0d9e1bf43618bfae9d5ee9743c7aa7480120cd134ab8ded4125373a76a9348748e2b9ee43ffa54548ddd175aceaae045fd32b5e94c68a131c41fbaba16667d2fd7b7feff6aa5596fe79dc5ce615f045060e625b1c285173dc9a73b99f185d4f2d279723b8ca243b95be151197da9b8597377ad361bfb0a0d410919a6dd4a3286a25a8eefa296a93fe629d8eb688bae4794f99136a78d698a8df0933dfcb5d0324b6431d377597cf0d1e24d44be50da7b00153201b21d885449cdcef7e26995d4a94227a69e1eb7e1405d79d18c4e94b2c9ac9e2b23c7a94d58f3e81a6e4b314ceffd6f162e50d1e23b846049a3a0d3bafaea480a85ce017355cba563cdd96c99183affdfae9dfde777b66bf583c41a6d3a7ab41380ebfbd63ea9181f0c65f0cfa68dae9395a7bc11cfbd5f94f1799a501554c5a8a3226712753f9f5825a50620fd1c5f5723bb34c2191bccd6eacdb2c3a0368d6f8d0c5743d25f948b9a80c915dd3edcdff42ed57d2bf4f8aa477aa7327260ba52be9d409abb573f56be311b55d684f637590e52433bd3280664215d502120e5fbc3f5763f1bd5459233776a44ec8e0348510330d8f20a69fd03962fc18422034507b0e4c3d272985b72aa94f561c4841526c15e268b1c6b8d4be47ed3ed765da7b6843605b25b1ff3741a6146f6958698a46c0f61c10c205145ce2cf79480199c94d92feeadce8a9b8c34b8c87c6f807e81d3bd002fa4945d012c1b1c2e5dc9d45f52f64b139bb436339ae7a1c4e314142e0771c28e27bd6867a53cc222848e0d292c2e70d9bd5cb1d3f9624844fbe49fe02da09161a4bff2ab56d8f1c6c3e71f8d73e706a7636b9a0b88826fa8ca7b121c5e7fdca80e3fb7c1bf48dcc872655cc5c6f4176d3559e687b1244836a2d44eb70aeb1b54adbd771984ee7ff0b415b98d5d8957032751bae77226196c48068c4287703c0beb0c20adfb11462c82f9d400bcb9317564292ea9afddc9d177b9f8386dc2d2f9c69b02f3f1fa2e7531c6c60b03447f5b98447d049902ee5b53ce9a9f54830a216ddf576fd2e17b5db6132c64f30880468fca4877015f0a28ff55753b1c535c8170335445a27cf6d07cb3c939d3c0c3d679245dad437ffcfe59853eeed91fb83ee49a4f5649563ded657a3664d269e902951e38e9c417c40fd6720c7afa30007e00710d9f3a982ca771cf6fecd32d7596b86158c363becca480d3b80a8c0b7c24537bb607a2ce0fd4c1883f4da984b8d125fc814fd6561080a5b202ca652c4e2540e8a8d48cba462d61c5039c6865d5233e36de07f4c615b3483be1542df8ff8ff65f86d61a20215b138c2b2b140568b66f216cdbd5a9a0e3592e94faba56e4f168740aecc849ebf695bfb49f234bd649ddd63afdac719649d09dce8a0f647e39906217fae1dec1acc9585f76ef418a4da92509e1aa3cc7a0d9dcf8415f0f12ea3b248132168dd3128eee5692b7d2223d6f45cb809fda742309c1a19595340e46e4b677d561018260edff6ffef213acfe571496f5a3c6e67a350878e0a453a9b90feddc9cb50eb919028100fcf9d7776edabfbaf25accccb4bdfd10955bc9dfe43e1076a980aa40af6cca67b53a85e2c343e2e1992415b73e62ce5f216cb6d4cf77200d6cc4ff87e99236dcd4c7a0ec95c92431e005e6ab49304298176cf475524f34a6eb5df593cf841b844739ec60e7c3ffc2b6f581c473b06251131d82cf1e6e26b88e2df00cb4e5e0eaf2f17700b58c674cac2ab08f7342bda833b219a781c072dbda63369206ae069bd281f1d886807ed18fe386a9fde17b18774025f3c6cc9f97b7906c2a8620581e94b79957cabaab202f045905c60f8a1c78dbb74ea34ed95ae7a1f35f67f30c2caba2134f4bd32cb4bf81e2efb72e9fdb8e57a940be50df13d04f39eeab82a8f43461918f71c8d175b2a7fe098f39ad15b26b4a04aa863ce508e5796843465b81477cc56184a9905bb325b412b359510ba169ccc0e46dc4567734de9dbaa1deda791b90bd5adea2c7c7d4ff42024430778adc3eec32115992595793c6cca2774e42e714418a6d84cc868489db3d3c1d1c934cf9c2bcc43e0b1a7e85452bac1041531e5d9206f514609b98ac3c7d410cdf717128bd39d0ece6f4d377d6eace3f892d6f973659efd1183a3a9ecbdea46a6af922a53f1220d4347c8268a784a00f1933af4f9a0dc251b3dbb3758e77d3914a51ccebfd593b07f4140bb1e08c32ad367c193f5322699b121557c2b732e84a9caf5c77bdffb3c6366238c5d5dfe6f060ca8a3699086e1f6494b74b02f49caaeaa880029005a0552542b667320a05d90f37e3cd4d1d221cf2067b045b7255fa50ba776df1b0fffeaa0a046d09a8f13520ea7e1884c5fcc1d1c82817501649a30a6df415bf403f528d7cf5b127db1805fc2549947a3e8cca9890b0fdf25378d7d136eb44f0e2aa046cd56ffc7026f08d9c630f90b750c7e56b22b971e06911946620e613d4140249e6a2fb2c0dcfdfa0c96ee8955af10f1d19a06130103cb24871a5ea018373992df2b1246e544dcb5202fb9c580fd626f79781fd7e0b4d7492aefdd5508287a0b109fb376ded9dd58ffa47a18b066069d4084024e0b0995cb6b9177ab2467af0ce72ed0f9f1f591536a17f9a93e2e4a25751605b2b76be006d6e1cf48f0e39bca6d361f7f98d52776737a02cc7ca572683c953196585168037ad5458b62e41d8540c2987cecfbd2154afcefb36afee3dbc495bb451a9b0efb15ec2f172eca85463161d9fd4ac57098d2f3830a5f2ebb0daa012a443463fa44f5905b30b26fa9149f8d860fdbd80203c856845338e72a7c1ca48ce784e83bfc3474b20d42416ddf9be1c89c76bdf1f9cc39966795ed882a8f3a274a3426b0ec6a15b3d63a8cbb4aa27ba80548a56b0a3e924d9a54974f7a4fb7d00746d03fb458829569029f39e4946b8c627edf9e41fa4cffe11969212b4a0f35990a19be5c07356ed8afd41080de013502700a238124f0570b0d371f861f6af8d093f562734b68db1b2997f0b3e0c2ce1aec980b2a03523a73f8a065dffb8dd17515f0e8ac4d271a627f6cc649415650b309d89757dd63448d97424b0af68be878b6846efcad7779f10a6ea484ecd9ec3002895f0d96d65a68c81b7699af28b66cbaa528a102dd7bf423a3a4174dce46af6fa5e98aef0105e244dffea6d8f2f1e10bcd69cab32ff7b455479dac07dd402ad69f934c549722c48980aca5582322ae36befe26440926290affef1748b5eaef807e847ed68623a4407e8380efc4c706d0fe0d103803efd7a0ef719774d650e9fdf7dd9b71beb45427d2d6f150aff61d935bddc60b38d9af1530f7a0472ee220336e96da68b29687427f09a94fc47f9d7e078eb92a3df59870e0e02f32f53776a5d29c74bfabf82fd46e713fa7b4c3544668265a4db942102b2f127eaadb57af5981ed04f2c28e7d922f3b3998dc7867199d6e4cb32f4a22b5824f9c9c01067afb3277dbd0da0c7a4f43b1eec362d6ed77ac014cde31f06708ee9bd21b709e874705e345955a125aa86e2f74d5311cba9a78219ce7aae5e392975e5519971baecd602024bcaabf4ef37973d488486e0fe5ebc30c333636c5ca131faacd7bbeb465c49094e485c672608eaf903138b8736a4f4bff230ede9176c349bbeb932f27cd3e0a0d9f0a8d5157912db833b0312d4a1257c4bbd9b31c3cb80ad355cd2a4f62834aa552e5e047fdc23c878309c9c80f626789e998095931e9e6512047a45ab4d730b75a68c22053ed0d9a2a5edd4a9caa012b03f1e992b42dbf8964036401b56ebbe680b35997231548a8632d6f4702fffb3dedb575ff0aff2ecde771a8c529b67a9decf40ee476a90a3a2f3cee61f827344ae02f3547b1e696f1128e58a8c1fd7e077e433c0a35aa7216bee91a9277677c8c2bebb3cf42bed2fc45e0ce406437d209c01c3f1fc27b61acde25cfd7b40f1b2722e1a428d05913f5c4ae9bab05de704d060715a5e8bb298a68a2231d1b08702cd7a52420205dbab9daffb0505584a6a9f449d306475bf68368ab4cee06597c703a89f4ff4dafd8317403e7d781d586a5916eb6f814ddb0375ced7d51ef4650ab2c48108ddca1f01b01800de41a5297426a54bfe2415b0a9896ccc4f3b973b45e0b1a4fa59f430e8e67b17d03368690397a457dd06be64d0279ef4751923332827abf32e7582697d655bcd3944403541d78bd5e5487623004327b3a8d984b6b89e18f2ddbac928e87c55bbea7c797a9cbc681ae257b4e58658935fb1ff87deebc755884b420fc77949c523c59f505740290e17501d871b4331e5a28e8c00d875302a306e819e3c8b915cfac72d5ff52ef5162f5953355792959dd5d4be46e54f9c38cfe9fdcb71fad9b0a02eef0ddb5329134d313a087a4aa49e36ebfdedf2eec6a723d565ba092b87d4528a6f2ccb2cea6b0f3f7fafede9183b24ddfc42467e7cdd094a2b1299c81a6fe8b7f13a5574fa1b2090c559724ad90916e0a079716f0c720ae2a22184db917945a4192a2f9765ad12132c8822fb4173120bdf6d91baf67864c8b3805fb87b92832251b45f0452139a367b7bcd5f2cc071836d2fe2c2f982d71632e4bed7682611f7e91c58ba111ba9e36dbcc296580b8ced40a7670b0759492e765edbe1f33ddc004a413440fb301096e55983fbc58ab1b420e5023303d7aab8e6fab1206044626f38b60493fa0068eba6cb974621d3152416a07637eecef4ca3e1895e2e5f79b66fd353db4babeddba2320f9eeb529148b15b6849c24313b17beff15bbc7cdebfb9dd980edd6a246df52bbb9749065f4d81e7af3daaa209914bbabc5bd40dbdb753680140ee05175230b74cb8b6c30ef4862686d18a332b41255a29eb37e9eea2e5cecc8f29cf0605c55b0b0b9553e231089400c0adf629052c9856ced87b96cf06b7aab580554e5c156dd81d564d661e1a803ca185f8b8ee7364653f827e86c2734ce9e65912b7239be93363980ad87190a4c989584f3df6940a9d1b6f9bdc4f75cfbc21566714b2e4d51e61aafaaa2f9a4494db78d347b6e93ac0e03e9a92796b3bb25b0ee85eec95784b175eed0bc6d5b502f11d3b7cfdd78a7dcd3959804a8953ce623842988c1b7abe04df5bc4d6ee90ba24ef4d85e321770f1abb8f39729d881b875bbf2731e899349b7796878c7d727855261121e33293a5e5fdbcc57134b8efb2fe0eb31ec34702913eeaa377cc1fb135a9495a0a1667a88de6086fee22fe573fb4a1e11d66be6168709333cc516326512e2a515b6ca9b0ef7d31096eb490096b32e57ddbd73fa334eb539b8f1a5f45fffe2d7c85c124588b8e645058364df45013c6cad1e729434f90f1b37507ce459f33ef77fe4644279f2cb398945c286fb4fa2bc1b5e44d5cd69faa98f6f9b9f7ed7e8f6982922b1b332a2e26d6ea9c14b8a4c403e449ca832dea4406f21399e5d1d4c45feae6ed318a7f40667b3d96822e7a6efdeb88c04e80347e73aa3cc3c361b455f1b5b334c32a3d32528ef6ca28b5ac68338627065c0aca53af1ee66880252b822d59f8d099c122906e390d7821caf20d0375082e83d548bad0f6b4e424c576941bb50234ac06bd2afc2f4fb9354ca501e273002582293af82559821a65257604ac10a2d2cce3e39e9028a29cb2452cfcc1baf2868c3d32ca3919232caedfd4a3c13309751a6b4189cfabf442cc938064b6beb754dc11198ed29e5c5ad6625e0e0b8c37b37a2781dd45c936698d51f36029f93fc3fb88d8792f998c0cac930043db8d262e6347a15d94dd128fc2b2e50c79e7fd039f8cec35dcf3397ee44c9e21dff66b4daeedfb4e6b4a79b723b2e2c2cd721587b99a7d41274691be7c8b9f8144eeccb453954ca11f7cd70628e52f9cc7eb2ac6cbf51a338b4f3c868091df803c81ff81a9447c9ab0f7d4317ea1f9138dcf0852efe907cbd28516dfb6546f25324053c83b0d0ab9b1b4ee181c4a7882775fc708c8171f3854c4ff0c76e72b0b818bd232f3aeb8825946d793552b3a79029b471cbdbfdc7fbd764cbc59cccaf67ee5cbde869e6f44701bd62c4c604019b9c4a28426137eb55c857ef92304d3d24134ada35ebdda7512067f6bd16d7c1d1ea6e0ed8e27cc395c5131c06bbe8d5a94169eb7e80b7779beaeb1d552e545954107e2decf315840c30e97fe3ad177f487c8a04a355e5c1f9efd0e5974572c222a437b23e62339d2a38b58c7fd0c0892ca2c5bb198e798fce395ffb5911cfaffe8a55f23f7fc906596089081850c362e64bb6f69ce3296801bd32db9cd1edc6f0bdc03796f28e9e6ae92afc4cd390f0b2c94c34e3f76b28c97c1cbab9b16bb1c4d680a840ad05c3f40a2957ad8fa1d49c1940074ea55eeda292cadaf05edfd22317c9d48ea26b708ef6db48c9d8ed968ac138e9ef7373056b7f98505f27de10c360a084c63c82ac0f3bbc7a047f8ddd16dd063953158369f8ed48dc878cd1069fc2f7d001fc17f956db2000718769d7eac07328a2e24793fbb8dbda5f8b515928885ca65e72c544f54d07b3a6489f22202332396e37a02e15796e6e6aa7c9e9df6b8cc2a34194b6cd734e59cb608498e9b41bf5d23d63b9d6d15a412ccaccee1cc74d9a0e7e164757dfca4a642b75f44a1d88758db6a1b28afbdbbe28bc3a89f21c08e2a0c941b5cce308421f0bc6a62455120c4c0af0238ac5998c02fea7f42bfa239d01e39007f2d53e1ae7e48789f883098c5a0f5db3b39a51e109312f35780f526f532ecd428412127d2f7f5c7a9ca0df0635e557da30e9d86f1678781bb95d089c847393fe51bf3fbdb4121786cf46ed1d2f976a446ae230842aed51786812e6a4e43d90057abe8843f8c30f811065c6e49ef26e840c463b560b3b892204fa2cad1f9fd3c6c7a25dd4db956c2f5bed0d5a2b3d08225174a108af9415e70c61862f3b51596439a98087a66e4352cd7d70b4a8b9f98985de6fabf8cdeef8ec5a2e790ba3007bc716b72bd21b8962ca9d445abf4ab1272f3194aa397e0e57e790e44cd6b16cdeb987b948532924727fd1eb25a3cec752a175c599c1e60af1aba977c25118bcf67d242b682a646d03e50fd2ebe5ea61a627603432833cafe52d6f07e1a6f45e48216bd057c25d57661af31e3dc27a018f156a273b45aca344c665ca3660b46a281a37f29dd34cf09ade186e3bcee512393adec99e1a6eb27fd4eef5a561b3a6bb2b7d6b96fd48c35aae4301f65a03548fc33d92a5ff035c618028852604a91fd31c3bf5953942cdf511c05649c84b7aca3aac5e1bf74768f926834b415eff60d5c12307b81e4ad49c22b4a9c6f0c6164504121074a1dd20a202fb877762c313f1484bb39ef5c134e705477198a5d2a42548836c9f6585fe629b287a4125b668c91d3571aa689ac66c40c20b5a5518192a0b1a458baab89c5ae738f9592b22770b647042549b23080aec0ff3f08ccb2cd85eabb18c305f06ed0fd29bdb0c7933bbe0947e709e056076126f9980ca51d6e172102d66b8fad996cbac4b70bcae218abbcbe9336e48c5c0154a6e0dcf3452e28c5018ad24ba6110614b851d24ff609673b176a62647e168be9db8c688672c2e3494e4e0553cf7d9c4ede27181a5e670264855a459b20d0f62e4be811ca87cb8681e58a21f892174f1e3b8d3fc51377cac1a6995ee6c86f5286bdf28e8266181261b13680c82a24b6c7b5047d9306ef4606dda5a1b2b8d016b585aaff23985c5d18cd9a9e03bef061c4906b0a044ac990f090bd037e86559307bf0d3b5be515b6f0b8aa4f4e582a9de1fe040f35d542c8afc5823b1ef4ecc612fa3c25e1226064fd4e2b9f88475dc3fa7058ac737ca85dc17808b649a2aefcc60c0b00bb7fe6f0794fd285f8afd029d8f0e23ea5fb9b34afc4bf5957d2b36c0b5d6ddfe2f17188e9c2bdb3d183c38002e1d18e3bd4723fa6c70be85bd26e3eb7131da6b1ec2ff3954b019f1dde9cca69d50d1d9b7469f210b1f0f9740756f426a194cdb0f7a3339470e539eda0443c490f6071615dde096f6b3ff573e3ca7861408b5dea735a75d13ca8bd5852249668960cfaff101c575071615a1f27942c93e261f0eec5ad3fa7c4e925999292be2222b1da928afda55cf34aeee8b641f8a1144a5ccc5da6c8aa23c7c937530965fdff1da838d11f7d484384b544ad53ec54ba544be0eeb27bd5987dbbde0137e10b907f7aa987f331f736638770cb509055f5bc60dc618e66bc15771d88efff8c9c6037c26e4216aeff0d2b341f48c6ec00c820ff0c8e69b83b81d59648f2f043f0b48a70e70535a1446e3c7c9f5caaccd3f98fe95ea65ec8ece3d9e7b8e836fbb1e7a44bc8d3133a1550287515f97bcaec4538056066d8a1533e00db804357404bd926fe7f193c7b41b8fd0a944c1683383aec9dd0476cc62a2c7010965da2cc016a8c44df0ab4741a3c1a52f8dd45b30795a531f02be86b851e9cfff65ee5495fde3aeae4d82a24a375eacd7a71cbac5299b552179cf89cc48d325a5418a7f8964014ffe2aaa2234f12c3e10614fc5fa4b9da994c05ca75c78ef29b3147a32fa4da90b7225702c793ccd4d68daf326b85e60bc28557109b400718933bdd62081418db176c5bd759040b7096682f592bb94b889b70d15a051a80c41800329bfb8b41c59d3c4f02494b60cf77584f2899871d6dccdfcd60fe0839d6a5d604b41358b6ec2f6a71501937d3eb250e70e8c19483a64abfc2a2624dbb63e2c81586417cd0487452c2ff059238a6eaa451ec44cdc2180c7a03f07ec146c19dbccc5e1e68f2ff5402f54630a3c5be17a2c75bc2039b301b3defc3efc291abfe98d6db6cb1227583a0f7abaa903543d4c9de3fb040b6f064a71f81cdbca5e389b4da240c135065138887007fea831b91ee6299cebfc03645181c726c72153a6bbc9ba9a6f8c7c5850475b6aa0a9f1eea1288a64977ae17646cf8c109851116d98e3f4f7e9ed2f3f5d8ef319eb333ccef576c09dcbd0f89c648166f17bca0aca799feae2a9689da6f5a956637d5036b8522a9b9923a7ad360539b00aa79ce1f1d237325b348bbede44258bb2f8b1b7119c174133c9620645e89c8fdc8e5d5a6a88fb4f5c3a8b5f050929071ba99de3634b97fc535732b655badd7f5f0ba5ed1adee9665145256f20d3a92f31a87f9bfe96c0a09307c438f7f52c7a10445022bf1068082ba37f6636beca13e57731851b118a9fd662c5e0a5a41633a68464a95ba241b97cef5d6aabeacba3d5e4e18d1fda18ef1b1bc23dc4226a3b86d32c84ca56a883012b6ac8196180bbccd3a347a55b9fc6bded44686ef8ac416bbd03b1b9b154f70212e5977f60d804f527497928abd372d220beccddb0108a7ae7ff7813eee21e4fef72c15171e6d73d13b4541d7a6838ab9394c5ac8412c35e7db7e81663b7a3384153ddb2ec4a67558180faf5691a02cbc15c03968f85fc4fff191537c6d5f77e8ce36e013d75322685e845fba008dfb2dd8771175bf0f9964106c9b7c04288a820c134a68a7796924e6aba6e6751864cc2a1943cc1f0925b79bcfd2c2cf76760e0072cfb2107e7d3ea41c349de9381c3c263665674674188c4d5bb7d4efdb8892d986564ce342edd93f18c28837e893a1f80c5bd0ee0a9e42d2005bf018b3448eadcc5364d94c6b7ae4e1f609029b5e191e9003186103f2df0603f6ba4da24702fef16080d24cd1a59ac5fda327b93f5c7e8cead87770e562da363adcba4feb630c51a839ff8d2539481e7f4f076afa835c69fc90d01886ecf70c70a46b4f1301c75feb4f6e5e2f126acf82c9f12e806af04e25290962db5c43899a77d0b8d6a7193bd3021297c47c067bf744bf6a1bd9e807e86f5b871499149ce57a72683cb710067fcdd75889d46bad7ec5463ccd75e45ae85fe6d4217da3289d0d9331ce1c9926f7f7ba335609c11d5b559105e79d9cf461b3cd2583440e37ae934561a8c2a7ee40bd630a064120a6c4648a11edea0d0054a8521363f51979bed301492bf4f458e81729bbd53102c3cafb6cb13837c8ccc0006c1c297f1cdcf38a535cc84f767cd99870db4535eda39df6c9c92352aa70c3da0355c6db5215250884cf1bc144058e699eeeb95eaeae2775cfefe23fe35e2716774e5af0011b31ed56b2aaff1e6ccdce673f124445bc8dfb04439e157097e1f3f97bc26aff6bb015418cd9476ace0c832d4a18e3dc35e293cdef1bfde508be814db448836a0950b23b77bd9413e0c5114813436668a133cad7086f93593612a81ab62adbe7d4f07ff78b4cd7f88f71edb685e25d33c800012f68fae51bad93a5cb412949a6283b969dad2647ec8c729a6ffae5b14034a28936b09c6e8c8180455c465adb4535a3e1165e9a3429cfa7b406dd86016801b5a0b1027562d242cde2fc14bfb440d20d99d573fed25c00b86fdf767d5d7753b4e05b4a05acec2be60f97c998b3a6aea27e6be940eae22da331a82243c1538f7d264d6dd1962b0c499c9bf9d2c4a2aec9b4dd7cccee9dc91c9044e0ffbc5c12bf699ed2d28f80b0cfef6d82bcb0fe543b61ac72bad344dbc023a86243219114f25d72cad332ac3500c32e33a64655b78d5173a4afb8bbe06b01f420f3fee36ed0095457d9de9de0d671650c04966232ec44a734782262c0a196d90c56e9b61961a0c37de2f7300773ebc701706c069efddb84b3ae8937e0a78ca3360b35646415fe38fa64308c0b8ae17e9bb5c03b12d72527efd2f2ca3602793c3901115aa38ee7947df0d3bfe474f893ee830322134be25b7d85c763c504f75849d13689e34781256836f60a2f5eb63da12f558b65dac6539610549743460c354b90ac2f2efec8b4c6ef0a07caa9e1240b402d46cbcfcc5e5394aee696de938c33fdb4b84370460abf921eacb3ee7f2d05cce6f360a19ff80b6681b4c583c7b8d13c99c8c191214607323f6ec9af489bcbcc196d5be57c4ca58071c54e4e6f6ad906cd3deec8e789e0e1af588c3170c5bde50c21565c538c093c0d98c6f5084790fe65f82539cb8ec898a819e14f986c0ad5dc6c7ec1087dcc6e939d4b9cff8407f656f59e7fc72e159f29ef09209b9de142fbd359c7f6882bb6b105fc24909defd74ea2102881b237ad6ea29d885cdba8a20a769869ac985aa7598b4bd1e98b62ba1f18115c091b9ddefac8259d295f9faf5350f7d3f5276f80e43ef803d2b35c167f10fe37e4e4ae254e3bb23985a96fb74953353849100b8eb7f230eadbc98dc9f8132de4da07c7d5eb835edc06b3c2c315246e79f486bcc02a5b06af8332755c244fb8f005f64743c4d56f43f291808c6620592d5929b83f92650f103646d76428a5214f5f9c635be70e881951ce3dce230ebfb755038a920cf13615cb5e53e165f82a0d28bf366b42d7012986de1793feef26eb1fdb60702a32766aae9696cba13e025caa3e740e11c4572c3f7b0a90c3c82894e31c0430ed26faf752320b993c40e92c567acb44e62318031bd1f242d96614680af9f88e3a7c64512afa9b4d2df1c17c519892a80f3d321d2d1f8882f5f53841583af3e07d4a970e2b2b42d2c6d353c0721d7dcbebf98e865319bdf173de289aff3054a68fc4be5865e8cba9568a7e009dd3d80071086476ed8bfd1badfe4c24382c32bfebb1a301aeddb70954de1d4c9dbd1bdab8228250fc30840d600809af90686cae00ee76e7d6647321c970aa877eb85d14b26224d945e355188460704c85e2c992272ddc1098d3f12132419dc0a6f9fc17917233a2eafb073a730f1dcd4242bed3564af01d88ca17aa08f49fcc0ce4cfc86ba337c90e731307710b0325abddc7bb1cc7e670d83bb15e0f7baff02a36a5b40b69b2f8cd9c7b32b5647f15b5dc683aa29b14b83d12d1568ba39d2497ff19b15ac464ca977dce2945b9eb416f41749ef1dea511d003f479a3f88d080ea09f29d4291ab387e9018e8d7ab953719853edc8c2b4daed6083d769f6f07c7d46e82c7f53bfacc8b1cc0137b6fe9939f2f7e84a4775ab7ac39258e0a0daf9170d74e6c3f3c9c90e56a4d8033ce2c4f7335f88993ca0a24c8d42feecb35c7b5b1b4687761d7171a3deda275c00b32f9e6fb3eba5acd553afb313a9da58e4de220034321b3cc1f518352c305c11c2ebf1f96f986c462eb5e027952d6a832de4f357653bfe535f032a59d0bbfcea2969909c99ad35525624d3fcc28e152a8ce391bf2c6c6818ea36adf43b35b165e5683c5bf50013429ae5a2e7c5456e5f10c4413332b008a2cd8e677f813681d754cd5e3ec13dbb03aa3088b61041e41764ba3e7600b1f8b5ce9ed9166686de05f5c7928fdf849bd0a9b72aa0f46302249a5ab939416db0af414e47f523f6f7613b63547ef132ba67c456685cf6a98c90dca0cdc9e68dc328c4aa8ec3e2ba7104290e06b2a92ef53e30cb24afc5f22ebac8273fd0f192bc13f6b50a980e7abe55e5f935ca43d4863944189866714e9c1a82c8bd586360383df92d672efb7cf402df9d72d10fdadcebbbbe4ea0f6ec8b72743adcb5fb14c31369f3210dfc8d6b4c5e19e63e56b37a5a8b5750a0f7f16c2818ff0cbbbf9e92581bf655b0f3df8276a4a7903596f1ae8826307fb7978f9aec6bb298bab4f8ede3cac45349f70544c7aee8ee49f928b7a7f597776aaf68b254247e410b429e7d936bd35ec65089ccc2aa86c56ad2273ebbfcecbd752d913dd65f62a5b947d7bf63db3bcf608053569fe392dcecdcaaa10031e09ed45e5769d6f8c3b92e128e570238d8a3c641621c0b331156bc7e85ee4dfe4ca05da896c5e557375130d814f647c421dd6b794963c0e49309cd13ab6ea0abf7d2baaeec32f733bd39988a6a5298dc31c31bfa0e78af17a87cda158dd2b78e7bb9ff12b91c2c9d67c555098c1b71c79651116bc2d1312704d885402f94b78453a1d97e82f1ad413b940be527c51bcb81d108bf94c3a9ee5c04b19a38e933a4f6fbad24a4e0690ff184ef095f18e0c3ecf87fa34097b37493fb8794bb07036406159be797350dd8373fdcca70f39be4d8bec3aaa1b9b58be42f80e0fb8a82fbf1ee8193bdb15e21e243b0de385fb22048a916a15d04554eb214b81f54bc04ac6e290899718687d6af490756bd3bb55cc6d0e530068d54fdde6243a6170026c33daa82bc736a7c77259ef557656da3a865c5de70b0c65639801719ff63c18547f64c93ce4c58243186f52dfff9556088e8f3299f048f0ed69bee21fda64aca7d92b344c1a7f921a4e90a31747bc110165bdfdc0d9eb0266470cd3614b5d003d9f45a1409327629548bf7dbc556696857112a445709731d17797932d337dd9cad8ec42525dee7b35001c80184d3d03949a99816571a809877627bc3dbc341d86d0ac9c659ac676b5428ed5850ecdaebe140fa8cc4760bf15d886aad4676ee336acd467289a26909c14826a4c0cd07886e8bba864c10b8e551038bd22d62547377320790a55bcddfc15eec7756d1faf95edeff7d651c152e9eda95c7a4bf3a511e8c97556f26556977ac193cb3a072591b94a06757905c2a6ae0d9cc817312b01e27c275eb309a99cf45dc748678ad52b872b05a465e82d98a913cec8506781ad3c74235219500a9a3b8bc5f4ee3a1e4070d0a833186dcba224116011573d956451f63eaccf12e3c6a4651c21fba6dfecd830aeb25ef97649ea884b0f8a8ccbcca14473e6717c659967544b1aa2108c16ef9c7f0d90517bfdd36432c8fcaccb806393ce1eeb5e5bb558911da71be13cfb83df90b949f6a64d57656816f9047407759dba413d0ca941e20aeb3e131f59a81b835a32cd8233f4c66e5fc4fc8a79ad8ce8d378ad52e342e91297ad599b80b29901d996aad6efef50c9854871a2d160193f4849efaffc8e8750395f7b12ddc613a6697b74e8d72f53d8101da5cd4a54f36d4d924c05704a9da68745745772018e9ed8bd476b930d0f9f92c7dc3abfce9e802a47b9ddafef0684611bc7e1557ad82b34ea3f627f4b8941c4b457616add2d40368f1be7bf28d03a18b583b6f07fef42891776b11712b99d6c89429152e57fb96f17ed56ac10ef48c6fca8922eb191db4c23f44e1ca63906a4d2786a5b4957007ba4c75ce00dd72d1f798e654bb936ea0ec54d2b5acdc95d8a3f8c55f516ecb1496faa99158f025ccd5a3f65e976b5799f3dd22d84a1b46829b0882d154ed55931b8e48a82715503c1a9f97b4f3482ac9959372ae55b1e09739b7c9336ef5fbfcb68bf31c90fb4fce181fa2ede8cd3e83357923a702086dc2a1352eb88d3935b1269f21f045cb3c9f9c6fc6e746ea9989869eb9fdd5067bf72af4ba291ca235c28b645c1dfd22a709bc4499f047d9c46b54ce020aa3a9ecb0b54ad95dba6e2dabcc653b63fe19c77fa368f9e9207588b33b85f9d3285697fd218c3e89295f685ccb6120d600de157504424b108c5c1f799d57194040f08fe83ce748b3d9d0b646b8b1fb9a353ab9548b2cd34bca40309ae93be2a051d3dff8ee4e6673fba5646eb5f63e6b32556d3e9d8036bb55c5996de9c0852e93dfe79181c91717f44291b99387ed41569b23e8e09789fe3e4b36df18a5e9518a42d9c5a77d0973299abeceba15f281e70cd5061c162345ed134b68340c37a60d719115d2d0197eb90fe09170f1b4fdb36e53581b1ddeca62c47aed61f90c547ac152854fe2c76f746d48e5be18148038c8952026d1dd6469f135bc54ff323624696106f3235480ee68088d82ba41df978c5f47bf2f497b72d77de5a8c531c6c7a023b6d5f3392f1c962ef5de45d17ae5521f062105b55dbdae4a4679a2c29fc0825f8696f79ea9d8ef454ff10c83200696bc7a3bc235b29e0c97db473518469109d3cbcd0dd188775dce184168d911fceb6fb436f44da25673fe8f8a510760ba8af0750200cd34f33190c8e9a7f46b83814a826d5dd4cfdb21b1e3404598734ad958bc5604de993055cda5f2d36dd10d8c7457347bc8ca022c6dba73cf3233dcb99ea21e992c80d7f9316a09ac8e3dc02835b3928ea3716ec3f71ece138114b1a8d549d77e20d5777afcddb5c7a8c0c5d903a02d5707fd1afd9d8b962c4f9e1cd22d852843eb6fb7aef12b30dbeef7e30d192e1b8f7c7dcb0a4ff10e6b90b5afa700ef6e4e1fc9b7cff254711c9dd04597bb31507bed87f516311f38df4ba87cf2c57ca3c619a0edf3d7f1e04efc5750fdf04fe9cec670832bb16e249ac8788f41d67a917069fbaba659759581fa2b0a10f78b926b857befb2eb2570ebb9a2295a4c002648733d0fb9aa89f35541c74bbc36944160fdf15f38f4e1f4dae35150f1f97c71d313d087a31693af164272bf145f4fc54a9d80fdb9a98a4f3325655deba242f25d70ff47702714de1979eddfd83bc2ecc0d42a052c480f704127fd0651a85793ef16bf5b6feae9951c32bf36ee52bec8dc22001", + 0 + ], + [ + "0x0a8a6c08021080101a806cc3319b5df1c8ca5bd9148831a54a296ee8692e8e2bcfb697aa49d031f4e1e74b3f4893e30eda0d44ce2fe9d902cab4e837782e18d4c7807c52fedfe4bc02605c6b0dff0af05efadd364c794527fd8ce044a42650a13242b3f80e96ac2861167c7264ca220185834ef71bbba7bf2850aa2ed72b2345672d7f29a39634b1f3e4eb9f055b7992d84e0feb2afed0b9dbdbae3bcf433bc4ee39df235600bbfab6d6803a67f434b7dda4947c4e174144e03e74714ecb64745c03d21a0a5aebdfa0fe2e2a07ffadf5344d1eb15e7001e57463e4dcd38ac2d6c3427301602980a17e1717f48f6b915033011afad2b8e1abab98d3245eb218b3eb6d3afa072a767c8f51795ca2506496cf9c058d121e88ad720e57d8af7449b4a66ad3e89f2f05f592fd9c1dcbfa85b336e51324f5ecddd0c78b486528616485db1f1f3849dc768b1cf7c219c7d6123ff5c48c3e0a96d94f34ca32e11a2d05be1542b3ac9d2cf59718108676e97ed353846bcc81ab7af14289ce7f11029113919468f000455440743cd16504aeb0d87c4a8dae61a179230ff30145bf414dac12e81604796158b2fc0bab52583a5ad52c47270977f156b37f175b6b91de7441b594dc174c41c6d47403f4f94baea74a9f7782aa92eecdbe3231cf3a98b995466d0fc327e53356dd13b7cd4ac2f7811c468951b82bf2c1b50e6c6a6d050a1c374235b9d5584d2530c06203196b0b8c2954755b02466b1c8fe71f2fb9af57f3b514c9ef2c5d96031eaad2d1314da681fba9f7eb3e545f0d6e28efa084219277783941305fecaa6d9b7d3f3d93c6e02d53d955ec1f07b7af95b139734515c88eff9529b9dd9a9c82694cdd0885b4007ee0992cf8fd100d148721cdc9af10fc6347dac93c5cb1de5b7abf20ae513eec43e03d8ed218a38e088914b58bb69267bb5b7e494623a84f0da7ff2810b3efbe8367d5235e0471ac32287b6803709fc686a1ca118a79b9e6b65586c328e33fb0d52de785c8a6f1dc56f11a90b01cb678078fdb7c0890179ac44670ab80a3a6cc6ce0415c2647099d6034fa22effb5e73fa66ba0982b849de898ba4f5cd5c19f508457f8b28b382a60dfbab22746896d71072a9e70462d29930290c38900175323c285232527b84e6793fa98ad2dcea9daf9021f09ffb6f824a16d9e96333a257a3aa666d98aa2cb589e9b18acd62839f736fb123f82a5d6b388f6044e8781166013cd47b2ba4fe8a301bf3e3a831f6f0a07c88f6c309ad90e5012c0bac243455954db06f9f698093281b04d930477ff3d50001c0bf677beee1be64a807379b3f91f5977a6a7de504c9cfea5dbc8d5188b98ec7bf50f38d8e2fc1ba6de9ab7ddbd18b419df3e1834505e564838cd761947366a20120b2bc993cc6ef457b3b1d78b2fcdcb29b1f8569fb714fa18e1f59761838b94a6a6829db2336990aaf241bd2aaec0c1081eb36161f4d644ea64b6f6d7905fc9b4783348183696e178dabc74fad0166669675645b41dc2a9927415d29b81c19eea3cf021c183e398750f76aab4bc07c97ece5130ecd53100308bf35e7688b5563153a8002feefe82a63eb540b23903c4817fad40826116f5277dde3c855e10fde07a9a54d45c9f854f94b9234efa1b020167d52542fed897960078d55942273134be864c5c97bc1035e1abd4d138bb3e12664fb0ec014185e2f4f8c4b6c2e1ab33cd935340340db53bb03562f8c9b10c8640fc0e3e8ea08f7954d529ba61907c20ecb3befdbccd522c1cdd75b15f2c9fa560f44f90a57566ae86a9c5513366d59e7ffe0aa1de399b4148c12734b2317038a25b6e8a72f21f782fec51f24d16894f308d5367e595131bb5f73cf501b3345bad54a42e06e078a1693c063e48139d3939d1839e7560c3f55e5d8ac78760df9f0bb1bfecf8c51e611a6ba833815e38760225161a6309c5359e8f1b7ed9d707007b17d1a870ba7ac25e0cbc12923883214829fac999bd56077bc48e20e20cf23b759ddc125e58a67cac34b3c01ab2ce905195d166e5429f69eb4402d809d05cf596ecb9d0d4f20bcb133bba0fbb704311cdb68317eebbdcde8cd80ec6ba20774e1b6d0e8d2b0ed6c9964d9f1e65dac2bd74a89f4a4dccc9e91920549f1b87fcfd33c24c4e2d8ff7ae59287160372b14f2e8bcc8ae410cf3be2c18149df686333217025f62b53a2df0dc6c573e1c07c5030726cbe7c78405afcf91567efffc066d4f2d76b81e8e824e69bb58192f402c1ba0bdfc632f5907daef4e7340627e26cf371918596897e1ec51f4568dfe9ed6406cbcd812847b4edcb8a1ff69015735bf4bcac011f8e5a62c85ac6be97b5b91a1314f1d37eab0e8e61dc24a155b41306272eebc4da8df6e2856a74edb692984b94af223e57dbd8eb7f23ada0498d9aed26ed0770c7be86a7320d7a534477b3b5c7e64e2229e79fbfb4072f68706fc47ca0ff4e138a7982349d0bba1232f98f39f28469470c4e0e95883178e595dcd06414006e200714baab0e5925af9d1c3313514d375280a4b0fc402220dda8621e4ff4e173142b113e40547a3598edd7ed60b72bdd22d62fdbcf5e4113016687c9d1af01e2fbb6aa0daf2cfd13abf7d36075caa2056c83d39e7c34d2f89a433a326ab01ff27953f865919be6866361991335b9f68e597d2b5bf1b732a38afcb33cc6933b32433f9cc72c7d0a9319fe55a531e744213037b3453e0444a50c36b89b699abd3d5951568d2432671310ac2960f06aca48497880546a6e3f0b4f3dd3a78cbc5c6465eb5b12a791de1b8a27e4c49f2c1c923e0eeaab94de3210ac4dfb67697a365740da550aab8704fe638a9a00c1f0427c80309c3d80956616fd36d8df1b5f98987d23cb79296247795a46b6c259adcf8fe6013f76dfa48137282e45cd102de060597c6ba5cdd64ed78c4eb5935197193ab2831504b64642ffabf1718950ab124282a4cc06bc9a2e84d52c5eb6895d5987d0b4ade4c31797591411eeb2c4e30b74ddd851ba2ef8345893efd5a146e40ecd7619e4292349a8814d0438b662fde8c3130c121928620ac5c5babc74014bda986aac4474fc5c983af422596fd88763ee485992a33708eb48ca57253ce1620447a88497d7d570eff72d1d4cb46005202cf5f6c0d477ff9ad8f8eb8e1537ce1f5a6e8d080b3b28183f8cc82f5c7a9069d578a99095da6e79080a81ed27526ee8c3614273d9050c28ebe27f31623003dfef51776e3078a2d2f7f353585a367c50cc931114ff87797c65d35c943ddb9f04643b5b079ec0767c06eb43846f4cab0095291b847fe18c4615d21d7267d0b2a8ddba6bab7515fc6aeadac8e930abc6820f5e1fa3182f725182c5b59bed3c47eac7e27db39790fee88fece2327dea6dc1887e415706b4f1ce5420bc062c0314dfc66ce3a3234a90dca4c71bfc06189edba318e23b189d4499518e7d9f8aface33cb6a9e0c45505bc3da9700740bbac0158a55caf35b93310aefbe2ca2b1d0416a4d55592ed068e65d364cf80674d6c6ffb79d6247c4914b0ae34400ec3def61b3f7d5416600fc985b6f318a1f183f5a5f14c09ccc6791661fcf477a75fc0ad9c80aef45dea6f5068f09d23ea72db5934cfca4c7ce5a230aabba563805bba4d4c27d4ea117d51d4df8d28804b1a837306ac84a460f4b8c2bb5648751f474db64b1326dc5e1c0631aed12a48249f3092cc1f88595088fa9218165eabf6e7b31c0eaac37cc005d7eef284c9957d17b14a4e41719eee641147308b2dc032b0c0ced5d67a9326d5d039ecf3a62dbda07b4ab0d6cc201e17debf69b642bf06729b25138c2745bb200854ced5758d883fe127e918bd2af2da5e899bbf83bb3a42b350befc9b1b1b25daa05c7382046e23e4a658b7fac99b0729614c60396e3ce848ce06eb4f77f0a7e6cb4124a451eaf2848b5e7f2616c3504d1c5c714802375340c910b902dbd7757f80a5825ccf8466fb15c8d85897d4d048aba1cc48ecce90ce9ac9c87ce7daed5bed8f6c79975f347a638c83a67784be7cd0fd64b95574f1189d608ab3f5728e0ea3eb70c29293f51d4b1d4498827b7fb6f968780b03a590335435dd11cac8fad110ad11dabb4afa40bd9632b279a233d3363ce05f09abf86b64f99e8eaded1e4c131dee8c05689749874766768891cc86aa3f8bb9ed5fceb4bc3701c7cc439a8a3ca92204f4f7534b87ba1197da6c7f009e2a1bd0af09c12cf91024fb2c798ce2e4a2b4fa6c60735245155f5496eec6ee836f94a5102e5a74e1c059287c7ae34a0b3a917224ce7b2e596c43475f6f7ae2302239c3bfad1802fec29300df28132e38222ea0609ab3526515fadfafeb8019e6fcd798143a37cdf1bdb434c4b8e5cee91e01d2080d5d12f8ac6ad2a3a421732fde139cbbab219cac320d63d02a011af806e68362fea72bff4fb11be197b022862a4e48bcf6e8d7a745afae69b96b8643fdb3b3db821697f77ea350c08043631a4c65a81b5352669216e5a44fd3a0d0ee1e427d41a99b7d1e0cc5c5919f92c7a9d6966f6f158a40076b8290b22c783b0b245b961d2dfe7d176522680b35092d7d2c8779e452c00f6bffe788033087a1730b7a47910dcdd60fcc57ce750cf925cc5d9c7056786b1361b35aa60ec081b4730fa9746babdfbb2640cc4bc98a157a4ae8d6b20d74bf68f17d08b6deaea4d715dc1a74a2cc4ca8031ca6922f1e434e09c52bfb97e9a66e53103180fe4bbf51a4126e180c3ac0a82c16c5cf02356f39db877035edd05d4afe759ab267c2e8869aae4c11530bfcbfc6b0974a14232e73d920a0c11bf3bd452835193d1b4084566e03bbd13da2c01db06d79b7407b10b2a91435671bd59f4a59b9baa4b7213310ab6343020c91dd0cb9f70b0919bf35a4a2caedf95248e73f2dc1ac6765d825f2d53a827c0165316ab4ab1d124ef785118b5527ddfb12b806669dc34d78547868674c4f6d8f744ceae5ec28c19be281acc842b8d26b2fadfaec839e8d9d92b034d0193e4ccf373868c5d16a7bebdaebe8c31929c8ad936d74ec5a0425bdfa507cdccf57514515ed5503fc4b707cfbc0336a5f70745640f70a39c1e98a29959a873bc90afcf6e172a6e2bcbea716293f66933b9640b864871b370d5121624c4991545d801b045904cc61022ed99c70619984fe8cb370912e302df6c01f935f13c2202ee4c3422830746f1387d9e898929d5097a53ca0ddd804120ba0195993343d70ac5db85ad93844f8a9a3e6968a27d48808a4948e74909ad4b47ec17be53364532b213a741529be98b2e861709ac8e425885de58e189331da7277d2958b1d6b76e7255bd69f8ec9dadbb8a167a31d393d9bcf5517aa90eab46b1716df454981bd95e958058747c6099078da94d7914ed6e82ce90e96a9e01bdc0110ed13cea1b58e095145289096698838d776187b754930ced4d08aef8af96829696a02b40b7c5689da27b64831024c80821a5ffe42d78ae2103ca76ce5438a264e5ca5a94f8a7308c2c3df7949b6af653f93b9ce2bce99c1f43b1a9237a680dc971f6590b2c4d4821616638bb35acaa18ad0d1534110a8eeb9fcc91e77b5dd65118384297916312f75447e5e1549057bbca2a485d12235f2e3c477e0ad23d6603c617a003f363be94cd8d99e0d00b3bbb519728383f0def22f1f77cf62c42a4dd582b7fb254bb8f342c1129f546f02bb3e614d21a121e626c285e5e995010c6bd51d252627d2fefb0b2c7399f0bdd2ab1543bed32d558fb570b133885bd1712cdef582035b2f97f7a5f6e985af60e4a5b430f0cbbaf51c66bb0ec901c7ca04f87501895a065dd43ac2352c2dabf8711a76abf5de7da151021879244b6e41638de6a3522ee3f14e74ab755758407eb516b4aebd6eeec127317119f9ddf9edc21daa0ccbe898ecb9737da00cd2bf73f395bce8852e7caed3c2bb9d67ed1a811640b8e2b36eb9d151218d0ba61b52f7a686aa694c2a76e12df8b3ce97df2a7fe4cd75e290bda3e756e79a53f755e51aa6200c502850e97bb5c1f2bd97a872a299ab4b0fd691ebb160b1327eee3d1a1c0f4cf0decb77faa7d7601cb52e54c3b49c4e56ce730c05b1c34a9660210e67599dd63fabc58b422f9c78a487cf3af3fe6f9106d4bfc1ccbc7c7054aceb4b44c971949409f3e28ad9d12c6119f146f0d00cd7a1a90333a2627a565f43d13633cfe2e970b087fdd898ccc36d6677696f6a2ca618d8969c83e11e7d53aee1e5729273712eb52b927a356a3321e8a54e8e1dcb4774410d82b21d800429e7a34cf49b8561ef6b7f48db426a6bbda606ec282768fb36f5f508d5b1a1995e7b03c5da7e348552a4d0b02a508472dc791a9aa201ecd2ffbea41de41632f4d11a8b9bf51eb47aadbb4aabb83472044d546557500ae2eb487282261728c4249cc1b5fc22f75bdd069c99732334c471a50c2c944d2563c67b93901e0304333b407a4ab2289db5a9cb0b3efad1d357e329199a3b9693595f0e1b5f2a0355a110761655f9bf94eaef537e648f23bbd57bdc53b5790c5b23b50e0003e0ac603bf9f4ce0632004b0407b87da898c0ce89ce4718f382daf347e69f873ecdc82d4151b86694782569fb114979e8f499c3e48377f7eb4e84b63ff841c972dc195c14cec134c7ed425222dbb704bb09beb8a6fd7067e3c9dd6c26a8aee5c59922052d6d1367956edf672b62245f044af38b78e67b780523b610c0b40879faf4fe71224659aba7852a9d95d87eab777dec8787576cd33b827b8d33aedfca5c21a4317c0d554fb78321992f8da9e11c286b50aa9f42dbe474c611f7f6e41647e2effe5b61282a7d0a7adae4c4a22b54596075eaa729668e731c6d040cc1429725bffbadd620757e38c57ac5ed36ff6861a75db7c32b41459f5209e709e0708a8f825cf50eff912049332f159ba6e5a2a05ceb243e9972ca4b1a2984ddbd19f3b5159474c0a6d00befc794c23b3b9160b6e57d804b506e17161dd1614e2be8b4d30cfda057aeaa5d75182cf870d66aab9b3ad927dcdfb212fa83be8089f935fa5bc21269a60a59c0d59e6914e1b8556211ce2e57d06b387dce4cd3e9aa6b6430859f823e6f94c1cbb4ec599028ccced912726679cf9ca9c40cde1fea539a5130e5756fc5750a125110f57b158778b0c25a61ced4f7ba63ed6f67ac77cb9a23c3d1e9355f1f04182a0ef0a9a9758283f1100830aeb9a66bc4da38c5047a149165620718641b943dc0bf3fe991f3aa0e3aecb8e019651c262d5378c2fb3f86c50e49f62d6d47bb90f7f10e5120aeab73c9384b8ccd23801037c5af5aba4d507ebdcb3bfde67ac7c1bc7e7d3bf632189f47cea9ac61318818fdc1fdfcae63a4c421b43e0ed36a461eccf485ca86bf5347b0c2a2bb0af6257b9044355a45ba1d486cba67456c0c606e0b654fc45462d56371a625447617409b0f1891782addbf8e3877f38e49b634a8bc2e17b47e49e482b4157cc15680e4542a5fe270fe7001d663fe374f8e5cf64c01458c639c8785227200315283ea01465d001dd031f56b846ea02dfadd6ddecd7482cc31614400d557d0ddc816577adc77347e29297a19ee21c1dfe7aad972f0a3dddce5c1d42474f205097091a4f6edefc218d219dc5304d5dbf27985c29a0ce7eced298d1970353037b4eacf69a4808f1e3ef9cb726336c970699dd83385278ff63ac472c4923927cd12eb9376de17d0640006e1e0ee90e10836462552a02c220179d7f1f9058a12be5835ff350db5c94cd2e92c5cd25950bb4760fb920c210a14d1905552f43366c98724fb2459bf0fffe5c202af3d293cc97c6c0ae1cf5486fb78e0cc0d26aed4819fc050b1b2c8f1175d10c94e6942a56b028f7f3f25a59c6cc8735cf823cc7c21859093d5accd8dec34a6dcbeb790f12e82f59b3b62ff8b9ff0a9d12c688f72e51ef7b8967bcf459487f4ba361559fa2da7eea647608410057174cb7afd86353abe59c521975a7e0ebed3a9b05b696a83063ad693ec4738f6cbc816ca03f97e4fedb59674be736e8cce508628a93511d20cd3f417fed7e10bdb5ead332183eb20c59acfb0c77adbb7c2dd3f16394fed64c62bae9f97b94303597e9cffeb7dcef628d63549ee484432ae2c5b6987d40cfff6e11b6037a1bc3e0f48bf87d8e1e30bcfbc739a2307dfe12e5e23aec7ec4802ab4e5afd4fa7bcdb3b81d8341cab08645f10947f1b772cb2391bdff0573d335f148457624116c72b20a5e53ec983f6e601dfe152e35e4b28de209f6aa4055c271cd85ea04746bd4efaa4816e8a71a8d61ed88d3791f9606b965d8aaad7741a9f6bf06d55e3d1bba1b88f2bdb6ae9e48db89f40e3d65eab834167837130a4e80d3a9838d5ba0d09c011f80aeaf5a3e8a291672408898b4933849a468b786464bbb3fb7d944e8bb9ef85d1fd671b2792d5faf68c5e307bda8df5daf543f6ecf3919a63b3d6800257bab48afe18274b8a1a08f823670a33fe58aebd2123cc46b754bee7318eae4637c2a6885d8d1d5f6539b152681b986c297f17116e17cdde777ba39aa54402774eebaf093ffebc8db90d071812c02849665f03171eeff40f527be475d8f49d87ac77454ec24c214b9e2eeaf973176654c5238cd272b57166145bfd917b8213041d605eae8e33eeb31d83069d046cb482eb6bff7c885bbb029f4dc120cb3853fe18a345ccc9281a867642a0823e5e02ef01635470b44c92b917481d93090a95a75b8cf7ffae94922a928c26846dd8df14a07e737495990e22d82fe19a2f3e06252a8b1a299a4a1d483a4e9abbb0e261b1100c03b87b126fd074037b9a84f8a891462f5aaff53ad5b09fae1459f217543ff00485eba91800de8a58afe5951b06af1e2cb6a25e679da1ced0d4e0b3421b00e712e1208e1dbd10118e81457c6fcfdaf5e8c6570096b7bab3b08d4fd56200bee44b89f3a03bf6e245a50cbfcd4287cdbf41a8820b57102ce49ceb482a9b2362e223e5a99d4efa31f27244265493066b74695a960ac0976097ca62a9c740706907fffcaf11e4501bc05aed9b3d34ed7922b740aba00d2c4e3424125ac3dcb2c3cd743bd159a1443ea5cb27d6d3d09c927d84598f37511efb4e77343dddba507507d73719d7b53a43d7710ceb196795677d73962fc2f9e3d7c0602240bf5ff0556098077be4d75230266e936b2f7eeceb7a35baf9a91a2c8faa1b1f96d9d5b8b551caf0e94420e3edd126ef1dddd4d0e0961592b1cb3b2b67290663c086a0d96929fadd74b0da3dd64d3885b2f9e2e275f54b0ae3f1edac0fe568a28108f93bd9e9d2f4cc8c6265e3ee79c9e416d4d124145270cee7b41a4f32716c9742ab6cbfe3cd6e9298df8becd717fac63c5a7880169691d12a31b0763310d7e558e2c1afa6ed8e9ac776a50fe7cae2c3100e8f484fae1565b5cdd2ddb2aac7d9062e8cb25e75311d0b447c8149245c92a76cfac862173b37074aba19153ae7baa1f780ea899d99397fcc25fafb780bdf0b43978e325a7d355721ed2b4361eb08ece897670744beef4d31e52703e0736f8846f4c1a4678824bcc4eee0ac0a64106e586fbfedbd246fa7ffb090b1e4e807b1766d0820ea328654aaba569ad0290a2195349d25485e35668ef113054c39cba9153d212485ec2d3fe6d3c1b888fd6f47b479703598582b048552f9a3981ccb544c1a4836da60f776c5f3e485a8b5907903472ca2ab9f5ce92fe2434f444970e1a757fe19843ed55c1c6489b963664980b030c034ca92d5ff3a00197db40239f937bfdaafe4b1b4ba85bf6d041b96f5a422e754ffc5705248226bffe006e8efe943f5ee74df69ce5734cee1faa4e9be43edaf5e763a5cabd2048a89936143e8489489915d6ab1a51a2d85379045c99ee6267daf8ca67991ce9189d314d61b07b93241b4fc4c7dee8c9b7eecc2b4b9e74ec89706f47dd17eab6d08bf77195f1659733e7e2384246f3024df6faa50f76a6b556de4ac9b16926fda83a686ce2cbb98aba9e050bd5fb44a66d16617b4695be24bbb1337bd0aab29f504d6d6eb89d0a949786ac64954494cceeb6f3c4c87c39bc9c3f06e321dd8c172fc355c9faa8740809e1d325955d1dd4258d88bc20e931c572fbec36f5a4e045179356486f8ee53e1401c61127b8c5a17cb81614951e5e889366ab04243f08fb481ffdae619973ffed5bcc98cad271bd882b65719f5bd3e2a35896dc4e219dfa1a377d27879d0e97cbe046ed40b629773cc279076a300bb51d0ede08e148364300ec9b2ccf809e628daaa622160cf705b7186884ec5cf45b3a297b76b8add4067539b375544dc17dab27df841036bb2d2526705d184f9727d87aadc2d352c61174449b4417a93cf44d8103f09a0c03d2bc02e345bdb2ab8923b8a074ff48ed7cedad936cb633d39e273d152eaeba3b9e381f9067a6f4b1756a1346c966b77a550cad884699a3ec5aa31dc2adc12693915f21951faeb4c91d19577a0c7209e5d3bbca8d84c605a8918cd9761ed1240f258881f3608afad4415fd74bdda742a83da4a399a436aed7133ff24414ebbef1e2764d4c34d17b8d06bee52c338b59264f080ff06e728c5c8cc9a62d41316e796aeb17783031bda05aafd8e9656ca0f004884c33f87f4b1886c24e23fc7b59fc83077642245f4a584128111721c9aeb19fc6cdeab204a817367f04453ee8b58c4ebb16c7fbb62116f0e10f9dc288c3daf1631cb3e66ac5e7a0ebdc60a35ea7b486ee62c97e10e59a93837fd7e8e0e9d53c79d666a6432d1c78127ef6cac5a4fce8e85407d651b6e6fdac8283ba50512b8267a326e856dedc91489b2036d8cfdf3c571cde2ef5a4a6228abf440b43b29bcddd5a0237c002bb1b2a85378834ed97ccdcaff962da3583b1e63d2ef6b391b887d67eecb82cee4128e2f71086bd5762a1860a45c59d94fb7e845cd2f5416ac1f80bf12315190ef0526d532a1e9d9a8157fbb44a7cfee66de0a8b0480ea16dff23b4c9dce31131039aa6f6af41a772ea19ff3c5df7416686154e06c6e20424daddeafe3e6e6ae2cafcff58fec7ec45b288ef73e9916405204f2adaaffefe6a5ecd93ba602ca79223f994ba487f99ddd8bd0c35600e11048789b279ef585d37e62ce1d1c437239a58511df68bd316063787177f8a91925176f69a7450cb03828698ca31905a27f98318cab30186d0f34e2ff45cb365776a0f94f5e44e0410cc051e5b96266e26682fcea87604d0d73361fdb9fb957d31db5b07f4b5d97b52ebaae31b067359afb0c8d68dee37bc442cf5ff86b05538dc8d31fb7768cbd3756490a30d194065d849c57e791287260435b3acceca1363b96eaf52bed43cc6ba3b554403a47beb7ce32bcbcb18c56e6d918e36f6b420640f867e4982342b57ae1e2126f5bd1398913935af5b57852b8fda4a277cdba6ccd850ae578ca2622af0896d7872227f029c5a9529488f9ad5625ae5a7a6567d87e8a3a84329d1b9f0c2b3711c7ff37f14ab6f81780aaa7c7bc3434eee2284f02dba4110396697d43a2a3b64cf25dec64a2c59943839ac1b45a059f366236ba2c0d8d7a42da04684c0b212de066ae4cb8de50ab1472caf2d53a718dec4d64e31b2aee32616119d8a3558317237212d18d2ffc5e0a5616a7906b91c888ac6a76f70a15236beffee275964268ac5f91e955842d91c2bbd04c19b1a8a9d5e6df05bf224aca4517d8db9f0b9086b3a053cd7f7a15082ed0413f6eec98088203c78e8ded7192623329b4a533fabff89b89cf100ca1574ab15255e84c2033481dbd5ac0464b1f5e79731308df18d9164b2aa51818ea9dcc058fd8e983d38d7e84f89483c6c03ecf65fbdd4f3eed1f654eeadc7225faed914478ed94409689d216f03a306a3c52e2c153b1de98d7773266bd5a5e930868620c9d20544b2b0e157abc0c664302bd0a7bede6cf157a542407aaa30895b57515cc265e8d571918712c774abf68c42dfb6e5b67167d1a0b03d49d99812ccdcb4907cd6ca52afb9a82b17254250cbf56c2886b71cd2570168310ba7ae6ef46520632686d28c0ed495629a59b361004819ac13c8b1b27735ada548b91af4695d1247034ad9af3b2ba6659101b49ab3fe3276756e7ddca48d0d26cd4f5867b8ecaedc9644a9209b00fd076bda19e15c3fea4e02fc6159c5b96b0d31649c99928352eeaefc3179f82511b37f7a25739e279cbf7c3eabae2488bd0389496f3e4112536a473bc1233f27b472468ca847eee082a6afa4ca365a87362603ccb61935101c997b7ee946e89d47abc3d0abd883914c194c17cc17b510a19585881f224e89ed237a90ebe2fe7bc47e7274222b7d16ac9d56cd007c570a8f4f9052babb73f899d677fa2edf7babff38e5f718ed09b8148d4dc5aa24df54e2ad34067b91bafabf89dfd19a4c835e9dc528565949bb78bf1f886e0e1981d86e3ee9103240ac14981b074af45cc61c40f581a4ba630a920ff9e14b5a8ac8cbc1ac2863a6a64f144add63683e1713f5eb2edf832229b45912ece8d971ee3c3773d2653144847f6e6ea89449cf9cf1a7c6f0f676dc4ad67af5a880979fba322dbee26725cbf57971281d6b87a7cf02515dec94c7618054e58dd5937498f28f752e46157f7a232437c3a0cdb4a6781a09f91485392c11519f4618588a03aa1c6bff54ef2225c1080731cfe30dc237a4cae3421a98243d1a0b42366ac9256dac8dfe7694ee3869fdc28967caff931f5a7400f50d42b9453eda8b9e29bb9eccbc99592b87f26f42904fdb24837503d47e1e123a5cf278accd82f95ae3a0fcd20fcb73f4d8e4cb9eda50863a84fe21a34da368889f814015122fa33b859dd7de701b3160383223813451cdb5534f966a956efe2218fc9cba9952b5f6a9020bcabb23e1c0028e0b3f26a003d169bdac4f54beffa27e2f5f9cad71db9d3a097035acba205a9c60898338da3f32fafa4cf5dadc2e70336f4268518048b98f8637640f0ea45ad29646fd4fbc270b661b5a5bc596e0d1b2207666fa6283504ff88c21563c4b03e0817d3e3f4a9fdaf1ddc668574b2341c6afc67ae3377322ac9626c85e088cac7387234b7d5743ef93cc7df7076bcdd36de3e1deb00c6a2e2a34abe0dbe8fc75ee0198ce8b14ec8bc5d6fb211fde84d9629babcae5001ad4e6ec8afffa9cd02f355b466dcd8a81115f98ad896cbbed33c8dc2d3247a598e4ae78e2277748ead8a5071633b4512204098c4d9a0b717125ce53993759fb12abc550cf1415fce5001c397d9629c237a7a3e609317db5b3b483d4e99331100cb7f417a899fb92be3f6546aa3849314c863ad1d78c74bf97a0b79a3cc8bafc3ad58aa6a5da5ad8d5fd09a9d679d96d12d4311da3591556592e381e9239cb77bd66d9065d8dd2616d2807b55376d8e907ede7f34383cc0a53c300c6e6b6a498fc060f871305a2d560f926e2c7ba668452d73d44af62d15afceaf2e939cceeb50bc98d079c4482da75636061a334c400892f2b1ee1da8e32c7004e5285737c1b311a432f2b4408fb69a15d36234489a7f1f50c451d8275f4083a9124f7fd070eac8be98f16a0c5f467f93b2cb5f283ed0dc022a45946e5c46b39e0be9bc844164ce032b430587e2419752dec1b67c5aff5ff72758965de79b5122b80ab292b4704a0ae5ec9b3176e6d647627c53f52d4e363af7db58ed976ac4f63adaf19775f297e599c01bc85425e822d0c3963889be7afe7aa9584c912ef23fec578f6efb4b46dff66bd5fce6446f8a1f880947c33fd81298539b63f2b88881a2d4f064bd945cf598ffdad4dac5e70a1c386f2fa9a92d3fbd4029e27018c8dab866cd313fa045ad914cb1ce7f9fd727effb3d9d34b12fef06c1c0db513a2715d9a247b52de1005d87ba20e3bfc3b06986021c4f834cab4c86098d7549fa4d26fff7c779aa1106090a4be096ec7bf9b975af6f4c174282f4893501dc462b5f0d3e9c56aec1f65c489a77bd8429c180b3094da23b098e620ad94f86a3bdd87225ad40cdf07f291a06c909dd9202ead4266db2d39cc52ab7dacb868f967bc01b8e79e125e8f43f323cb86712a0b94e12d9c9ab524db75bbf49c0f75b1cf83e3752a2de2621d5e3f9e469f6a25585ff444936a12f2d704bd6365a555a4e182410d9a85d84cf4dc40d57088d06452cad2457eeb0792fda119b21625b0c048816dd5356462085ac82c81a6982fdda285d5fb14e87d11edbdc21e4958db8c8083617b3195a3e74457aa6be4ac12c288b6d999109e6f7bafcef8b669cbbe352437b3bb4803628e8e2fa2282b677ed41afd2a48550f80b8ca281e8f10e39769df87c51de50dc550a9e9bee3ea7eec1b2d35fabf2c3fb129a02a895799707a36cc192a1821dbeddd61323d711ab03022df2a438971821329ebfc27ae89b468a9ae30a0a8dfd4192f996e5afbee98e0fcf82d0885daf4f614a03597d9d873b2a0c4d88d02cee84e4037c3ba5895bb88f2a6979789c9a32d68612cc31ee8f9c39092d645913feda93b53b44db136b3576a3c877df9006651ef36f9712d306ac6ecedd2f3597c93cd8285592a85eac0223bd3d5a041a66bfa6864901f9217f36b13f6c8a47772de206e27cc6802702e3011549d6af9bf6b14bce532ee7ba1a1a1fbe15f3732b8ed806af1108e56d43f20d2724f9621f307615eb4060412af5ec7d9029fd3a339e5d9585268005268abf1755f9be78ceecb0bcbfcb96f09c1627dc1b22b28597388a97f43b1dbf0203dd6654a005a2b6442c4893b62a28534c49f1a234abc94bcaeab075825e599fb27224e4254099d297e2a659a79745368fb1f9e38d042008fb3e035c68ef0b799a3c14ad38893b63c7e189754128be43c9130502f2931fcf910729edb2d3ee71aec9df98d269730df66aa1a0f5b7043774b2a3bb4d57761b5ef702fd35c35e34f9b0f476a83d32295b48ec62e42ec0cc4fe0b9e7f1d3b205a6fbf848ed347dbe3d339a296d0b467783119f6cdea07be058c64e9c96c781f39a214d64acbaae211ce76dd6bc4aebb365bc3917ea27cdb53e5849b0dff068ddaef33a9a3a92000fe284528c9f591592bfb98fde74246e08dc6a001a91118cc9ca9c05186d3aff33d53d0577c5061ddd3ca7ca5bbc3dbe2ff63d54d23dd3cb8d12a4b2ae65e111b6b335e6bfbcf07cbf6663a179b6c21d8e5ad6b678223203c54083e5772671474b713185378def76392c934dd896755613b3dfa3c816b013922db4e77919ec4e4be1dcd0ae98d1738e53902d4ce86afc184b21f7da1371458bf68dda0ddb25c486bf88d754c1e10524d067f9d77af7d0220652357de578766af2676fa2a22c9dee118e54a75268a0f15e6bc825b0f7d34cbe65c510eae604d3b987038f45df0b4bbff97629e623ee14f48b893e66186c6edc961ab6292082d3f368ed74f663272ea5400852f09d5c6be4530b99b87d22b05aed8a646ca8bb6ea29c66f9786cec8566b1f1ced4bc7b933338d7076cabe2e2d7706cb30cf63d82026894fd8929766e8f5b622ece3b29a52971de73cb9c50bcf76b259302fe71175ccaa16359556d2162be8cb9e6fd7e3d4ad5d722fe8276c3bb3b19e15ec4bddf4b675e22d26ab99abbd23b818eb75d41d8c3d250ef239434f7961176de77971a87eb245aa2fc652796e9dcb2f0d021315c8f23b5ca5338f6d6b16625285b4f5f4f1aaa46bab1e434fd885c0e0532127d415047423c6dbc753e3385514a0acdfb6d5ba988ceea40db458d2b4001c02858b62654d736208d0a954a18174ea63a48c0795f0c27020715656d0b049fbf9cf3630ebb4240cf69824e10da3c6744866ea20bc07171fa33598b4e5ee5eaa5d59973886524f278f831e8b71787dac358b9a05c271289496c842ec49865f43e1e1d888afb3d85b3a8b74c17321897e3c5fa8abc51844aca9374ff066db410e2a4b45ddb2fabf1b202c2391fc3266accbde91a95318f35afb69883ee5ec3721bba12213c7181de23e6651655d2b9619d4aac08de66989afcffa2e5c1ee67b04958fa58bb4bdab3fa299a97b59e499721817e83998478156bad449558b11200234352f3d33c745ab26ab111a073509a90c6514175d295fa71695d8e485290ba63f136778eb864ad000673d4daf53e782a5e52684892aab6a4fd0430e404ce4195d880a0067018247ddd2cd07f4b19a8d65369e2aa6e74e42d5a6b32ec3ec32f4a7480f81358ef84ee201e10cba1379897ac62df5b359a357e344efb72763271157da8aca1bc9f4a2d39ffd4173e89dcdf6bae37c43d2c665ed38dc6d17e38a0f691cde3fa04d3d9c1df7325131c7734f582ccf15578fa8e0c6f3bf164bf2896671e624dfbea87bf08204041e6ea5c57cd14ac676ccc0727c8d55b14c4a1a6f3f227912686bad380d0bbabf3ea10b44efdf8ed6f2fd359773fcf4abec3f7f3ac6feef96a33e0436fd632969e4e127b4fb7579cda127af98e56160be2ddf7e6d8b868a8491a0e25152a6912ad6bdc561f63169315cefef202575fcd0b9c7de473cf3a447049292b95e08c0a3bbf5a969a7e563c3cb016da033b7e5e68ce78c2a877cb2ba806b21aa5a37ea175d11c3b548e1c47c6460d91419214603862f6728861f8f36d2682b1f177716857c3eb345f0641e569e31cb992b6c2046fbf083adc38044bbdf17bb115f707a7f72da8503fb6aa7a082b2b1905cf35d416ffa996723a23123f5567a5c9cad55cfeb470c394123e2874c27cf9ec3cb830e6edc2b66f43b4342f45fe260022f175e94279e2a202a18a052888aef459ff82e1505fb343869c793d56fd0e58555dd28c87242147d81787c57e1f8a964a1e8839986d308f0ad3f9acb65109eb19d821bd58c19cf30e071d8132a4cbe782d4054b870ab71c8e88a47c934644cb3b164feecd2d54272b0e4d54ed9e7483d1309d3ed79b46ae1feb65abe11ae879496c10a0479569e533d78b321b30242681f3a6f6460f608d853b748710602460771c578eb6c4d7c0ca0b8d46557947048d5d8c05c80bc2f12ec3a2de865047ce8e8c8edcbcd26ddbe5f25ffea6f7a76d4b693bed20f69da7ef5c892f4e78e53b6e68ea86e83f0da67b7474244ee0f4c71d4e10654ce6663bc746bdd984c91fc47c9e740b70635f9365de39652f1c0ba24e6d5db5da3c0203691add207aa9ef38dcc261d97497613a3663187d01ccba51793ee43837729b070168ff01c2e33c57f91c962c621942795223d4700025175287359a25a9954b81591e390ad580e88dd0416593d1022312294785d97e1854a797150c19d4e9467dba068a8112434ce4f49a7125aaad95050b68c40ddbabe531399870ea39386732f30ca67d1d6b59bbed9c55592ef67556d054c05741c5a1afc3a4b0a34f4e89bbb7d2493966cb0c473a0a6fc40cec1f71429c7a826a286c7d84f1f00bb66275cf6f0271136e7b599a06f95f7158e6f432dc35686aaf6c3ed3e3de856abb88e80552c4f3d2a3bacc981b1a49d83434c707fbf7fcb6bdb36ee4159d7a59854ede3b8dc21759f047a481041f25fceb00cdf403efbcc90f82b39e2ee050a105043e7e22c6eb6c1d12ca8b5695e109a3f4fd2fbd56373a4e0f34229d666abe0d1ad62e2a66946972af508e888797ba4b913e7c659b3f5715362e953fcc3494c904ebf9e86352845985b23e4e6cb642d402b2382327e8a25f2ec616ba5f7b42ac1192f862468d711c66662fe965f8743b8ddee4588a00916a8d3ac82b07f2ad78cc4fff6897a0a4b14881f5c746b8304a7413ae2fa5856cc75beb14d27b7d966b5137f658520acf11ddb4ba8f9b2041d906179c03c749c90a2a53d4a2bedcac3ad680e17b585e2348005d7f7fd1b2c72bac3e9512195578b0721215819429e59f189e5b681e63b9bb0528565c6c413e8fb06b93385b446e3427e1189ee0f91c97605d25a244d4ed63d9c551c1851af75b38648114e0592b9cac74cabbf28b93166fc46e336c065d1f09a0f26cc6d0a7b480fa52a79ac6d006bd4f95eed6e6d47b5eee066da00cf27c4c2a5cd136f36f48c20d81e1ab1c3aab6d6cc7f8dd8bed31a60951818fbef26eabde0d93ef1b1d4b206192ee0e3b484e5c6fe603891ff507b01e146bb674b457420031cfdc0809384daf0901afd58e429f32c25d8286e1c70a7b7a126c8e3801ff4d91c71f33ad2daab27b30397da7d104314f84391744de33a67aec1f47e3e933f142e42845b040fa2682232462752d453f84eb8e5aa2e82852dbcc64490c61c98cf2bb0051d230a3d726426fb8857404962951f9f1970c8f708ed93fe4ce9e8bfc7262f5c120a133f329b0f005f4e5f59839d3e007c027c118bda957d8a6eb697a832656a6b17750f809314477e5032729bddd47c9b7c6ebc2baa0982d6ea1275f5f16d9a3c987628bd3c1e9fe558816f044440d1ba2367af1044afec53ccdbe042e8c0fdf8fd772fd9cc813125b7b5e9f0124fe15cc920cc0abdb6c8cdfc67d5019167fd2cf5d060cc0b64a6aaf03423a816aafe3b250ea048b52835991fe9444c5c0ff4e94859d7c881c73708876bf3478e9817394eb784b324b2918044e51246b9b4a108a89b3453a852d3d40c9851f573510f58519f4beaf06b4b578e7d9bf346a621e188a4ba4f3137d3e9dcd83ed317ff1971eb42182f0b8c70b24ecab4132e01d6ae65b149e18cdcdf50c05038188b8408e87fd5df998fa6365406d820a7abb2062db37593c31ca523db22827f761c8d9ec4a8d2c1112dcde7a8f114102a10cce708be77755352ab9f1c2b980ad6da6a0c046ea024ee92b98296b293264200daa4398b3731764fc6d68a3add782567186b3ea8673f84e54abb859cd81170377ff3cee91e5cbdb3e37072ef262f698eb43c35cd526b3525c4dc6468cf760bb81784911fb513846274946b05608f687c4dc970e5d2a97b0532fdb6b3bdc176fd4937fbbf1b18803762f2bab1abb0a46003613bad8c7a596d691d86b909f6bdff11ed62fdeb2d71b0ca8f1b96519ae532d8e6c4854b3615f2ce1a9b53f3f1f41cd733f647a04076370b524fe2111d3f66e9c85a936391ac4b0adc0df553a11240d4af6ebda207608c473db8111949b756b46dc26fa70c9e80988fccd0ec6e2ffddbd3e12d8bc77fdb5d87963d32dc3a9f174510f530d3157e9abdeeb0b72113abeb945faa39f7a0f507f8096a7a6da674c49ea752d46936a8a812d1a4d475ae349942f59def4c38147037d89956127c321ae16722cfef8107fa7248110861605a5961a37586673f756b431d169133de7340da04ae9ff00f0e09385ccabb3f49a89c8663eebf6e721f992b994f77bdd81db84c6fbd21b2bc609877aee6d438da6b20f63b5cd4b5f96f7949312bd9d827d4f0db56bf0c2959c600986c70a884262e3b1d889c25c5ec936f4af59040009b7853603ec5b88ff07c3f96c6e5ea62409b22ce6898f792c222499a11bfcc101990ca9082eb6808f85acff3002adb6b99c344b13b489967fad0689f30e975baa23dce933b136471dbcb07a38d04e0f72cfd13f8bc89e111b42cf1e453871462b93ac96b7e570a6db3db83f9dbbea7b353b6e7f2b36e55d6a88ee220d2a2796d448e305820010a8a6c08021080101a806cca51809f6fb028bac197a1ad2b2aa3a9ca7e1f29e640d91fb2e89476bb2d14e4b14aa2af28ed8f66e884a4dddaca97dd84f1ae5cac96986f514152806ecf71c7b2abb22312e4dfd3aa6b2acf96885bce250bac75b45bfd5bb4ca1b140e8be097220474c23fdef63d7b951105a0745354f3773a4c04848432e10dbde3033aeede189c1d1c7e08f4557bdfb708a44b0754eb183dcb47f6affb554c7d4b851162ee4e5e57e66361311fdb7d5f1efd942199107fb61e477ce239e1badc0180b3eeadad1fb7774d6b2454c1e596044063767c21022066f563d4d49f203e21748961109a1cc3263856897d41d7fd7822c6f0c71f63c6f40e3b9d291005f94ee1bfe29405c89f19d28f26a2370ec9cf9167a2447bcafd8627b8d091756ed5037412795a19486386e1f2250c80f42b758d6b284ec3146b369387af07e98ef39c1fb536579ac9f39a3f1c809c5ee3d9b6666ecc7edadc3c45e4b9cd611b33fcdad85356c8d5943027ba91d3db8fd606503bc47aae6f430b62a15cb762921b53bb1e72a22062579865409eb70407bb1984b84e167f799a80e66db69adb195d58a5005968c55197cca467679ece0c80ed94976202fd0eb34635fdfda421bac7064769ea85cef8e8f9a1c89d59146ead0e7ed5ebb2d74c2b75fece75a5ac721892ae2bce38b12d858a61ea386a5e811fe5f477e2dda001e6bec1adaf5f77efd7a97bd1def6742fba28818a975d06cb74c92b062578c65fe6299a85f28a7bf44318dc3c81d6c3daa6f01693beeb5b00159583ec2de1e8e350a4339a014001ff2837714cb6dd226582cf4b9c5e3e83d5ddb23eaa2ad0e9777fb73fd7ad34e7890ec4614984a399ee135e6ea168c270313574ab37537d421244832c8cce09c5c1d74d3823014167f2e01f5a33bba2b7bc9cb7f101507ebc27cce5dd19288c8ee68828e1f191dcba7187c8ab25aabb33feb843e6c0c7325df43627271b3017fe27c62a6dd719c9c385fbf57c5b9a5f983f44534c8371e181eb29c168cdefd6befe8de3b7c938e6d61496cb92f3b141da2707d4570fc4e559acf912a8be0c2eb8d8958f8cb73497da499944377f5be83d8f0d54fbb6e5d76f0ec714c0177dcf7e9455473d99e8e1bb74b8273e14dab62890ed45726a1424c8d360c600c7cdd49c3b0559131e2759ff11dad5448b56a1191819b7ba7d70916d5b6b75a4abeecf14253e6ff71dd36b001ab8d10479653a64a3074775be9251aa18bff3dc236c9c2a12aa597085fb9900763733d305ccc10c21ffd1d8f3a128979f3664de4d7eaa87e22ad62072ca7c729d2acd682e66b058e6bca192de134e16803090537f797302b277c1d256d72b71406d30150e8ccc2b555f81a65bc7f63ab80cf19a84b1b35da933a5ad46d35ecaee9e22a68891c11157dfcef7773b37ed10b65a56dd8931e7e1aea10a43c0d42b0ea6aa017fe9bd0c5d9c5c1c7c51c51ead05ef77bddc327a59bdc0875d0b7ef8824fae892f46855e342af4cf8424b4bbc1da56fbfa735d56a8b5d94a4690632a56629d2a4b2b0a634f83bfc92cb77847fab265dbb4aabce07f5ccfa1c397cba9b627e7f9327b142d0d9aaf10110573a9789d2edd6a04f6506dfbe1a26182948feff185363ed4b8ae595e120a7098e6accc69df8fef256f2b0fa05d212670f4d55830843ad59b3829074e55b7117c2ea91c22092f6ae0585e7eb1d569d27ad2c16355d5a83df7805c5645ca2ccc6a20215c48ee0f0ab77b3203f61e5916542cb99fedb1e3e18f6d4e370cc2ca73f2fe059688047a4a067d626aa1aaa03616ef8447e3fe311a583f4cbda175f8b9ddb3062afa626d582f21753deee94df19b0eadf9ffd72a9af623b902d106f7322d94e8e6c8201d053497cea11a8b9a97d1e76b8d1c4f749d34c268f784e1d35ff8504aed4431140087dea1c043bc01fea4c5000519d7959720d9e5e45bf9a6c74890e04d44dad266df3bce699dd25e462d089d272d65cc3446c8b33bbbb16ab921b20e14b159b2beaace745653d801bcef30af5bc2a76816c02dde348a8bd4663350742f682d22b27e2b4712341f23811e151cc339dde6fa637137475ccfd1f02cd38f212eaff8d52bf4229647eab61690542f7364dee53fc41ce629a22fec802f41f52f19c3047ad3e85d6175486676cfbae47546401c86a7f5dac96cb65b194fbd3a1895d4b5cc54cb30594d81674a1212205214d624e10e0d300ee36ad5c2211191401d28c56bc7126d3961dda7532ebfb05a4ff206374007fe49968bb2fb8e4cb2d95dfebbd7f207fa8ae6fc535564e6cfa76af8596e56138af4b685b52f7744ca12396ca78e918271ab1444e65f5a79c3327bacfb8280bf5bc54b4cf3d1c03b998d7d9b2487d9d42b1405fb25f9530dc3f1fad04863d9bf5cf4bed1102be34883c7f1dbde224a3ca31430438e1abc23490f65f8d39bd3b0e79adf91b824191a16dde672754392b857a245e40979d2fb6226dea5f17e0d9c5b4c519f1b08bf9e32e314cf4275fce2031cb3977f946e18c2655ef6fb0f571826af2a1cf9a1dfbee4c07bc13659b609751e227a30555a43862020d4347fab9812efa82f235e775c6f1e29d9371db0592a9a4bfcee6d7bc779ce5fe11fd558dbb1463db8889e7658b9f0d2d71f4c2bdb3caba1a73f785741d3b47af729f390760dd8b67587b06fea1ad78fe61a2cf6978fefb282b0df576182fa3077d8c8bf722b8f6a26f889de3326c5230c6293b6e18c12c73ac42799bf91acac3484696b724c0f60f060a5cfd8a52187af85f4becdb7aff67bb0c5ef57b67ca455a0cdafaff7d96b267d265ffc0105f57de09922ef72561c82e16fac5cc9f1b3f968e45990a5fedb3403a13d8b577a6c2dfbeb911ca924012763d198b902378a94701b9edcf5a48f57d1c526598f9d678e503769fcc2d7246f955ae257efc44cedcadb44921f109631cd8987eadea41bf35c54e44e23accdb5c514d6622b0d51f4705594d272c6962481c037bf15b0e50ec42e370ecb1c3202c8ec4ddc36beceaa2f505baa3a89c1c4bacd872b7b89b99e9accdc802131c347540acf30b20ca42dece9f6549b9b33416426b4d67aa7b1d2304b0d3d3e606e1dd225b69a865e8916c28b1f8c7a8ec0213fd421186838a69bb38a2d442168e29cca916aa8c9cb133ba34e739ea93d54fe2f58ca8d24210a59193b9aecc9ae7c4176ebc07858c323788848611e4821f2b57213ac290314a45f7f31f2f68f0023beb3f473844c19ad281672b3aeda7005ef11baeefc492f04eca6cb6f0925c62898343958a5f10ee828bc51c7e2bdd07efac5eb9ff41d1fb46f240ac837635e964ecbc431abf57a9eb681f720ef661edfee907d66e550327f0fc61af0e2489b2232a543fa5b4d8bc75cafae7db71ffd3c555fcb5416fe3d7506c5e03f1850785605df8c6fcd1e41fc485f12d421980632bf85a408c42ce430c0688a2f2062be7ecbae4c319317285c2d5b8bc66087e6c892f1f85451a02711aa81da20e8d3c6b8d0fa8779f8ca2bdd4af1cb83dddeb1de43d6d9e2c1c26f91e216c26517b1ea54d36a4c2bbd7f999b1ad2c3f6f9ebbde6f2fd236519fa12feaecf9796cc8cebb843edc166fbd2ec3b91c1ccdefdbe42b22a938118b86b74c821d974cd65e14d5c7b384182d1ecfa22670d6e818f25da7eace1aa80c0f5ef7a208da22faa029393cbf52687b80c02de2ead3010d86e2728dbc031c88253a3977f9b6228ca760b29a47d1a71a1473058ca7c2c8adf38965b748a523ee9c6d44a4f288da885258bea149a2f3c25f77bdded0355cde33b32f55f1c9104fddbd13a17fed4ac27a1f798b98f7f9058b3d8ec630c6d1887c2c2d9ea89dc79d6e5d1b0fa202b6e3160c0ce1a0b6aa2456cb9a708f9a8480d94df87f6030dafc80e5f51bd7181065309b20bc156d58dd1ede6a73fe5b970e7bbba58e615841de209b560a6464cf381624793e2cb3012eaefb371fed189e1cde846781341f965d43f59f1e234b77e62cab81dc3a1a79d9de9cd64f7677d5a14fd7b1c50e91db4d8208dbe3e1ad67399e2bb9715b059097f47134d9bc8dcc91ff16e60cf084881db05059b747e275a880fbef8b7271dbfc354009f832420736f0ea70c015f2dfbb46adb69c20595baa9d66366876e843a74ac92c0647ab29e16cad1b1d76615741a547963d172e56fad058d4f0cb9281ba78be66d9d09cfb1ba5971fdd077e1a2bb77942461f04da4f7fbee5e8247c3fae0e7fe664f2f564399496682dec224a9bf502c974c5ab6318bccc127354d870f3c94659988be135dcde6e804b1cb76ae44a54f38712689b0cd86fb2cd2a4bf257c91b6cd474b629d5616d4b47ef282d1b74d633749342963c424b8cc3bd3c8a944e48ef888755d09571e3e8b86439bd7777cd6dc922f0dd1a236442514ef8131c628a0b73e6841518ec88f693f1e16d8f39a52706c631e44d20e71894b00c1f14b75a3e58fdc27dce0581cd46bd9ae66f54520842ed060d9eae67230c58df9b8694fc443d4530b51e7ff5ba44a3aeed4ac6b7bbbb125075e1933d7a0fe997296b12f0136a6cf5c78f1c24560f4a0c99e1038529c4f8f3244ce2ec56132cf45ca12989a6ac41a897f34d83c0168ca71c83060097cef3cf7f97b4d78f1c1d0fd01c18b4ef5835632bf20080c579d1e82e7d032f3c1e7e9bb295c8319e88dd001c69106d74e4ec0c3dd5d24bd1cff2c287ca61ae5b45e4d2d659233be3ce6a7c232d1c535a28086f4b1fc1ae25bc8196520ec1429413deb2d777b35069304a928c12526d2b4755ab052011a0fd6b5501f3193ac49b37ffa85d0be031c972d47e6a390149a08d8a84314dc3fb086cf5cfb2ce66087ea5ed9ffc80b10cab0d05fa179dd20fcea5cb922e750c60b74a2844afc5872aa6f43f4659562e3841d5d2d5335dff24ae360a697effbcaee3c3b511213446e53eb924243ab9c04c9f90123377a038a09b9932a0bf78fdc40d3b4c6706630649e797089df761f25baa62a2eeff55049d2b3fc566802498b3ce10ae69de25cf9c881ed786907c199c3bba7c835debe55419e87445a402ff6cc169cc152695c2005039eb1a55275f958f933223cb0145cf67581b64c0740dc3df73a465c9fe74a064b9e855edb72ccc80dd0090143e28450e5ebb1c1a13eb4cd3d5f93aa1354a3f18386ae358ae061406393cce531959725aa945652a14a3ce40100368699dec490c7d0b494145d48a35396046faca1cf9b3cb39d8392e3728c22adfaa327ad54bcca94df2d949a3bf9b84f1faca6c6ae612e99949a11f03f7ec045efd0207d21c75bd64537c9f6465cb2e917985d7ef0ba320c5dd713fc5c8718eeb1e50f37eeb176dd37ad7a50f6d0c666b7bbc05e4e168b07ff2a87c025c8b51eb60a2c8e04c745be1aeae87711a1f1c030b8623a82064ceeacae6f9f04dd67466330756b425f776e9919d1cf56a6dd4bccf0c5465120212ead57b65478f189fd3803b3c6963c67bf30fee8f6a80dffeaa427cde1b34012f1a2d2d4775d395d4c5537071c29aa6cad2d09f66800bc787ab700c90c028c2b7246d64d0840f0cdfdc89db41617f6e72e65516c1e8cc944e76899663f29746eaf5bd7e22b81428abd2193370a545f47e3a1e025c697da235ce500f2535cb4d416bdfc433b91b2f8852369c313c88d483ec9f9f59e70ab8cb504c13c6fe465067ad02361db2546aa6182f0538ad0d6e2a40a81fcac68c97af900ac6813cc174cd69e4df2699b42e915745d0b0ad601abe784d39823dcf3878f373f9e2350cf0eb0ee7ce6fb155649e06297174dd000d9af83c8c4320f0425617879dbc8b6733b9e42646efa95206bf84336dee38841f3813ada30976b9af372e48684eddeb7076df5afcdbae6989f8ed56845d34ec557bf749d3bc629aff0395464dc4666dece07dc31795d73edc284785e8052ec57d8138b3347ba547981c591c873468087ab5eca1398dec718b8347e879ccef782093e5eaf82412d1308b2e794387448cb04a750e8295c684e6b9d2a7d4e97f06b631cb5ed148e8ea7210e8020f41b4317006077096e64ad73b3c9e0bd2ea3863ee9142d00690bd61e1d1499006fc4bfa9ad54b993261f779490d0971f18148bf3678d70601b9a1938cc8ae66ac52499d0ef692e23bb769c3fbb60df42214c552469591188bcd0768c65ea3c90c002bc9b50bded4527fecec42921c6f349b8cbce3ee07704e4c9896ba524e006e3c8509c6a82574b5e4547de5022b287896e943344f32b7c2f144dd49934f301930ce74f46fd8e000c6b56e1c5cc531a5996315028828159e0c6b8ad7874f4d478182ddb4b8d864313a116711ead8ef45b1bc131645655f387ab13247406a7bde67f9a01cc4b25a7f8a46b2deb4b53dd1b61401b6ca4a0ca1f8206f460c4d0afbdbb364ac0f56ea56f1b9ff44f51f55423c371a375c6197c000b37ab4575f9f2c1a4ac06d2d37ca4028fb566f0b0a7a3a8120ea9edf8913f03e2a5ba56797525220dca17f28b740c004b12651c914ed37d7da669f7c7290f144c8f656ae4cfcbded82752ee2d2c9e622d5d083b1249d2dad020acb1398112a96b4ea7925e691158486bb609666170179576a8529a2df4ca1aacdd72596811a27f43ab46115943a2e931a230a8347a1688240b0a8c58f5bacf3f721a96fb6124ad6a92dc596ff1dc96012fbdedd095749a4b1334041c01cc82450999ef7987fa08cf6a681d323e5f4030be248570dea2ec5a33dadcabb98a0869a9e308f7a54c660cf6b8fa92fc79ffc2c218234203e45fa4e253255aea9ac6e03c715d9908829b3e9f36ad5a068298aa5c5e47b05e2fdb4517749c6149c8c8e9c9ee27bc64bab5f02deafa4bd663783251a5840d733554f17e325c234d78c3ee68ec4ff0547d5ed09e93c67a4d5f355a53e12cb330e4f044250c90a58f41541e87afa7ec2c2268ec95bc7644828d0b105191c4c6a6641c9344810b5bca1864e578a9f765d8827c5782012320e83399ecdee4606650aff3dca5d680de18cd2b1e4159a63034514442d7786e323216fede840f792fb8ac9feda1c38ae8f0d3837825b1a5c1e81fd1e06ed97724137304c6ba67df69e6c3085175e100c3eea911b1b85aec953755b9c3b76d29e2f69f2f3f8ff859f6a3a3edeccae8f266140c281b95a9da0733a57627ed7f23b52ed705fd27f7544867f9c13bc81e4252d8121d8fd471ade562a961344b35bd63b78dae83ea4c61282440ddb519cb0ae5c2e48bffe7171cc2b645d1ff1428878250d969d7a204ed95ee78f119c9d7b8990a9178a351e48d49433f5d5e1f79a01ee759168a721ca9dc36865092b6e7fc5af1ba338a75377b5eaddcb7196f57dea9be9b082e6d149fe2f34da8cb16e62735e80b2a8c959b041578f37cb6125ab7a1ea6fed9d68285f0db10c21ca87b6eb45a8f04d55436d22883f788ccb60d78d0ea34e989f020d5aaf123186d41487980df028c7f8b325755ff0a09b24910033ad6b7cbd03efed54dca1a59b42e8f11bdd8319d3a2e0cb9f614ed315e68a65bb681278fb97ab62b5351aec2766ce5d67522f2cceeb20e077fa6d0f1faf611f1d11cc00506f7124e46ed3711a8dc3f9d475b1a92c32a7a00f2a16e02727a4b467f99063501715fe9c888000dc03dffd0f963613deed7106920c8d003cdd144c184117d373c050aa664ab1aa0d874b8ec3d0e075ee29f965212ed06c361a18690c987cc7fa44b19d01e7dd7bab2119d55cd4bf112f79f375b54f8a1b6f1e8c51a0b3abe2708fe1c00b927c467d33f6a65a7572fb39a85578fd375f67fec14f8893f1c3652863177f38d1cefecc41d38706d5f03d5ecb160ead5805336e78ae1af1ef24ca86d507368723f71056794a2b999cddc975712245c213e221328a2ba8c5ae14e8639f4aec34df7116045d1e0a17ae5386c242d502c2f3242eace9f9aa33ac862f77bca6494ad7c531aa32c1aca70c702fe52c2a2c1a5ad43c8614dfb323edfe00de127b741e5c5f8000d892d982ec6782cbe4d183257e8715a52fbcd845b684999eba74c769661db3049de41dd47e523b79685d79f41286ff5d165b462f1d33b8f9ed5b6660605ce65b63172412061cd0a055be6414019ded66443d52ad6fef801f4830e33526399b4ca356cfd67e4bbf9ce7641e70df73a0141975fb8b7c0a2d71140904d7dcda3f8851bf8a207189b29c25617543a07a7ab3788c2bd6a7ddf531d444a1b43d5330d2887bc1271386051dcca5607caad836b0b8d9472e133594f2506c8edd3052a79085827e32d682fe13941563f0f8d888caf374909265ad5ee869094258212f75a1fddd931d511992dbce5bb4ec52ea7bf0b9bae5be67117eb45d7d7d523e3190b4f814eb77ee410c40e1fd5820747546b69849ee6514cb29eff5554c3d22e1fe0ce7114f540953f1b5d780b0486449950df22ba93221ad7008424308d6358a3704a1b449845669072ef58a5b68f40147af8231ccba2ab4e2751df1bbb00085ed112a7148954e5c5e8cecdc4b5f0b1e33de3351ae93b1241e04fe55dbaf1c8df079e0731bddfdea75cd41573c703ae3d10eaec247d6e4c217db27543ca630f12d6618b2437508aca230cef127971938db02aa57b782ab448888faeb19048c18a2d3b7b4c179581b3cdc1953a7f6f96b719b0f2e75fbf6359f1fe1890f4cb4f8f1f064a4a891ed65958b4bc1cef84a3f36825a15b326939229f1b7c4897f99bcf206b3b65f29ea7274fef2704dfc2605d9438b556cd2cc1eb0986bc356219c70df8d22da60b3e45baa768292cac53480f738a5ebc6b1a64950bf3809f9c37ff97f4a4c3a14fcc1ae39b775bd0efd01428d41d82c8b2ccceecf4333cc4cbd9f03c42b781be8f0a495c2997a9edcc73b9e900b02173718c0feccb52a28ddb8cb439c5c7254978ac06ea601c08f3f7a824a951a6590e1bed0257e0384f1b20a10252d53713472190ed15dc09ed005f4e808060435330603b9d3b856a8d9979c0eb747ebf946a9b73b4d39a239f7f0eccc36021d1b3348b9681f9de1115342a1aaa7019a2e9d4f4d29863fe0f343977caaf03d4990cdde431c279749bda1c247fe76bc07c5a14a6414e64a607a4f48ba3f20432642ad88213f1ece7ce8cbf1a95cee334d60aa366223d35ff207ecc6683976f3d3193fd25a257cc420513554ee30598764efc07d11ee3980794e775bb71c8d7b8ccd7f3533df68e7d2f17228b6f76172ac7c8ddae5baf844ea02ff5c17b363b4564389d449551e785193353676f81ad72a7e15e23f2bf11a2d1a399c6f3b22c082c49fa57166b0434f21fa8e659b3f8eae83289aba1136c48e11967c62c9f94334f5354e83da6fa3f4dde915cbb829914351a17fb4eda0811410ac4181ad41c8c4c7f04edd028f0e77217d7d606961f8eb07fc23064d8b9c73b12b1a634543bbc52601283a7ea1995dc459191ce002aa216df7f35615a0598598aa18ac5319992c2a73d77ef98575192ba9a8322834faa9a38f3d4863339c55f4f3972ce8e2b79dd112eae87fcb5c95ba8bbcb867da56e7b42a6ad919f56293600a40697f82fc2551c6aa2cbd20610acefa003b1a4e1c08248803c940844730cd22df38677ea2ccb6e6fd5e30036d92d3668f3c0464881367517f04c15ff77cd508c1f42bc5a4ad243c116b78184ba34a3bdbd4edd8062a8982926e36d916a8ef52db205e65a71568c17a50a742d1cee993ca1479a90120524c0ee0ce6266c4bae96e81aa6537a04ad820b683b1c8a01397be4c69cc96131f1a9bcb611b03546c082e63b6a1cd324661a30a91841294654123e6346513a4c69d98d9074706387897476145cbbdee48d5e587e6160b1f506200c46b8a4be24a345b8cadc2ddf4e1e777873b4adeceed2b6fd739f63c0fc73b29c24685c57989acf539e876f5ee13d3c9c4934e523b1cd3610a8e8585d963d4c13fd5d9fc935a9d0c1a8179aae1501f4743d7278ef08b92ee6a9d574b627435d836a5f3d7cbc64fc6d3c7751ea00090a2258aa9a877ec198ede3f84af892fa3ecf113f036667c743ee2d2c111f006eaa848de2628bbbac82e1adb7b91f2165d9e26eb3efdc9ac3a3ed1c90120bb8cd4eaa7a4b779477a4db47508e621c6e7279f8c7fead38aa6a7190291a902b6c6d190001f511a4c146e080e9fc4422fd281bb03529ab7432a798227a769167e610ec58d79c9fce50ec66501276e96aaa20f0c2840e8d8be2913cf9e6d617b9e8c4292ec3de4d0d0d2378ebf64bf0abdc4f05e9a9be664a526d3ccac50dd689631f8a259cc98e5ded2f0bec288cc7d2f3dd39ad84a8d3ced964a483ea1dbbc8de54295f69b02de86b06b4044fbc79cfd3a71b3a584f4777d7bd9904fccdea3842069f3e37bd750295500b53000ff6b03aa1647ce3199cdb1e52937adf58bdfef7299e211989e972183261265766e1dcb01b7779c4ec16df03a639e461b917f668f338c5ddbe98e6a2d12aeb994fb33665c7faced75f888cad5f1a58605038bbf715ca5c4d07ee3a0af9c29da545ba66c279e0afa580ed95a62d86871d741f805e2aaaf9ebf55f1835751fe0c667deb6cc970c728e5cbea49934fc7636a03453e9cc84a03f46d1d45cfd25c948edcb4ea277942d2d2ed4422eb89dc7f374e3101d730767739f642faa3e585e7efcdbefa35223b8e2f740ab7441f60385eaee0337aedb758a3693a72b2cf92e6d119469451677d2cc3cf81c2df76eee59cfab7748213a0435f2d1f28c5ccaeedd45aae23c70e48f0cffe2fe059d42f4a8bd2204b425d9ea970f7788260d89cec29fb0f5234aab238af7e9aa89c33992b86f84be73aaf959ee44e58b6b7ce8e5cb1e1ed9a2e49971cdadc97c1c7c0b2212dd3743e779ca3685063fab308c907f7d8ed662c69abb378ea5ece02b1cf5b2a23d98e3259f1a71092676eab7ddcd0267e61054e3049d39996fbc6fbcce2113a774cc2b1ed611f4571e7a2afe45bfa362b450715006619ddde58c6805c4b5d8278838c3ff9a33ba4f534b870a3a2d77e6de26b3ff3b74251f3271190aedc8a2e9ae9c80db393bad6ae9379b5d01d6fc161eeae1bc945d86cda537c2966ae6536010d43894955f03295da361757f9dc21c3ddd52ff1d68a9d60dd01a361c0b97f29f942d5da8c48d9c3c403332089433b72c66a69b0aab8f45737d91ea3027dcdc083c79b1b42c09c5fdd09dc403d44f3e19e6af7c324acc82d265ddd04b4c333f91464a2adf04cd17e22fb2cd7a72404d31e66e1d48e8b92ab7ca3bb4d4f4e301342bdce04ef1fd9c06240a403c1387edcfac9d862412c5638b58475ea4e831302a4938358e54647c6a1a764bb79a801451f6a3e7bb4f27efa72737447db72d77ef42a9fdfa2dc52bc06c8ab6fefaff92edfd3cd95ac57d7ac3a8ae6bdfefa1542a0cae653f7b78626fce19736a373896be22a245357671ff4fc3172066e70f30b9dac186943b92cd63796ee555c64ae34df577f0a81d648f1a55997c58df296a18c89f0a48c3c214108fa009f6d59f44242a877494f1b4eb9e92447b17fd63fa2d32a7bd88dc050fa85dc585a83c346ed82817b22593f444554a77ac6855b50640a1cc0e4b6e112e1bdd4ba1fce9e3788c50287cb96c50bde9563b11cd41cbe2338901bd1da4b9523995d4924fd66b5d070951757ca28361f2d322677705bc8c9fbe8043551cca46ad1c1c5d4d5b73a787321102fca6a50a215648cec49045b5c95dfa5233e60df80799d2fa746ac5785b5163a1e632c9e8dceeb0a857056e60597f0a31d113810a5e5b1254892521cae4a10f321aa478444cfd831d7cf3a14333bc890166d70043a4c7256177df981a8eb72dd4e7dd34a71d5c4a33f48168186aa51f1b03ea92a4c8214b0ca9f76c255f068602b54b15b1394b762d3f212951bea56a7d6cb5d0d124714f03c6a3300bb1bdb8faa730f18facaeafec1de34c78c00702fa2188658dff7e8270603110299ee314c404340f936073316593957dcbb798b057b01e743438caec716ca0fd5cd22f04454bb64bfae9360ced000491645a505c7b98a2d088d9167c6b3e3bf20abee4b04a05c0e47325936b4a5fed06d4d955f84254ab394975314d2df19f495d854a86ba06984421ec194a0d278c3f9cff99fbe3c3b8d29e3c73dff4d6a69173b3c48b967b47ad4a7ae5a2db3f7477e9b92f99468936685d1f566341f82186f53cfe098bd75b6e75e6c5196588578fa19e31131ab330a3531091d48e0f69152b077eac82f3287353756165062746356927c2e9fa2ec028d3a6580c8f1d84bb0fe897924a074f575f6eb756f5d89a6cc47232276dd83171f54f505cb28ae34c7f3bac3ab649933f4dcd6bccf7430d37b0e53abef0eb599f79be237cad6b19c748e0e503b9a7146f16c716bda7c4e2d5ee84a595f6abae029a2dc1cd5992439d603c92c18446b6ae34fa4e101c6af92054a5bab740f509b8915bd84ef86b86ccaeffc46d358db737e065cc7cd28db50c720a406fcb53c91fd7ea37d8304af1e036256397b5241a540dd1658e00873bd7b54b5d62158aad92185de760a974c4d0de3556823f2d269ecf7af9e209bc798b1ab53aea094b02df91a373b297b7565973ef52fdb0cf868439db8e9b88c6ced779c809fb7bc4d2946d1318ebe3679154ff510a5df173a47e9b9296dc96f3f43d219e4dacb90cdca8ff4cf75ecc60b43a79afdc6294bdb534b24da6533e8e54ebb1a34a0e7bdbf6dd4c79ffe9eadc3a002e2a53f0582953da8861b8cba715f4a3042d4e863d88a178b003b9a05b60b6b5feff3f0b42aaa814e79890b3f664e045e52c8bf873942e14543bb39e49f1007053da237f26b7bdc4b0ae7530913b0a629bc9838150276a3f40edaf75b481d3d1becddf14c39bffaf7fff2c1f8e828d32eeb43bf65242c7ad64b1d8a3e81112eec2f36bf5fe34a8bd43726c976ffaa0f41361a32cdcf5feb35706ebf6effa281d93d5dfb7f925c7c24e96a5b79036ba3e8db7f52cbf35aaf0f50d4c2308d03a6bdd58445f95fd4a347069cf26913c6f5379933a47a3211776fbaec01f6b2e212de4379cd7d367fac28897a821e856c578a2c65517fe7d867dc8df702edf3519a79107c885612342961300b32f68768f5cd616c862ae242b4e513ff711f2052809b4faddb982312ab95654bc6669623f6cb9136dd9d6555ad877fc065c405fbb1f58a5c393a4438f8a74534ccf6184f50b37207e7521ddb5e145570836d16f3ab27e318804d47bd4b33c140a3029516ce5162966723f903069446b8a8f544cb42d86528d2538d7eb32c435040337306919d7b9028e9d8de4d03a091bb7f915dedc0dc8ce8e6da8aeb0be210aeaae459b28d28f282f1a481b821f0d6a3fbd7f1c518b022b48992ac155aa4516021e942c8395241ab6719e64b7783ac2bb5e3e9d3eac0ef794281c42a64db73585e6dfe5902878232595b489f8d17c3dce3e26cd61288f003f110f9525dd6fc65a8c1bfdee3d7cfef891bd546e90e0c24698c50aafe8ede905257bc8b8f7cacffa90ee2b9b618afdae3de3bbd74a5c8a572df9c7ac8090a4efcf3d0a06b648669bc1d4bf17fdc7d1bf3425881c5059c87a30f5b79c92940f499005ef60d31f41143d919048fadbb7b7bda08d98031cd04fda6567cb8f671d76538d9da8345c04ba130652c4d6e9c95bb52e72d8059a7d99497f08c9fcaf03e7776523dd491bcfed0d6ff69d083e7f09d8469a4be78d8bc508dfc02f1e45f4e3ed9f5a25d41dd290c1c32a3a2847ebffa3ac300576aae59f24a954a6e57d3f4f84d8151b4076ac82665a0ea0c86a7f9115dc28a3ce34d6775b465611d07af445be5fa05a897850edef3bbc81cef43ac80df37c378aab2f8e28d8120694ca66289c50d963106beb146e95490734d749bbb2c49525945efbf670aba9ff7487ffe7972d5c422738ffd0c22aa722dcfa728a5866b30c368420e7a01ad326c7119d2fbbfa77dd80adca8f2360b387c386faa62f12524f322d5ee15cbf1d9ae1238eec586b28293d353c35bf0a914b19b22fd600837945b46ef80f20b04de7716e5d62cb85e48cc33c6396951bc7149a35d5e040982ea2675273cdbacf1822d6f01a8462a4b3f1a1cb44a7059d49fb732e9593b872563d9deefefb327a748d8098c3d82e2fe4ac46f213919d3dc2ad12ec87164c2eb1b78f133bba3e513d8f911181621a7cfd138423b17556d9263f625b618c74ee90afe891b73098460fb427683c9172d137caa977ad6ebab93f14b28613f60be6871b9bab80fe12e8a75b231b68bb37d925b942f3551a4f308cf5c8008c72e9ea3f3e21e187da1ad73cbd7a14c538c46b5621add6246f1d7980c9ff363da112d39469ab8bf67ecc087ab650d9be309aadf139584ba5f0ce082cae5bf51c77c21eaf8973c3218878f9c134a9910ce2dedfc65b833f587d03c065c024942f5e2b8f48ae80b6c11638ee45d25c91099d07121126000759ab5c4cfb72eb4b8decab6abbec1f4fa5ac32300cb3f6c64c82c9b037c4f188bf9da701fe84c1ab53092eced7c9aee69ca82caa6247a4e43c3c6542f20eb77568f8055b196850aac10eb7553c75e340675957a36ce9088c7791973ad33edb88dec96f8acbdeb949eddace60acadd9d3e3c1e65b65d42e22d0ca4cecac1ef63604ffe7a6bda658ad6baf8d09321ea117560a836fd44370793653fa0a8e6d084b33c1e01d4b9bf96c6e28d841f48c8d9590d8a99d06af7639a86c3609cc35b32e9e98454dc73ad034690214f75da4d63aa47e5c3168fa9e73e4d3d474efeabb5675b77a194a076becd0c5795776839697562f7fa54977075cf0764377eecda40f4c7f0c82124ac479244264418c11792d33294cb4fffdf9dd25a5b101a7e67eef825ff80754d1419df5df648222f8de777ccc37e835435fe0c378f8bd5e34c2e76977f60ed17ff7497803850d469d59469dca2253366a28c60c769ee5e07e5e450696577305859cb65edcf9cb69c949ae49e41e8ac16adc95080e97582a09a963d6b2749b0b41737f041cf529187aaeceea4e566add29d1c4a6a771c7254c7934abade89317a1b32aaa628356c72f643fc5379cf1eedbd0060309e65d8f30b1305d7cfb1bae60ea264260c48f3fd14e595b504ab4454e63462bb3430b2b6fe751ced4646570ef0c0dc8dcc6077b2ebf738e96cee8fe194455939c8802698dea9e983bc251eb5015dfe1cc802a2e525f0d990185b4c64954a94f0d6a4fe2abeecee27c4eba28a63be77e83a217b89883f4e5cab1cf4b04a5c07857fceb6276a3b32bff1f4f2850caea84f468ccd1b13946c011ebefb88d17a70d16591d7d990973475f322ffe86c70cdb66082a8f8d91e21dcd126c1dde4ccacc0a9e25e7cd7350d0823668c646f56029eec5a64cc66591b4494ad631201c64dd1cdb32d9ee74c4cb1a6ef5a13074203c4341a5d3107a29752eb3ce772a3c995938362f224264786189796e43a08d4f19ee309114392ab5deb6bb2cd0b28540d06c4e31ad73867e804484f7ed3538f0d5017206b0bd78755edf80f3421c74ff08564d39c702a6ae3671706cef5359580002ccb9ad48bf5ce5a07f44315b88a002420e084709b89ca25bc6f71b61f445f52de0503678e06f60e82d7896b8aa9131151df5d81c56572c10fd3d19cf16a319205a9014058a006ff6f64593f40e71b3d08f076845b98404128286b3731882fb1ff36ed24424b4cc18766986e8fd411bb389e9af81b49177d96a9b613f579da5a2e42d30ea0239b405e58d0deaf7634171d0499f4bf8aabb42c50a089b7484c4adfd3eb036c816b9c876601241f910c841d17b29d6f28862e155a0052f9c3640f3e85bd383ef54d997fd7c067126f40188a9c453a17dc2d35050738788c014bf9aeb45bdb0fc040a3dae9087843b7a7d61f736710c7246843faf1b159429555db921d3b6afbab29b487f99e22ad23a223ed953ef0558d3eaf690c2feeb587b53e85cd4f7460cc94dceef788abef63fc43585fae5c1ba451989b98b955b923ef28772d5de73791519800929ae90c966d2108f77be48d537f7f976bf526d422a3825f79099425dbdcc692bac4312a1816c573e6585d1c7848983d0f778a4cef8fa42351eb600d2abcfabbcf4fe884c524182755343a65ed4649e016fe55b38c5c4ad656a0fef36c5ff6d7cd2364a866a15f87e6d8efa4ee4ae17704f22280e3dd7021c13b0790cd53175a165355fc7fc818fc8fb947d281a81dfa6950a5e0946e667ff1c8408fc9b145900d8e71a91f9da8d2621627bc39e0cce4a714ed35affa7b0d602ff5f74b2e4aa4c165e1179b0413493bba42354bb21f021237f4fa51086f6f1a4b8926c68f2686efde9f3189a6eb7b0628ee7136c45bfe19113c5ecf8793b2baf64073cc4001c04ed6224adcd6dbe6739f80ad25150602f845d82fddb2b4a70477eaf63681b656fd07a86ce20c1d5077d3702ac7d8db563bee75d5b1b4fc18445232d29f4c477b0aaa668d8f36699b31331e8d7c485b8d6f2cc753d24cda807660b9305def828e7f88d8052c16d69b1a183e5592d7233224cabe76f357177124550ccdd8caad9e3a494a6db74f6ffa6acefbd37e8faafdd31d69716b3ee5922fd82a20343c8fd8f52cc1a0a7bbaf68f160bf007298c0a6724271cab4d800a7d9d074b12260a7bcd7fe613308b2559ec10def2753129826c019ad891456a599f97dd0a8bc629410912ca781ed51c5e74de646f73e6feca16dc5c1dbf20834edd2bc2f50c19d613a8cb4c6406781f4e533b0aff13084f8df3555d0834cb3e24db0ff2f41d1d3f21e7bc81202f56ef7e6607d169c39c6df1d9538745e9fff829e09a0f910e9a5d315501efa46c12d4af8587fe660c95154cf1c23b56635217d77577c7f9be1ff52c514df03229ceede0233f5048e82025f8a63bc3fe857dd01ba2c5844137b3a410257f2f318fa766a3b8c03c1186b927b724fdee1150e662a832ca1d91fd44de3c5da86e0172b6eccbffa626e487033d445b1d301432ebe23b03d832312482878f6706a73ab41b1c0c0607c78d44ab949292fc5be0ff9594dada1fe7340a78502bf712290a24c4d39abe18e57f72d6f268823e8917c07462602b43a0b31c34f0fe7a3182465b849b07b8379d2b8c8cd5c2cff07f283e4502f8b3f75329e7a8748ff0560c28a3defd9e19d7d75b309343e1b34a0363b783064e1297c0f341bf588a9753df9d7d664b8cea83cf99cd1f7d157801188b792f96d480152ffda80398b36c1891f77dfbb39455e323846e4bc043785d86ba579b028858e153a808a8423dae771712cbddeec0e1a37a0c11bfe5f9d60028c0d54eaac1491ee9eb6adf9483b8386cdc02c9b3d92e4c5d87bc5ce1c8c88182077139432fc35f8bf5c382b7d33d833c50209cd004c49be28680932e6b79c745ad6d5247fd84e03fb78a6a2f8952c3d350b565a0edf93889065ca671984aeb44323dc9dc4ee64902bb1e00e12157c4db2f6cab8ce09acb961afa48a58446a678b19f6d9edd8e6f3880cd713dec1c5003fece8c9214518e2afb7fb2b59529c71c5a50c99352bff9432ef3a34da9d4cbc13105c45c100538fcf17a891668c889b91200e0934d5b7eb2f8c6fd60712742953c36ea6b1a4fc7e1403f71077c8cb0a58fd7fc94c9eb7b26ee44b4d123918e03e064263ee7651bca931f447eccd4d8ace1662ad79bdd80f25446c2a8f3e19b3fdf94620952f79511b0eaf5d3872f4b7e5038e0628ddb50440c12e5e4eb6d57c37ce56cfab5eafa6e7c65053783b618962d07d549146e595ae4761a3912d9d7cc97f76bacf0ace92aadeee7664d50c63241dd99d8ce02cfc7aacfdca5441671be9f28a8aa7c34bde965f7878db559201c6d78e9d0f11aeff961fc4f6cbf89124e0e792e8cc7af62b130b8aa6b28ef1b7242dc651413d8b622cce56bf39c5b483074add091d6a45bd8a63576e065d8a01b9762344f1dae45dac3bfbb0ecb39ce206e75151d819dbbfb7bd95dfa8e81e2d1c0959abfb74e59683a9739ee78f2332085f52b342e1c2649db0202b9a721d52dc0ce3bfc6028e78de5182b60f5cc9a80ee7f01076f4816c3d5ffeb1874d58136d07b260f069c5e0b064df19884e50f9d55f5af31b65d57d26ae78d816408c51ad4c5cd16a83cd333594f3955799bb2e9ae6fe1faa1c927a9a7d68c544d285d177aecd253c67290b5b5c1858af9c9305b21fc1ce5d8b49b61f0bc22f746cd6a537a39970dce09c2ffaed8ce20d4b8105fd1c3bec1746e26057aec542b6e0f9aec5511fec1331aac9af4e9a70940b36963103e2e68bbf8bab41cf93434600c2b4749904c6109217e9167df1225c9e153e15e1b3f8a03b4c07b29b4e856c3258d73cd9978bef0a2fc48dc8c621ae6eca8ae14a42df29bd5b9f8b3aecf907bf2dd119f24b52a69486ea4a78286c219fa8706c488a3be95fc01fca255f76f266871f1c59d05290ccd6df0c72cce285549573cfaf0e94e58aef790c22f7d45ba34e570cf3177c396b190a9b3471b0acad51f7e9c97e6b51f44cb936b5121bce8d2689ab7a15aa1b7d06e22038f27963deaf110c31b5fb2bffdbd0f4d17441142862412cc09344142a8c5a04ec6c14edc9b22db758d23187d18518edd0a131bcb7c8f9008728912dc31ca149b2a01363dc9d9b9d842e8afc8158dff47a6f0be510bc6e84391de527e514a847aed0f6e96dabb954074a7693039c1bff2284d427538315c2df1397a69cb119463e9f1635a7c83599226e0527f20dcfadb087cfdb8da5d0f1d9114cd7d834ad5d210324ff6776dafe44853a9745436a24d2914a8b5afc9291aeebfa0ff7b918f71c2cbe58e1b4e14474bf21c2fc1439cc6bab3f95eafe7ef0b5872478ba1e7e59ccc4b13577844d288043c2914dbb368c8d9eb6c0583995736c7620fe39d65d72432578a8bab90839206a1ce2565d23e67c352527476f0f619fecb253c663bc273948c262b74b628855090a58c78f41d5452c49a57e133b8f87f3b04e1f4b0544efaf2a215b7fbb44e0bdc7bcfceff343c9ea2dcccbcf92708fb3a633d20e55c57b8fb2c58d63810d7fb3c148b4b79ba6e7cd167465e1dbd6473337cd890c01cb4d9f5d66ee7c99d38183f6df06fa0b6d0f8a413ffe189d06af350192e30fc8aa211641f0e0f9d2a76aec9906a19af17f27071194c75100e0f5edce561bafc3a55bcbb3452ad0b0c862d8e62c984879ce026817673d1dbc08bd82df6a691cc2cfb09f3c8ab8111322cbc366db71c3189ec557b4a978e1776442d10ed8433aa3e748858cc43901904f0f51a70d960b9a570406070df94a97b79721b9517f97ac09d9c5c57e27445e8fad05e96504d2695604955f8c65bc8fa8408cdb3e1014da7928cc9ba01649668c47f7c9b8889ba1402d384c659eea3e146f8c05c0887682a55b64ca3022c9cbeb208b4428578c84e181cb502650e5676f08b3d7f40704825c22c83cc4ecf660d437db95b2b6d9841cf5e182c0b5373aeaa47870379b2c1176e45710c4c074b7116d0ff12922fe2001", + 1 + ] + ], + "callback_url": "http://127.0.0.1:8080" +} diff --git a/crates/support/scripts/build.sh b/crates/support/scripts/build.sh index 6a6f9751f8..cfa349100d 100755 --- a/crates/support/scripts/build.sh +++ b/crates/support/scripts/build.sh @@ -1,10 +1,24 @@ #!/usr/bin/env bash PKG=ghcr.io/gnosisguild/e3-support GIT_SHA=$(git rev-parse --short HEAD) -docker build -t $PKG:$GIT_SHA -t $PKG:next . -if [ "$1" = "--push" ]; then + +# Separate --push from other arguments +PUSH=false +BUILD_ARGS=() + +for arg in "$@"; do + if [ "$arg" = "--push" ]; then + PUSH=true + else + BUILD_ARGS+=("$arg") + fi +done + +# Build with any additional arguments +docker build -t $PKG:$GIT_SHA "${BUILD_ARGS[@]}" . + +# Push if --push was specified +if [ "$PUSH" = true ]; then docker push $PKG:$GIT_SHA - docker push $PKG:next echo "Image pushed to: $PKG:$GIT_SHA" - echo "Image pushed to: $PKG:next" fi diff --git a/examples/CRISP/lib/risc0-ethereum b/examples/CRISP/lib/risc0-ethereum index 382d76a804..c09ee29b38 160000 --- a/examples/CRISP/lib/risc0-ethereum +++ b/examples/CRISP/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit 382d76a8040068243a5d13e3de50fcca4224b0d6 +Subproject commit c09ee29b386d2b1486724509868d1115db36929f diff --git a/package.json b/package.json index 464b53a309..a88520d9d2 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "scripts": { "clean": "cd packages/evm && pnpm clean", - "compile": "pnpm evm:compile && pnpm ciphernode:build", + "compile": "pnpm evm:build && pnpm react:build && pnpm ciphernode:build", "lint": "pnpm evm:lint && pnpm ciphernode:lint", "typechain": "pnpm evm:typechain", "test": "pnpm evm:test && pnpm ciphernode:test", @@ -23,7 +23,7 @@ "ciphernode:remove": "cd packages/evm && pnpm ciphernode:remove", "ciphernode:test": "cd crates && ./scripts/test.sh", "ciphernode:build": "cargo build --release", - "preciphernode:build": "pnpm evm:compile", + "preciphernode:build": "pnpm evm:build", "committee:new": "cd packages/evm && pnpm committee:new", "committee:publish": "cd packages/evm && pnpm hardhat committee:publish", "e3:activate": "cd packages/evm && pnpm -s hardhat e3:activate", @@ -31,14 +31,16 @@ "e3:publishCiphertext": "cd packages/evm && pnpm hardhat e3:publishCiphertext", "evm:install": "cd packages/evm && pnpm install", "evm:node": "cd packages/evm && pnpm hardhat node", - "evm:compile": "cd packages/evm && pnpm compile", + "evm:build": "cd packages/evm && pnpm compile", "evm:lint": "cd packages/evm && pnpm lint", "evm:typechain": "cd packages/evm && pnpm typechain", "evm:test": "cd packages/evm && pnpm test", "evm:coverage": "cd packages/evm && pnpm coverage", "evm:release": "cd packages/evm && pnpm release", + "react:build": "cd packages/enclave-react && pnpm build", "react:release": "cd packages/enclave-react && pnpm release", "npm:release": "pnpm build && pnpm evm:release && pnpm react:release", + "support:build": "cd crates/support && ./scripts/build.sh", "build": "pnpm -r build", "changeset": "changeset", "version": "changeset version", @@ -55,4 +57,4 @@ "husky": "^9.1.7", "@changesets/cli": "^2.27.1" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b05add2bad..5e05286ddb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,7 +183,7 @@ importers: version: 1.9.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) ethers: specifier: ^6.12.0 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -216,7 +216,7 @@ importers: version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -289,7 +289,7 @@ importers: version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) devDependencies: '@types/react': specifier: ^18.2.0 @@ -540,6 +540,97 @@ importers: specifier: ^8.0.3 version: 8.0.3 + templates/default/client: + dependencies: + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../../../packages/evm + '@gnosis-guild/enclave-react': + specifier: workspace:* + version: link:../../../packages/enclave-react + '@phosphor-icons/react': + specifier: ^2.1.4 + version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.74.3 + version: 5.80.5(react@18.3.1) + '@wagmi/core': + specifier: ^2.14.16 + version: 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + connectkit: + specifier: ^1.9.0 + version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + viem: + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: + specifier: ^2.14.16 + version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + devDependencies: + '@tailwindcss/typography': + specifier: ^0.5.12 + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) + '@types/react': + specifier: ^18.2.66 + version: 18.3.23 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.3.7(@types/react@18.3.23) + '@typescript-eslint/eslint-plugin': + specifier: ^7.2.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': + specifier: ^7.2.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.21(postcss@8.5.4) + eslint: + specifier: ^8.57.0 + version: 8.57.1 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.4.6 + version: 0.4.20(eslint@8.57.1) + prettier: + specifier: ^3.2.5 + version: 3.5.3 + prettier-plugin-tailwindcss: + specifier: ^0.5.13 + version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) + tailwindcss: + specifier: ^3.4.2 + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) + typescript: + specifier: ^5.2.2 + version: 5.8.3 + vite: + specifier: ^5.2.0 + version: 5.4.19(@types/node@22.7.5) + vite-plugin-top-level-await: + specifier: ^1.4.1 + version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + vite-plugin-wasm: + specifier: ^3.3.0 + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) + wasm-pack: + specifier: ^0.13.1 + version: 0.13.1 + packages: '@adraffy/ens-normalize@1.10.0': @@ -3733,6 +3824,9 @@ packages: axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + axios@1.6.6: resolution: {integrity: sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==} @@ -3809,6 +3903,10 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + binary-install@1.1.0: + resolution: {integrity: sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==} + engines: {node: '>=10'} + binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} @@ -4076,6 +4174,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -5271,6 +5373,10 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} @@ -6541,10 +6647,22 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + mipd@0.0.7: resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: @@ -8059,6 +8177,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -8677,6 +8799,10 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + wasm-pack@0.13.1: + resolution: {integrity: sha512-P9exD4YkjpDbw68xUhF3MDm/CC/3eTmmthyG5bHJ56kalxOTewOunxTke4SyF8MTXV6jUtNjXggPgrGmMtczGg==} + hasBin: true + wasmbuilder@0.0.16: resolution: {integrity: sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==} @@ -8848,6 +8974,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -12614,6 +12743,45 @@ snapshots: - utf-8-validate - zod + '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': + dependencies: + '@coinbase/wallet-sdk': 4.3.0 + '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - supports-color + - uploadthing + - utf-8-validate + - zod + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': dependencies: eventemitter3: 5.0.1 @@ -12629,6 +12797,21 @@ snapshots: - react - use-sync-external-store + '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.80.5 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -13374,6 +13557,12 @@ snapshots: transitivePeerDependencies: - debug + axios@0.26.1: + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + transitivePeerDependencies: + - debug + axios@1.6.6: dependencies: follow-redirects: 1.15.9(debug@4.4.1) @@ -13476,6 +13665,14 @@ snapshots: binary-extensions@2.3.0: {} + binary-install@1.1.0: + dependencies: + axios: 0.26.1 + rimraf: 3.0.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + binary@0.3.0: dependencies: buffers: 0.1.1 @@ -13788,6 +13985,8 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@2.0.0: {} + ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -13965,6 +14164,26 @@ snapshots: - '@babel/core' - react-is + connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + dependencies: + '@tanstack/react-query': 5.80.5(react@18.3.1) + buffer: 6.0.3 + detect-browser: 5.3.0 + family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + qrcode: 1.5.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + transitivePeerDependencies: + - '@babel/core' + - react-is + console-browserify@1.2.0: {} constants-browserify@1.0.0: {} @@ -15060,6 +15279,13 @@ snapshots: viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -15271,6 +15497,10 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs-readdir-recursive@1.1.0: {} fs.realpath@1.0.0: {} @@ -17168,8 +17398,19 @@ snapshots: minimist@1.2.8: {} + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + mipd@0.0.7(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 @@ -18982,6 +19223,15 @@ snapshots: transitivePeerDependencies: - ts-node + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + term-size@2.2.1: {} text-table@0.2.0: {} @@ -19679,6 +19929,44 @@ snapshots: - utf-8-validate - zod + wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): + dependencies: + '@tanstack/react-query': 5.80.5(react@18.3.1) + '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - supports-color + - uploadthing + - utf-8-validate + - zod + wait-on@8.0.3: dependencies: axios: 1.9.0 @@ -19689,6 +19977,12 @@ snapshots: transitivePeerDependencies: - debug + wasm-pack@0.13.1: + dependencies: + binary-install: 1.1.0 + transitivePeerDependencies: + - debug + wasmbuilder@0.0.16: {} wasmcurves@0.2.2: @@ -19829,6 +20123,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@1.10.2: {} yaml@2.8.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1610d390cc..c791c3207b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,3 +5,4 @@ packages: - packages/enclave-react - packages/evm - templates/default + - templates/default/client diff --git a/templates/default/.gitignore b/templates/default/.gitignore index 313921fcd5..8347b0a1f3 100644 --- a/templates/default/.gitignore +++ b/templates/default/.gitignore @@ -14,6 +14,10 @@ node_modules /coverage /coverage.json +.enclave/data/ +.enclave/config/ +.enclave/caches/ + /target # Ignore risc0 files diff --git a/templates/default/contracts/ImageID.sol b/templates/default/contracts/ImageID.sol index 367814795a..0f622886a7 100644 --- a/templates/default/contracts/ImageID.sol +++ b/templates/default/contracts/ImageID.sol @@ -19,5 +19,5 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = bytes32(0xa56efeb96ad1ed58ab6606e39504329affb555f71046de19ccbfbe7d09c967af); + bytes32 public constant PROGRAM_ID = bytes32(0xaf928ebf39fec4696c3f41f473a1a9473b67d723c6373149c6ab99ba4c1a76ef); } diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml index 5d0c4139f9..5b8f1cb609 100644 --- a/templates/default/enclave.config.yaml +++ b/templates/default/enclave.config.yaml @@ -7,6 +7,12 @@ chains: ciphernode_registry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +program: + risc0: + risc0_dev_mode: 1 + # bonsai_api_key: xxxxxxxxxxxxxxxx + # bonsai_api_url: xxxxxxxxxxxxxxxx + nodes: cn1: address: "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" diff --git a/templates/default/foo b/templates/default/foo new file mode 100644 index 0000000000..e69de29bb2 diff --git a/templates/default/lib/risc0-ethereum b/templates/default/lib/risc0-ethereum index 382d76a804..ef94105fbf 160000 --- a/templates/default/lib/risc0-ethereum +++ b/templates/default/lib/risc0-ethereum @@ -1 +1 @@ -Subproject commit 382d76a8040068243a5d13e3de50fcca4224b0d6 +Subproject commit ef94105fbfbc2775d7a7f0c4773190e04cb67a04 diff --git a/templates/default/scripts/dev_all.sh b/templates/default/scripts/dev_all.sh index 88bac2424a..fdf868e014 100755 --- a/templates/default/scripts/dev_all.sh +++ b/templates/default/scripts/dev_all.sh @@ -1,70 +1,12 @@ #!/usr/bin/env bash -SESSION_NAME="enclave-splits" +set -e -# Check if tmux is available -if command -v tmux &> /dev/null; then - echo "tmux found - using tmux session..." - - # Kill existing session if it exists - if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then - echo "Killing existing session '$SESSION_NAME'..." - tmux kill-session -t "$SESSION_NAME" +for arg in "$@"; do + if [[ "$arg" == "--tmux" ]]; then + ./scripts/dev_all_tmux.sh + exit 0 fi - - echo "Creating new session '$SESSION_NAME'..." - # Create new session - tmux new-session -d -s "$SESSION_NAME" - - # Split into 3 vertical panes (top row) - tmux split-window -h - tmux split-window -h - - # Select the first pane and create bottom row - tmux select-pane -t 1 - tmux split-window -v - - # Select the second pane and create its bottom counterpart - tmux select-pane -t 3 - tmux split-window -v - - # Reorganize layout to make it more even - tmux select-layout tiled - - tmux send-keys -t 0 'pnpm dev:frontend' C-m - sleep 1 - tmux send-keys -t 1 'pnpm dev:evm' C-m - sleep 1 - tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m - sleep 1 - tmux send-keys -t 3 'TEST_MODE=1 pnpm dev:server' C-m - sleep 1 - tmux send-keys -t 4 'enclave program start' C-m - - # Select the first pane to start (frontend will be focused) - tmux select-pane -t 0 - - # Attach to the session - tmux attach-session -t "$SESSION_NAME" - -else - echo "tmux not found - using pnpm concurrently..." - - # Check if pnpm is available - if ! command -v pnpm &> /dev/null; then - echo "ERROR: pnpm is not installed or not in PATH" - echo "Please install pnpm or tmux to run this script" - exit 1 - fi - - # Run all processes concurrently using pnpm - pnpm concurrently \ - --names "FRONTEND,EVM,CIPHER,SERVER,ENCLAVE" \ - --prefix-colors "blue,cyan,magenta,yellow,green" \ - --kill-others-on-fail \ - "pnpm dev:frontend" \ - "pnpm dev:evm" \ - "pnpm dev:ciphernodes" \ - "TEST_MODE=1 pnpm dev:server" \ - "enclave program start" -fi \ No newline at end of file +done + +./scripts/dev_all_concurrently.sh diff --git a/templates/default/scripts/dev_all_concurrently.sh b/templates/default/scripts/dev_all_concurrently.sh new file mode 100755 index 0000000000..ea12f4de39 --- /dev/null +++ b/templates/default/scripts/dev_all_concurrently.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -e + +# Check if pnpm is available +if ! command -v pnpm &> /dev/null; then + echo "ERROR: pnpm is not installed or not in PATH" + echo "Please install pnpm or tmux to run this script" + exit 1 +fi + +# Run all processes concurrently using pnpm +pnpm concurrently \ + --names "FRONTEND,EVM,CIPHER,SERVER,ENCLAVE" \ + --prefix-colors "blue,cyan,magenta,yellow,green" \ + --kill-others-on-fail \ + "pnpm dev:frontend" \ + "pnpm dev:evm" \ + "pnpm dev:ciphernodes" \ + "TEST_MODE=1 pnpm dev:server" \ + "enclave program start" + diff --git a/templates/default/scripts/dev_all_tmux.sh b/templates/default/scripts/dev_all_tmux.sh new file mode 100755 index 0000000000..89d906bba0 --- /dev/null +++ b/templates/default/scripts/dev_all_tmux.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -e + +SESSION_NAME="enclave-splits" + +# Check if tmux is available +if command -v tmux &> /dev/null; then + echo "tmux found - using tmux session..." + # Kill existing session if it exists + tmux kill-session -t "$SESSION_NAME" &> /dev/null || true + + echo "Creating new session '$SESSION_NAME'..." + # Create new session + tmux new-session -d -s "$SESSION_NAME" + tmux select-pane -t 1 + tmux split-window -h + tmux split-window -h + tmux select-layout even-horizontal + tmux select-pane -t 1 + tmux split-window -v + tmux select-pane -t 3 + tmux split-window -v + tmux send-keys -t 1 'clear' C-m + tmux send-keys -t 2 'clear' C-m + tmux send-keys -t 3 'clear' C-m + tmux send-keys -t 4 'clear' C-m + tmux send-keys -t 5 'clear' C-m + tmux send-keys -t 1 'pnpm dev:evm' C-m + sleep 1 + tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m + sleep 1 + tmux send-keys -t 3 'TEST_MODE=1 pnpm dev:server' C-m + sleep 1 + tmux send-keys -t 4 'enclave program start' C-m + sleep 1 + tmux send-keys -t 5 'pnpm dev:frontend' C-m + + tmux attach-session -t "$SESSION_NAME" +else + echo "This script requires tmux to be installed.\n\n https://github.com/tmux/tmux/wiki/Installing" +fi diff --git a/templates/default/scripts/dev_frontend.sh b/templates/default/scripts/dev_frontend.sh index 6166a99f99..c99770ee22 100755 --- a/templates/default/scripts/dev_frontend.sh +++ b/templates/default/scripts/dev_frontend.sh @@ -2,4 +2,10 @@ set -euo pipefail +echo "Waiting for local evm node..." +pnpm wait-on http://localhost:8545 + +echo "Waiting for program runner..." +pnpm wait-on http://localhost:13151/health + cd client && (export $(enclave print-env --vite --chain hardhat) && pnpm dev) From 3c80234566adafe45dbe00856d3e52add5ca0476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 19 Jun 2025 19:36:29 +0000 Subject: [PATCH 084/106] Update support-docker.yml (#530) Attempt to use the branch commit --- .github/workflows/support-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 79c51ce0d7..6077eb189e 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -24,7 +24,7 @@ jobs: - name: Generate version tag id: version run: | - echo "version=${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + echo "version=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT - name: Set up BuildKit uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry From b8cc26f9178a544656c1cd558b6473affac4ca1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 19 Jun 2025 19:42:23 +0000 Subject: [PATCH 085/106] Update support-docker.yml (#531) --- .github/workflows/support-docker.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 6077eb189e..2656b282ed 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -5,6 +5,10 @@ on: branches: - main - hacknet + push: + branches: + - main + - hacknet paths: - "crates/support/**" env: From aa933a5736ae0a76af2a23b65e6682b424916224 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Thu, 19 Jun 2025 22:23:55 +0200 Subject: [PATCH 086/106] attempts to fix docker support image tags (#532) --- .github/workflows/support-docker.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 2656b282ed..94ff12a86a 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -29,6 +29,17 @@ jobs: id: version run: | echo "version=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT + - name: Generate tags + id: tags + run: | + VERSION=$(git rev-parse --short=8 HEAD) + TAGS="${{ env.IMAGE_NAME }}:$VERSION" + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" + elif [ "${{ github.ref }}" = "refs/heads/hacknet" ]; then + TAGS="$TAGS,${{ env.IMAGE_NAME }}:hacknet" + fi + echo "tags=$TAGS" >> $GITHUB_OUTPUT - name: Set up BuildKit uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry @@ -43,10 +54,7 @@ jobs: context: ./crates/support file: ${{ env.DOCKERFILE_PATH }} push: true - tags: | - ${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} - ${{ github.ref == 'refs/heads/main' && format('{0}:latest', env.IMAGE_NAME) || '' }} - ${{ github.ref == 'refs/heads/hacknet' && format('{0}:hacknet', env.IMAGE_NAME) || '' }} + tags: ${{ steps.tags.outputs.tags }} cache-from: | type=gha,scope=cargo-registry type=gha,scope=cargo-git From 7309d38861ae08fc9768d91b0708bd5eb38248b9 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Thu, 19 Jun 2025 22:45:37 +0200 Subject: [PATCH 087/106] attempts to fix docker support image tags part 2 (#533) * attempts to fix docker support image tags * attempts to fix docker support image tags pt2 --- .github/workflows/support-docker.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 94ff12a86a..5c4a1d6695 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -9,8 +9,6 @@ on: branches: - main - hacknet - paths: - - "crates/support/**" env: DOCKERFILE_PATH: crates/support/Dockerfile IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/e3-support From 795c3075e45282d976310c536af47212825986d1 Mon Sep 17 00:00:00 2001 From: ryardley Date: Thu, 19 Jun 2025 22:42:55 +0100 Subject: [PATCH 088/106] Fallback to get correct git sha --- crates/cli/build.rs | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/crates/cli/build.rs b/crates/cli/build.rs index e4ed9c0dc6..16f27f64bc 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -1,7 +1,7 @@ use std::process::Command; fn main() { - // Get git SHA + // Try to get local git SHA first let output = Command::new("git") .args(&["rev-parse", "--short", "HEAD"]) .output(); @@ -11,12 +11,43 @@ fn main() { .unwrap_or_else(|_| "unknown".to_string()) .trim() .to_string(), - _ => "unknown".to_string(), + _ => { + // Fallback to remote commit hash + get_remote_commit_hash().unwrap_or_else(|| "unknown".to_string()) + } }; // Set environment variable for compilation println!("cargo:rustc-env=GIT_SHA={}", git_sha); - // Rebuild if git HEAD changes println!("cargo:rerun-if-changed=.git/HEAD"); } + +fn get_remote_commit_hash() -> Option { + let output = Command::new("git") + .args(&[ + "ls-remote", + "https://github.com/gnosisguild/enclave", + "refs/heads/hacknet", // change to main branch once committed + ]) + .output() + .ok()?; + + if !output.status.success() { + return None; + } + + let stdout = String::from_utf8(output.stdout).ok()?; + let commit_hash = stdout + .split_whitespace() + .next()? + .chars() + .take(8) + .collect::(); + + if commit_hash.is_empty() { + None + } else { + Some(commit_hash) + } +} From 32d0e06c167346952c1a044e60252b3313339d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 19 Jun 2025 22:10:02 +0000 Subject: [PATCH 089/106] Add missing char (#535) --- crates/cli/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/build.rs b/crates/cli/build.rs index 16f27f64bc..a9bac176ea 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -42,7 +42,7 @@ fn get_remote_commit_hash() -> Option { .split_whitespace() .next()? .chars() - .take(8) + .take(9) .collect::(); if commit_hash.is_empty() { From 7e557f43aa20e1b36f18d390b1da057cb5a88e9c Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:23:04 +0500 Subject: [PATCH 090/106] Change rev to 7 chars (#537) --- .github/workflows/support-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index 5c4a1d6695..a504e9f42b 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -30,7 +30,7 @@ jobs: - name: Generate tags id: tags run: | - VERSION=$(git rev-parse --short=8 HEAD) + VERSION=$(git rev-parse --short=7 HEAD) TAGS="${{ env.IMAGE_NAME }}:$VERSION" if [ "${{ github.ref }}" = "refs/heads/main" ]; then TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" From 83627ed3cfd175dd5ed883af6122e57aa3327253 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:45:09 +0500 Subject: [PATCH 091/106] Fallback rev to 7 chars (#538) --- crates/cli/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/build.rs b/crates/cli/build.rs index a9bac176ea..5df4faa153 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -42,7 +42,7 @@ fn get_remote_commit_hash() -> Option { .split_whitespace() .next()? .chars() - .take(9) + .take(7) .collect::(); if commit_hash.is_empty() { From ebea6a1f2f3b162a6d131a0c7eb8dfe236c0f9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 20 Jun 2025 17:17:16 +0000 Subject: [PATCH 092/106] Fix macos issue and cleanup after fail (#540) * Clean up when things go wrong * Update deps * Accommodate macOs * Remove bail * Detect bsd sed * Add comments * Add logging --- crates/init/src/copy.rs | 33 +++++++++++++++++++-- crates/init/src/file_utils.rs | 15 ++++++++++ crates/init/src/lib.rs | 55 +++++++++++++++++++++++++---------- 3 files changed, 85 insertions(+), 18 deletions(-) diff --git a/crates/init/src/copy.rs b/crates/init/src/copy.rs index 3c885c4b08..5cd79f47e2 100644 --- a/crates/init/src/copy.rs +++ b/crates/init/src/copy.rs @@ -58,7 +58,21 @@ where Ok(()) } +// Async function to detect if we're using BSD sed +// You can test for BSD sed by checking if the --version flag is supported. +// GNU sed supports --version while BSD sed doesn't and will exit with an error. +async fn is_bsd_sed() -> bool { + Command::new("sed") + .arg("--version") + .output() + .await + .map(|output| !output.status.success()) + .unwrap_or(false) +} + async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> Result<()> { + let is_bsd = is_bsd_sed().await; + // Find files matching the glob pattern let find_output = Command::new("find") .arg(base_path) @@ -87,14 +101,29 @@ async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> println!("Running sed..."); println!("> {}", sed_cmd); - let sed_output = Command::new("sed") - .arg("-i") + + let mut cmd = Command::new("sed"); + + // Check if we're on macOS (BSD sed) and add empty backup extension + if is_bsd { + // This is a quirk of BSD sed - we need to do the equivalent of: + // sed -i '' pattern filename + cmd.arg("-i").arg(""); + } else { + // Normal sed is: + // sed -i pattern filename + cmd.arg("-i"); + } + + let sed_output = cmd .arg(sed_cmd) .arg(file_path) .output() .await .context("Failed to execute sed command")?; + println!("{:?}", sed_output); + if !sed_output.status.success() { let stderr = String::from_utf8_lossy(&sed_output.stderr); bail!("sed command failed on {}: {}", file_path, stderr); diff --git a/crates/init/src/file_utils.rs b/crates/init/src/file_utils.rs index cf2ad3fa42..5c89545282 100644 --- a/crates/init/src/file_utils.rs +++ b/crates/init/src/file_utils.rs @@ -1,6 +1,7 @@ use std::path::Path; use anyhow::{bail, Result}; +use async_recursion::async_recursion; use tokio::{fs, process::Command}; pub async fn ensure_empty_folder>(path: P) -> Result<()> { @@ -55,3 +56,17 @@ pub async fn move_file, Q: AsRef>(src: P, dst: Q) -> Result .await?; Ok(()) } + +#[async_recursion] +pub async fn remove_all_files_in_dir + Send>(dir_path: P) -> Result<()> { + let mut entries = fs::read_dir(dir_path).await?; + while let Some(entry) = entries.next_entry().await? { + let path = entry.path(); + if path.is_file() { + fs::remove_file(path).await?; + } else if path.is_dir() { + fs::remove_dir_all(path).await?; + } + } + Ok(()) +} diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 5d5db02c2c..a964641494 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -4,9 +4,9 @@ mod git; mod package_json; mod pkgman; -use anyhow::Result; +use anyhow::{bail, Result}; use copy::Filter; -use file_utils::{chmod_recursive, delete_path, move_file}; +use file_utils::{chmod_recursive, delete_path, move_file, remove_all_files_in_dir}; use git::parse_git_url; use package_json::DependencyType; use pkgman::PkgMan; @@ -21,25 +21,12 @@ const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; const DEFAULT_TEMPLATE_PATH: &str = "."; const DEFAULT_BRANCH: &str = "main"; -// Updated execute function to include workspace dependency substitution -pub async fn execute(location: Option, template: Option) -> Result<()> { +async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> { let repo = parse_git_url(template.unwrap_or(DEFAULT_TEMPLATE_URL.to_string()))?; let base_url = repo.base_url; let branch = repo.branch.unwrap_or(DEFAULT_BRANCH.to_string()); let template_path = repo.path.unwrap_or(DEFAULT_TEMPLATE_PATH.to_string()); - let cwd = match location { - Some(loc) => loc, - None => env::current_dir()?, - }; - - println!("Ensuring tmp folder does not exist..."); - if fs::try_exists(TEMP_DIR).await? { - fs::remove_dir_all(TEMP_DIR).await?; - } - println!("Ensuring cwd is empty..."); - file_utils::ensure_empty_folder(&cwd).await?; - println!("Start git clone..."); git::shallow_clone(&base_url, &branch, TEMP_DIR).await?; @@ -141,3 +128,39 @@ pub async fn execute(location: Option, template: Option) -> Res Ok(()) } + +// Updated execute function to include workspace dependency substitution +pub async fn execute(location: Option, template: Option) -> Result<()> { + let mut install_in_current_dir = false; + let cwd = match location { + Some(loc) => loc, + None => { + install_in_current_dir = true; + env::current_dir()? + } + }; + + println!("Ensuring tmp folder does not exist..."); + if fs::try_exists(TEMP_DIR).await? { + fs::remove_dir_all(TEMP_DIR).await?; + } + + println!("Ensuring cwd is empty..."); + file_utils::ensure_empty_folder(&cwd).await?; + + match install_enclave(&cwd, template).await { + Ok(_) => Ok(()), + Err(e) => { + println!("Cleaning up due to error..."); + if install_in_current_dir { + remove_all_files_in_dir(&cwd).await?; + } else { + fs::remove_dir_all(&cwd).await?; + } + eprintln!("\nSorry about this but there was an error running the installer. "); + eprintln!("\n Error: {}\n", e); + eprintln!("Enclave is currently under active development please share this with our team:\n\n https://github.com/gnosisguild/enclave/issues/new\n"); + Ok(()) + } + } +} From 4c5b2666e0364dd70ed08a152c9a9c37895d547a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 22 Jun 2025 23:25:33 +0000 Subject: [PATCH 093/106] Use FS utils to avoid using external tools like sed, cp etc (#541) * Copy and mkdirp passes * File filtering works * Incorporate fs copy * Fix sed issue * Update Dockerfiles * Unnecessary clone --- Cargo.lock | 29 +++ Cargo.toml | 7 +- crates/Dockerfile | 1 + crates/cli/src/cli.rs | 15 +- crates/cli/src/helpers/telemetry.rs | 9 + crates/cli/src/init.rs | 8 +- crates/fs/Cargo.toml | 16 ++ crates/fs/src/fs.rs | 332 ++++++++++++++++++++++++++ crates/fs/src/lib.rs | 5 + crates/fs/src/prelude.rs | 3 + crates/fs/src/traits.rs | 46 ++++ crates/init/Cargo.toml | 3 + crates/init/src/copy.rs | 311 +++++++++++++++--------- crates/init/src/git.rs | 11 +- crates/init/src/lib.rs | 45 ++-- examples/CRISP/apps/server/Dockerfile | 1 + 16 files changed, 703 insertions(+), 139 deletions(-) create mode 100644 crates/fs/Cargo.toml create mode 100644 crates/fs/src/fs.rs create mode 100644 crates/fs/src/lib.rs create mode 100644 crates/fs/src/prelude.rs create mode 100644 crates/fs/src/traits.rs diff --git a/Cargo.lock b/Cargo.lock index cadc1cc6df..4481c3f791 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2748,6 +2748,19 @@ dependencies = [ "serde", ] +[[package]] +name = "e3-fs" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "glob", + "regex", + "tokio", + "vfs", +] + [[package]] name = "e3-indexer" version = "0.1.0" @@ -2769,10 +2782,13 @@ dependencies = [ "anyhow", "async-recursion", "async-trait", + "e3-fs", "git2", + "regex", "serde", "serde_json", "tokio", + "tracing", "url", ] @@ -7772,6 +7788,19 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vfs" +version = "0.12.1" +source = "git+https://github.com/ryardley/rust-vfs.git#c9a3cccc7e7f75ed598cfe2201e27ae5e2693e74" +dependencies = [ + "async-recursion", + "async-std", + "async-trait", + "filetime", + "futures", + "tokio", +] + [[package]] name = "void" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index 39bc42475f..a2421ad8f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,8 @@ members = [ "crates/events", "crates/evm", "crates/evm-helpers", - "crates/fhe", + "crates/fhe", + "crates/fs", "crates/indexer", "crates/init", "crates/keyshare", @@ -67,6 +68,7 @@ e3-events = { version = "0.1.0", path = "./crates/events" } e3-evm = { version = "0.1.0", path = "./crates/evm" } e3-evm-helpers = { version = "0.1.0", path = "./crates/evm-helpers" } e3-fhe = { version = "0.1.0", path = "./crates/fhe" } +e3-fs = { version = "0.1.0", path = "./crates/fs" } e3-indexer = { version = "0.1.0", path = "./crates/indexer" } e3-keyshare = { version = "0.1.0", path = "./crates/keyshare" } e3-logger = { version = "0.1.0", path = "./crates/logger" } @@ -110,6 +112,7 @@ fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } figment = { version = "0.10.19", features = ["yaml", "test"] } futures = "0.3.30" futures-util = "0.3" +glob = "0.3.2" git2 = "0.20.2" hex = "0.4.3" jsonrpsee = { version = "0.25.1", features = ["http-client"] } @@ -127,6 +130,7 @@ petname = "2.0.2" phf = { version = "0.11", features = ["macros"] } rand_chacha = "0.3.1" rand = "0.8.5" +regex = "1.11.1" reqwest = "0.12.15" serde = { version = "1.0.208", features = ["derive"] } serde_json = "1.0.133" @@ -141,6 +145,7 @@ tracing = "0.1.37" tracing-opentelemetry = "0.30.0" tracing-subscriber = { version = "0.3", features = ["env-filter", "time"] } url = "2.5.4" +vfs = { git = "https://github.com/ryardley/rust-vfs.git", features = ["async-vfs"] } libp2p = { version = "0.54.1", features = [ "gossipsub", "identify", diff --git a/crates/Dockerfile b/crates/Dockerfile index d365005563..ecc0ee263a 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -42,6 +42,7 @@ COPY crates/events/Cargo.toml ./events/Cargo.toml COPY crates/evm/Cargo.toml ./evm/Cargo.toml COPY crates/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml COPY crates/fhe/Cargo.toml ./fhe/Cargo.toml +COPY crates/fs/Cargo.toml ./fs/Cargo.toml COPY crates/indexer/Cargo.toml ./indexer/Cargo.toml COPY crates/init/Cargo.toml ./init/Cargo.toml COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index a4817d2c98..0e539837bb 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use crate::helpers::telemetry::setup_tracing; +use crate::helpers::telemetry::{setup_simple_tracing, setup_tracing}; use crate::net::NetCommands; use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; @@ -71,6 +71,7 @@ impl Cli { #[instrument(skip_all)] pub async fn execute(self) -> Result<()> { + let log_level = self.log_level(); // Attempt to load the config, but only treat "not found" as // the trigger for the init flow. All other errors bubble up. let config = match self.load_config() { @@ -85,7 +86,10 @@ impl Cli { // Existing init branch match self.command { Commands::Rev => rev::execute().await?, - Commands::Init {path, template} => init::execute(path, template).await?, + Commands::Init {path, template, skip_cleanup} => { + setup_simple_tracing(log_level); + init::execute(path, template, skip_cleanup).await? + }, Commands::ConfigSet { rpc_url, eth_address, @@ -127,7 +131,7 @@ impl Cli { Err(e) => return Err(e), }; - setup_tracing(&config, self.log_level())?; + setup_tracing(&config, log_level)?; info!("Config loaded from: {:?}", config.config_file()); if config.autopassword() { @@ -221,6 +225,11 @@ pub enum Commands { /// Template repository to use. Expecting the form `git+https://github.com/gnosisguild/enclave.git#hacknet:template/default` #[arg(long)] template: Option, + + /// Do not clean up on errors leaving the working folder intact. This option is mainly used + /// for testing the installer. + #[arg(long)] + skip_cleanup: bool, }, /// Compile an Enclave project diff --git a/crates/cli/src/helpers/telemetry.rs b/crates/cli/src/helpers/telemetry.rs index e90e7efb09..8fa5747748 100644 --- a/crates/cli/src/helpers/telemetry.rs +++ b/crates/cli/src/helpers/telemetry.rs @@ -8,6 +8,15 @@ use tracing::Level; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; +pub fn setup_simple_tracing(log_level: Level) { + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(tracing_subscriber::filter::LevelFilter::from_level( + log_level, + )) + .init(); +} + pub fn setup_tracing(config: &AppConfig, log_level: Level) -> Result<()> { let name = config.name(); let maybe_otel_endpoint = config.otel(); diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs index 413f780a00..1eab6a21b9 100644 --- a/crates/cli/src/init.rs +++ b/crates/cli/src/init.rs @@ -2,6 +2,10 @@ use std::path::PathBuf; use anyhow::Result; -pub async fn execute(location: Option, template: Option) -> Result<()> { - e3_init::execute(location, template).await +pub async fn execute( + location: Option, + template: Option, + skip_cleanup: bool, +) -> Result<()> { + e3_init::execute(location, template, skip_cleanup).await } diff --git a/crates/fs/Cargo.toml b/crates/fs/Cargo.toml new file mode 100644 index 0000000000..96707d6b78 --- /dev/null +++ b/crates/fs/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "e3-fs" +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true + +[dependencies] +vfs.workspace = true +async-trait.workspace = true +anyhow.workspace = true +futures.workspace = true +tokio.workspace = true +glob.workspace = true +regex.workspace = true diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs new file mode 100644 index 0000000000..3eeb6b605d --- /dev/null +++ b/crates/fs/src/fs.rs @@ -0,0 +1,332 @@ +use crate::traits::{DirectoryManager, FileCopier, FileFinder, FileReader, FileWriter, Replacer}; +use anyhow::Result; +use futures::io::AsyncWriteExt; +use futures::stream::StreamExt; +use glob::Pattern; +use regex::Regex; +use std::path::Path; +use vfs::async_vfs::{AsyncMemoryFS, AsyncPhysicalFS, AsyncVfsPath}; + +pub struct Fs { + root: AsyncVfsPath, +} + +impl Fs { + pub fn new(root: AsyncVfsPath) -> Self { + Self { root } + } + + pub fn mem() -> Self { + let fs = AsyncMemoryFS::new(); + Self::new(fs.into()) + } + + pub fn physical_path>(root_path: P) -> Result { + let fs = AsyncPhysicalFS::new(root_path.as_ref()); + Ok(Self::new(fs.into())) + } + + pub fn physical() -> Result { + Ok(Self::physical_path("/")?) + } +} + +#[async_trait::async_trait] +impl FileReader for Fs { + async fn read_to_string + Send>(&self, path: P) -> Result { + let file_path = self.root.join(path.as_ref().to_string_lossy().as_ref())?; + let contents = file_path.read_to_string().await?; + Ok(contents) + } +} + +#[async_trait::async_trait] +impl FileWriter for Fs { + async fn write_to_file + Send>(&self, path: P, content: &str) -> Result<()> { + let file_path = self.root.join(path.as_ref().to_string_lossy().as_ref())?; + let mut file = file_path.create_file().await?; + file.write_all(content.as_bytes()).await?; + Ok(()) + } +} + +#[async_trait::async_trait] +impl DirectoryManager for Fs { + async fn mkdirp + Send>(&self, dest_path: P) -> Result<()> { + let dir_path = self + .root + .join(dest_path.as_ref().to_string_lossy().as_ref())?; + dir_path.create_dir_all().await?; + Ok(()) + } +} + +#[async_trait::async_trait] +impl FileCopier for Fs { + async fn cp + Send, P2: AsRef + Send>( + &self, + src_path: P1, + dest_path: P2, + ) -> Result<()> { + let src_str = src_path.as_ref().to_string_lossy(); + let copy_contents_only = src_str.ends_with("/."); + + let actual_src = if copy_contents_only { + let trimmed: &str = src_str.trim_end_matches("/.").as_ref(); + self.root.join(trimmed)? + } else { + self.root.join(src_str.as_ref())? + }; + + let dest = self + .root + .join(dest_path.as_ref().to_string_lossy().as_ref())?; + + if actual_src.is_file().await? { + actual_src.copy_file(&dest).await?; + } else if actual_src.is_dir().await? { + if copy_contents_only { + copy_dir_contents(&actual_src, &dest).await?; + } else { + actual_src.copy_dir(&dest).await?; + } + } + + Ok(()) + } +} + +async fn copy_dir_contents( + src_dir: &vfs::async_vfs::AsyncVfsPath, + dest_dir: &vfs::async_vfs::AsyncVfsPath, +) -> Result<()> { + if !dest_dir.exists().await? { + dest_dir.create_dir_all().await?; + } + + let entries = src_dir.read_dir().await?; + let all_entries: Vec<_> = entries.collect().await; + + for entry in all_entries { + let entry_name = entry.filename(); + let src_entry = src_dir.join(&entry_name)?; + let dest_entry = dest_dir.join(&entry_name)?; + + if src_entry.is_file().await? { + src_entry.copy_file(&dest_entry).await?; + } else if src_entry.is_dir().await? { + src_entry.copy_dir(&dest_entry).await?; + } + } + + Ok(()) +} + +#[async_trait::async_trait] +impl FileFinder for Fs { + async fn find_files + Send>( + &self, + in_folder: P, + glob_pattern: &str, + ) -> Result> { + let folder_path = self + .root + .join(in_folder.as_ref().to_string_lossy().as_ref())?; + + let pattern = Pattern::new(glob_pattern)?; + let mut matching_files = Vec::new(); + + println!("Folder Path: {}", folder_path.as_str()); + println!("Pattern: {pattern}"); + + let all_entries: Vec<_> = folder_path + .walk_dir() + .await? + .map(|res| res.unwrap()) + .collect::>() + .await; + println!("ALL ENTRIES: {:?}", all_entries); + for entry in all_entries { + if entry.is_file().await? { + let filename = entry.as_str(); + println!("entry is file for {filename}"); + if pattern.matches(filename) { + matching_files.push(entry.as_str().to_string()); + } + } + } + Ok(matching_files) + } +} + +#[async_trait::async_trait] +impl Replacer for Fs { + async fn replace_in_place + Send + Sync>( + &self, + pattern: &Regex, + replacement: &str, + file_path: P, + ) -> Result<()> { + println!( + "replace_in_place({:?},{:?},{:?})", + &pattern, + &replacement, + file_path.as_ref() + ); + let content = self.read_to_string(&file_path).await?; + let new_content = pattern.replace_all(&content, replacement); + if content != new_content { + self.write_to_file(file_path, &new_content).await?; + } else { + println!("No change made to {:?}", file_path.as_ref()); + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use anyhow::Result; + + #[tokio::test] + async fn test_write_and_read_file() -> Result<()> { + // Create an in-memory filesystem + // let memory_fs = AsyncMemoryFS::new(); + let fs = Fs::mem(); + + // Test data + let test_path = "test_file.txt"; + let test_content = "Hello, World!\nThis is a test file."; + + // Write the file + fs.write_to_file(test_path, test_content).await?; + + // Read the file back + let read_content = fs.read_to_string(test_path).await?; + + // Verify the content matches + assert_eq!(read_content, test_content); + + Ok(()) + } + + #[tokio::test] + async fn test_mkdirp_creates_directory() -> Result<()> { + // Create an in-memory filesystem + let fs = Fs::mem(); + + let test_dir = "some/deep/nested/directory"; + + // Create the directory structure + fs.mkdirp(test_dir).await?; + + // Verify the directory was created by checking if it exists + let dir_path = fs.root.join(test_dir)?; + assert!(dir_path.exists().await?); + + Ok(()) + } + + #[tokio::test] + async fn test_cp_recursive_copy() -> Result<()> { + // Create an in-memory filesystem + let fs = Fs::mem(); + + // Set up source directory structure with files + fs.mkdirp("src/subdir").await?; + fs.write_to_file("src/file1.txt", "content of file1") + .await?; + fs.write_to_file("src/subdir/file2.txt", "content of file2") + .await?; + + // Copy the entire directory structure + fs.cp("src", "dest").await?; + + // Verify the destination structure was created + let dest_path = fs.root.join("dest")?; + assert!(dest_path.exists().await?); + assert!(dest_path.is_dir().await?); + + // Verify files were copied + let file1_content = fs.read_to_string("dest/file1.txt").await?; + assert_eq!(file1_content, "content of file1"); + + let file2_content = fs.read_to_string("dest/subdir/file2.txt").await?; + assert_eq!(file2_content, "content of file2"); + + Ok(()) + } + + #[tokio::test] + async fn test_find_files_with_glob_pattern() -> Result<()> { + // Create an in-memory filesystem + let fs = Fs::mem(); + + // Create a deeply nested folder structure with various files + fs.mkdirp("project/src/utils").await?; + fs.mkdirp("project/src/components").await?; + fs.mkdirp("project/tests").await?; + + // Create files with different extensions + fs.write_to_file("project/src/main.rs", "fn main() {}") + .await?; + fs.write_to_file("project/src/lib.rs", "pub mod utils;") + .await?; + fs.write_to_file("project/src/utils/helper.rs", "pub fn help() {}") + .await?; + fs.write_to_file("project/src/components/button.rs", "struct Button {}") + .await?; + fs.write_to_file("project/tests/integration.rs", "#[test] fn test() {}") + .await?; + fs.write_to_file("project/Cargo.toml", "[package]").await?; + fs.write_to_file("project/README.md", "# Project").await?; + + // Find all .rs files + let rust_files = fs.find_files("project", "*.rs").await?; + + // Verify we found all Rust files + assert_eq!(rust_files.len(), 5); + assert!(rust_files.contains(&"/project/src/main.rs".to_string())); + assert!(rust_files.contains(&"/project/src/lib.rs".to_string())); + assert!(rust_files.contains(&"/project/src/utils/helper.rs".to_string())); + assert!(rust_files.contains(&"/project/src/components/button.rs".to_string())); + assert!(rust_files.contains(&"/project/tests/integration.rs".to_string())); + + // Find files with specific pattern + let toml_files = fs.find_files("project", "*.toml").await?; + assert_eq!(toml_files.len(), 1); + assert!(toml_files.contains(&"/project/Cargo.toml".to_string())); + + Ok(()) + } + + #[tokio::test] + async fn test_replace_in_place() -> Result<()> { + // Create an in-memory filesystem + let fs = Fs::mem(); + + // Create a test file with content to replace + let test_path = "config.txt"; + let original_content = + "server_url=localhost:8080\napi_version=v1\nserver_url=example.com:9090"; + fs.write_to_file(test_path, original_content).await?; + + // Create a regex pattern to replace all server_url values + let pattern = Regex::new(r"server_url=([^\n]+)")?; + let replacement = "server_url=production.example.com:443"; + + // Apply the replacement + fs.replace_in_place(&pattern, replacement, test_path) + .await?; + + // Read the modified content + let modified_content = fs.read_to_string(test_path).await?; + + // Verify the replacements were made + let expected_content = "server_url=production.example.com:443\napi_version=v1\nserver_url=production.example.com:443"; + assert_eq!(modified_content, expected_content); + + Ok(()) + } +} diff --git a/crates/fs/src/lib.rs b/crates/fs/src/lib.rs new file mode 100644 index 0000000000..c7c0969f99 --- /dev/null +++ b/crates/fs/src/lib.rs @@ -0,0 +1,5 @@ +mod fs; +pub mod prelude; +mod traits; + +pub use fs::*; diff --git a/crates/fs/src/prelude.rs b/crates/fs/src/prelude.rs new file mode 100644 index 0000000000..b3f8e57333 --- /dev/null +++ b/crates/fs/src/prelude.rs @@ -0,0 +1,3 @@ +pub use crate::traits::{ + DirectoryManager, FileCopier, FileFinder, FileReader, FileWriter, Replacer, +}; diff --git a/crates/fs/src/traits.rs b/crates/fs/src/traits.rs new file mode 100644 index 0000000000..b062209656 --- /dev/null +++ b/crates/fs/src/traits.rs @@ -0,0 +1,46 @@ +use anyhow::Result; +use regex::Regex; +use std::path::Path; + +#[async_trait::async_trait] +pub trait FileReader { + async fn read_to_string + Send + Sync>(&self, path: P) -> Result; +} + +#[async_trait::async_trait] +pub trait FileWriter { + async fn write_to_file + Send>(&self, path: P, content: &str) -> Result<()>; +} + +#[async_trait::async_trait] +pub trait DirectoryManager { + async fn mkdirp + Send>(&self, dest_path: P) -> Result<()>; +} + +#[async_trait::async_trait] +pub trait FileCopier { + async fn cp + Send, P2: AsRef + Send>( + &self, + src_path: P1, + dest_path: P2, + ) -> Result<()>; +} + +#[async_trait::async_trait] +pub trait FileFinder { + async fn find_files + Send>( + &self, + in_folder: P, + glob_pattern: &str, + ) -> Result>; +} + +#[async_trait::async_trait] +pub trait Replacer { + async fn replace_in_place + Send + Sync>( + &self, + pattern: &Regex, + replacement: &str, + file_path: P, + ) -> Result<()>; +} diff --git a/crates/init/Cargo.toml b/crates/init/Cargo.toml index b5f4e3c92b..6c35ebb15b 100644 --- a/crates/init/Cargo.toml +++ b/crates/init/Cargo.toml @@ -15,3 +15,6 @@ serde_json.workspace = true serde.workspace = true async-trait.workspace = true url.workspace = true +e3-fs.workspace = true +regex.workspace = true +tracing.workspace = true diff --git a/crates/init/src/copy.rs b/crates/init/src/copy.rs index 5cd79f47e2..fc05ac9b97 100644 --- a/crates/init/src/copy.rs +++ b/crates/init/src/copy.rs @@ -1,6 +1,9 @@ -use anyhow::{bail, Context, Result}; -use std::{ffi::OsStr, path::Path}; -use tokio::process::Command; +use anyhow::Result; +use e3_fs::prelude::*; +use e3_fs::Fs; +use regex::Regex; +use std::path::Path; +use tracing::info; #[derive(Debug, Clone)] pub struct Filter { @@ -8,7 +11,6 @@ pub struct Filter { pub search_pattern: String, pub replacement: String, } - impl Filter { pub fn new(glob_pattern: &str, search_pattern: &str, replacement: &str) -> Self { Filter { @@ -19,134 +21,209 @@ impl Filter { } } -pub async fn copy_with_filters( +pub async fn copy_with_filters_impl( + fs: &Fs, src_path: P1, dest_path: P2, filters: &[Filter], ) -> Result<()> where - P1: AsRef, - P2: AsRef, + P1: AsRef + Send + Sync, + P2: AsRef + Send + Sync, { - let src_path = src_path.as_ref(); - let dest_path = dest_path.as_ref(); - - // Create destination directory and copy contents in one shell command - let combined_command = format!( - "mkdir -p {} && cp -r {}/. {}", - dest_path.to_string_lossy(), - src_path.to_string_lossy(), - dest_path.to_string_lossy() - ); - - let output = Command::new("sh") - .arg("-c") - .arg(&combined_command) - .output() - .await - .context("Failed to execute mkdir and cp commands")?; + info!("mkdirp {:?}", dest_path.as_ref()); + fs.mkdirp(&dest_path).await?; + info!("cp -r {:?} {:?}", src_path.as_ref(), dest_path.as_ref()); + fs.cp(&src_path, &dest_path).await?; - if !output.status.success() { - let stderr = String::from_utf8_lossy(&output.stderr); - bail!("mkdir and cp commands failed: {}", stderr); - } - - // Then apply filters to matching files for filter in filters { - apply_filter_to_files(dest_path.as_os_str(), filter).await?; - } - Ok(()) -} - -// Async function to detect if we're using BSD sed -// You can test for BSD sed by checking if the --version flag is supported. -// GNU sed supports --version while BSD sed doesn't and will exit with an error. -async fn is_bsd_sed() -> bool { - Command::new("sed") - .arg("--version") - .output() - .await - .map(|output| !output.status.success()) - .unwrap_or(false) -} - -async fn apply_filter_to_files(base_path: impl AsRef, filter: &Filter) -> Result<()> { - let is_bsd = is_bsd_sed().await; - - // Find files matching the glob pattern - let find_output = Command::new("find") - .arg(base_path) - .arg("-name") - .arg(&filter.glob_pattern) - .arg("-type") - .arg("f") - .output() - .await - .context("Failed to execute find command")?; - - if !find_output.status.success() { - let stderr = String::from_utf8_lossy(&find_output.stderr); - bail!("find command failed: {}", stderr); - } - - let files = String::from_utf8_lossy(&find_output.stdout); - - // Apply sed replacement to each matching file - for file_path in files.lines().filter(|line| !line.is_empty()) { - let sed_cmd = format!( - "s|{}|{}|g", - escape_sed_pattern(&filter.search_pattern), - escape_sed_replacement(&filter.replacement) + // We need to prefix the glob pattern or it will be from the root of the filesystem + let prefixed_glob_pattern = format!( + "{}/{}", + dest_path.as_ref().to_string_lossy(), + &filter.glob_pattern ); - - println!("Running sed..."); - println!("> {}", sed_cmd); - - let mut cmd = Command::new("sed"); - - // Check if we're on macOS (BSD sed) and add empty backup extension - if is_bsd { - // This is a quirk of BSD sed - we need to do the equivalent of: - // sed -i '' pattern filename - cmd.arg("-i").arg(""); - } else { - // Normal sed is: - // sed -i pattern filename - cmd.arg("-i"); - } - - let sed_output = cmd - .arg(sed_cmd) - .arg(file_path) - .output() - .await - .context("Failed to execute sed command")?; - - println!("{:?}", sed_output); - - if !sed_output.status.success() { - let stderr = String::from_utf8_lossy(&sed_output.stderr); - bail!("sed command failed on {}: {}", file_path, stderr); + info!("Running filter: {:?}", filter); + let file_paths = fs.find_files(&dest_path, &prefixed_glob_pattern).await?; + info!("pattern:{} found {:?}", filter.glob_pattern, file_paths); + + for file_path in file_paths { + fs.replace_in_place( + &Regex::new(&filter.search_pattern)?, + &filter.replacement, + file_path, + ) + .await?; } } - Ok(()) } -fn escape_sed_pattern(pattern: &str) -> String { - pattern.replace("|", "\\|") // Only escape the pipe delimiter -} - -fn escape_sed_replacement(replacement: &str) -> String { - // Don't escape backslashes that are followed by digits (backreferences like \1, \2, etc.) - let mut result = replacement.to_string(); +pub async fn copy_with_filters( + src_path: P1, + dest_path: P2, + filters: &[Filter], +) -> Result<()> +where + P1: AsRef + Send + Sync, + P2: AsRef + Send + Sync, +{ + info!( + "src: {:?} dest: {:?}", + src_path.as_ref(), + dest_path.as_ref() + ); - // First escape literal backslashes (but not backreferences) - // This is tricky - we need to escape \ that aren't part of \1, \2, etc. + copy_with_filters_impl( + &Fs::physical()?, + src_path.as_ref().join("."), + dest_path, + filters, + ) + .await?; + Ok(()) +} - // Simple approach: only escape the delimiter and ampersand - result = result.replace("|", "\\|"); // Escape pipe delimiter - result = result.replace("&", "\\&"); // Escape ampersand +#[cfg(test)] +mod tests { + use super::*; + use anyhow::Result; + use e3_fs::Fs; + #[tokio::test] + async fn test_copy_with_filters_impl() -> Result<()> { + // Create an in-memory filesystem + let fs = Fs::mem(); + // Define source and destination paths + let src_path = "/tmp/mysource/."; + let dest_path = "/home/user/myproj"; + fs.mkdirp(&dest_path).await?; + // Create some test files in the source directory + fs.mkdirp(&src_path).await?; + fs.write_to_file(format!("{}/file1.txt", src_path), "Content of file 1") + .await?; + fs.write_to_file(format!("{}/file2.txt", src_path), "Content of file 2") + .await?; + fs.mkdirp(format!("{}/subdir", src_path)).await?; + fs.write_to_file( + format!("{}/subdir/file3.txt", src_path), + "Content of file 3", + ) + .await?; + // Create a nested directory structure with a package.json file + fs.mkdirp(format!( + "{}/tools/build/scripts/utils/helper-tool", + src_path + )) + .await?; + fs.write_to_file( + format!( + "{}/tools/build/scripts/utils/helper-tool/package.json", + src_path + ), + r#"{ + "name": "helper-tool", + "version": "1.0.0", + "description": "A simple utility tool", + "main": "index.js", + "dependencies": { + "lodash": "^4.17.21" + } +}"#, + ) + .await?; + + // Execute the copy operation + copy_with_filters_impl( + &fs, + &src_path, + &dest_path, + &vec![ + Filter::new( + "**/*/package.json", + r#""lodash":\s*"[^"]*""#, + r#""lodash": "1.0.0""#, + ), + // Filter::new("package.json", "lodash", "nodash"), + Filter::new("**/*/file3.txt", "file", "chicken"), + ], + ) + .await?; + + // Verify that files were copied to the destination + // Check that the original files exist in source + assert!(fs + .read_to_string(format!("{}/file1.txt", src_path)) + .await + .is_ok()); + assert!(fs + .read_to_string(format!("{}/file2.txt", src_path)) + .await + .is_ok()); + assert!(fs + .read_to_string(format!("{}/subdir/file3.txt", src_path)) + .await + .is_ok()); + + // Check that files were copied to destination + let copied_file1 = fs + .read_to_string(format!("{}/file1.txt", dest_path)) + .await?; + let copied_file2 = fs + .read_to_string(format!("{}/file2.txt", dest_path)) + .await?; + let copied_file3 = fs + .read_to_string(format!("{}/subdir/file3.txt", dest_path)) + .await?; + let copied_package_json = fs + .read_to_string(format!( + "{}/tools/build/scripts/utils/helper-tool/package.json", + dest_path + )) + .await?; + let new_package_json = fs + .read_to_string(format!( + "{}/tools/build/scripts/utils/helper-tool/package.json", + dest_path + )) + .await?; + + assert_eq!( + new_package_json, + r#"{ + "name": "helper-tool", + "version": "1.0.0", + "description": "A simple utility tool", + "main": "index.js", + "dependencies": { + "lodash": "1.0.0" + } +}"#, + ); - result + // Verify content matches + assert_eq!(copied_file1, "Content of file 1"); + assert_eq!(copied_file2, "Content of file 2"); + assert_eq!(copied_file3, "Content of chicken 3"); // substitution + assert!(copied_package_json.contains("helper-tool")); + assert!(copied_package_json.contains("lodash")); + + // Additional verification: check that the source files still exist (copy, not move) + let original_file1 = fs.read_to_string(format!("{}/file1.txt", src_path)).await?; + let original_file2 = fs.read_to_string(format!("{}/file2.txt", src_path)).await?; + let original_file3 = fs + .read_to_string(format!("{}/subdir/file3.txt", src_path)) + .await?; + let original_package_json = fs + .read_to_string(format!( + "{}/tools/build/scripts/utils/helper-tool/package.json", + src_path + )) + .await?; + assert_eq!(original_file1, "Content of file 1"); + assert_eq!(original_file2, "Content of file 2"); + assert_eq!(original_file3, "Content of file 3"); + assert!(original_package_json.contains("helper-tool")); + assert!(original_package_json.contains("lodash")); + Ok(()) + } } diff --git a/crates/init/src/git.rs b/crates/init/src/git.rs index 1e3692a1ed..5c47183116 100644 --- a/crates/init/src/git.rs +++ b/crates/init/src/git.rs @@ -5,7 +5,7 @@ use tokio::process::Command; use url::Url; pub async fn shallow_clone(git_repo: &str, branch: &str, target_folder: &str) -> Result<()> { - Command::new("git") + let status = Command::new("git") .args([ "clone", "--depth", @@ -17,6 +17,15 @@ pub async fn shallow_clone(git_repo: &str, branch: &str, target_folder: &str) -> ]) .status() .await?; + + if !status.success() { + return Err(anyhow::anyhow!( + "Git clone failed with exit code: {}", + status.code().unwrap_or(-1) + ) + .into()); + } + Ok(()) } diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index a964641494..1e34466392 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -4,7 +4,7 @@ mod git; mod package_json; mod pkgman; -use anyhow::{bail, Result}; +use anyhow::Result; use copy::Filter; use file_utils::{chmod_recursive, delete_path, move_file, remove_all_files_in_dir}; use git::parse_git_url; @@ -42,20 +42,22 @@ async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> ) .await?; + let src = PathBuf::from(TEMP_DIR).join(template_path); + println!("Copy with filters..."); copy::copy_with_filters( - &PathBuf::from(TEMP_DIR).join(template_path), + &src, &cwd, &vec![ Filter::new( - "package.json", - "\"@gnosis-guild/enclave\":\\s*\"[^\"]*\"", - &format!("\"@gnosis-guild/enclave\": \"{}\"", evm_version), + "**/package.json", + r#""@gnosis-guild/enclave":\s*"[^"]*""#, + &format!(r#""@gnosis-guild/enclave": "{}""#, evm_version), ), Filter::new( - "package.json", - "\"@gnosis-guild/enclave-react\":\\s*\"[^\"]*\"", - &format!("\"@gnosis-guild/enclave-react\": \"{}\"", react_version), + "**/package.json", + r#""@gnosis-guild/enclave-react":\s*"[^"]*""#, + &format!(r#""@gnosis-guild/enclave-react": "{}""#, react_version), ), ], ) @@ -130,13 +132,24 @@ async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> } // Updated execute function to include workspace dependency substitution -pub async fn execute(location: Option, template: Option) -> Result<()> { +pub async fn execute( + location: Option, + template: Option, + skip_cleanup: bool, +) -> Result<()> { let mut install_in_current_dir = false; + let env_current_dir = env::current_dir()?; let cwd = match location { - Some(loc) => loc, + Some(loc) => { + if loc.is_absolute() { + loc + } else { + env_current_dir.join(loc) + } + } None => { install_in_current_dir = true; - env::current_dir()? + env_current_dir } }; @@ -152,10 +165,12 @@ pub async fn execute(location: Option, template: Option) -> Res Ok(_) => Ok(()), Err(e) => { println!("Cleaning up due to error..."); - if install_in_current_dir { - remove_all_files_in_dir(&cwd).await?; - } else { - fs::remove_dir_all(&cwd).await?; + if !skip_cleanup { + if install_in_current_dir { + remove_all_files_in_dir(&cwd).await?; + } else { + fs::remove_dir_all(&cwd).await?; + } } eprintln!("\nSorry about this but there was an error running the installer. "); eprintln!("\n Error: {}\n", e); diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 0cae7c94d2..00705b77d5 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -70,6 +70,7 @@ COPY crates/events/Cargo.toml crates/events/Cargo.toml COPY crates/evm/Cargo.toml crates/evm/Cargo.toml COPY crates/evm-helpers/Cargo.toml crates/evm-helpers/Cargo.toml COPY crates/fhe/Cargo.toml crates/fhe/Cargo.toml +COPY crates/fs/Cargo.toml crates/fs/Cargo.toml COPY crates/indexer/Cargo.toml crates/indexer/Cargo.toml COPY crates/init/Cargo.toml crates/init/Cargo.toml COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml From 048c2a39db87483340049e9dee9fa47e1955bc30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 23 Jun 2025 20:43:10 +0000 Subject: [PATCH 094/106] Device is not a TTY (#544) --- crates/support-scripts/ctl/container | 10 ++++++++-- templates/default/scripts/dev_all_concurrently.sh | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 73080c41de..4462035979 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -32,12 +32,18 @@ trap cleanup EXIT INT TERM mkdir -p "$(pwd)/.enclave/caches"/{target,registry,git,risc0-cache,risc0-circuits} chmod -R 777 "$(pwd)/.enclave/caches" +if [ -t 0 ]; then + TTY_FLAGS="-it" +else + TTY_FLAGS="" +fi + if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then echo "Running exec $IMAGE..." - docker exec -it "$CONTAINER_NAME" bash -c "$*" + docker exec $TTY_FLAGS "$CONTAINER_NAME" bash -c "$*" else echo "Running start $IMAGE..." - docker run -it --rm \ + docker run $TTY_FLAGS --rm \ --name "$CONTAINER_NAME" \ --platform linux/amd64 \ --network=host \ diff --git a/templates/default/scripts/dev_all_concurrently.sh b/templates/default/scripts/dev_all_concurrently.sh index ea12f4de39..46cb8ca8a9 100755 --- a/templates/default/scripts/dev_all_concurrently.sh +++ b/templates/default/scripts/dev_all_concurrently.sh @@ -11,7 +11,7 @@ fi # Run all processes concurrently using pnpm pnpm concurrently \ - --names "FRONTEND,EVM,CIPHER,SERVER,ENCLAVE" \ + --names "FRONTEND,EVM,CIPHER,SERVER,PROGRAM" \ --prefix-colors "blue,cyan,magenta,yellow,green" \ --kill-others-on-fail \ "pnpm dev:frontend" \ From c7055864cd5f91080972acaf4c5cf28c93949600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 24 Jun 2025 10:38:57 +0000 Subject: [PATCH 095/106] Use host-gateway to enable cross platform callback networking (#546) * Use host-gateway to enable cross platform callback networking * Listen on ipv4 * Add comment --- crates/support-scripts/ctl/container | 9 ++++++++- crates/support/app/src/main.rs | 6 +++++- templates/default/server/index.ts | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 4462035979..39afba04e7 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -43,10 +43,17 @@ if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then docker exec $TTY_FLAGS "$CONTAINER_NAME" bash -c "$*" else echo "Running start $IMAGE..." + # --network=host does not work on macos for allowing the container to access + # the local machine. `--add-host...` is adding host.local to the hosts file + # in the docker container we can then replace localhost and 127.0.0.1 + # from the input callback url so calls redirect to gateway. + # This should in theory be crossplatform + # However on linux the user must allow incoming connections from Docker's bridge network 172.17.0.0/16 through their firewall. docker run $TTY_FLAGS --rm \ --name "$CONTAINER_NAME" \ --platform linux/amd64 \ - --network=host \ + --add-host=host.local:host-gateway \ + -p 13151:13151 \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ -v "$(pwd)/.enclave/caches/target:/app/target" \ diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index 111e5004fe..c7521b9c50 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -93,8 +93,12 @@ async fn handle_compute(req: web::Json) -> ActixResult { + app.listen(PORT, "0.0.0.0", () => { console.log(`🚀 Enclave Server listening on port ${PORT}`); console.log(`📡 Event listeners active`); console.log(`📊 Sessions: http://localhost:${PORT}/sessions`); From e15c439eaa3795c4a945eda804ef918a6b221c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 24 Jun 2025 14:05:13 +0000 Subject: [PATCH 096/106] Add `enclave purge-all` and `enclave program cache purge` (#552) * Add enclave purge * Remove redundant file * Make it explicit which package we are calling * Update cli structure --- crates/cli/src/cli.rs | 8 +++++++- crates/cli/src/main.rs | 2 ++ crates/cli/src/nodes.rs | 9 +++++++-- crates/cli/src/nodes_purge.rs | 7 +++++++ crates/cli/src/program.rs | 15 +++++++++++++++ crates/cli/src/purge_all.rs | 8 ++++++++ crates/entrypoint/src/nodes/mod.rs | 1 + crates/entrypoint/src/nodes/purge.rs | 17 +++++++++++++++++ crates/support-scripts/src/lib.rs | 8 ++++++++ templates/default/foo | 0 10 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 crates/cli/src/nodes_purge.rs create mode 100644 crates/cli/src/purge_all.rs create mode 100644 crates/entrypoint/src/nodes/purge.rs delete mode 100644 templates/default/foo diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index 0e539837bb..efda4b88d2 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -6,7 +6,7 @@ use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::program::{self, ProgramCommands}; use crate::wallet::WalletCommands; -use crate::{config_set, init, net, password, rev, wallet}; +use crate::{config_set, init, net, nodes_purge, password, purge_all, rev, wallet}; use crate::{print_env, start}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; @@ -154,6 +154,9 @@ impl Cli { Commands::Compile => e3_support_scripts::program_compile().await?, Commands::PrintEnv { vite, chain } => print_env::execute(&config, &chain, vite).await?, Commands::Program { command } => program::execute(command, &config).await?, + Commands::PurgeAll => { + purge_all::execute().await?; + } Commands::ConfigSet { .. } => { bail!("Cannot run `enclave config-set` when a configuration already exists."); } @@ -244,6 +247,9 @@ pub enum Commands { command: ProgramCommands, }, + /// Purge both the local program cache and all ciphernode databases + PurgeAll, + /// Password management commands Password { #[command(subcommand)] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 2ae051a92e..f85337b3cf 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -14,6 +14,7 @@ mod nodes; mod nodes_daemon; mod nodes_down; mod nodes_ps; +mod nodes_purge; mod nodes_restart; mod nodes_start; mod nodes_status; @@ -24,6 +25,7 @@ mod password_delete; mod password_set; mod print_env; mod program; +mod purge_all; mod rev; mod start; mod wallet; diff --git a/crates/cli/src/nodes.rs b/crates/cli/src/nodes.rs index 0e32976b4a..1f4e588604 100644 --- a/crates/cli/src/nodes.rs +++ b/crates/cli/src/nodes.rs @@ -3,8 +3,8 @@ use clap::Subcommand; use e3_config::AppConfig; use crate::{ - nodes_daemon, nodes_down, nodes_ps, nodes_restart, nodes_start, nodes_status, nodes_stop, - nodes_up, + nodes_daemon, nodes_down, nodes_ps, nodes_purge, nodes_restart, nodes_start, nodes_status, + nodes_stop, nodes_up, }; #[derive(Subcommand, Debug)] @@ -32,6 +32,10 @@ pub enum NodeCommands { /// List all process statuses Ps, + /// Purge all local ciphernode data. This will delete all passwords and prior ciphernode + /// events. + Purge, + /// Start an individual node in the nodes set Start { /// The id of the node @@ -81,6 +85,7 @@ pub async fn execute( NodeCommands::Status { id } => nodes_status::execute(&id).await?, NodeCommands::Stop { id } => nodes_stop::execute(&id).await?, NodeCommands::Restart { id } => nodes_restart::execute(&id).await?, + NodeCommands::Purge => nodes_purge::execute().await?, }; Ok(()) diff --git a/crates/cli/src/nodes_purge.rs b/crates/cli/src/nodes_purge.rs new file mode 100644 index 0000000000..538b3c3661 --- /dev/null +++ b/crates/cli/src/nodes_purge.rs @@ -0,0 +1,7 @@ +use anyhow::*; + +/// Purge all ciphernode data +pub async fn execute() -> Result<()> { + e3_entrypoint::nodes::purge::execute().await?; + Ok(()) +} diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index ccb12bdd1d..cfcda11e90 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -12,6 +12,18 @@ pub enum ProgramCommands { /// Get a shell into the docker environment that the program runs in Shell, + + /// Commands to manage the program compilation cache + Cache { + #[command(subcommand)] + command: ProgramCacheCommands, + }, +} + +#[derive(Subcommand, Debug)] +pub enum ProgramCacheCommands { + /// Purge program compilation caches. Will make program compilation take longer. + Purge, } pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { @@ -19,6 +31,9 @@ pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> ProgramCommands::Start => e3_support_scripts::program_start(config.program()).await?, ProgramCommands::Compile => e3_support_scripts::program_compile().await?, ProgramCommands::Shell => e3_support_scripts::program_shell().await?, + ProgramCommands::Cache { command } => match command { + ProgramCacheCommands::Purge => e3_support_scripts::program_cache_purge().await?, + }, }; Ok(()) diff --git a/crates/cli/src/purge_all.rs b/crates/cli/src/purge_all.rs new file mode 100644 index 0000000000..12b131a359 --- /dev/null +++ b/crates/cli/src/purge_all.rs @@ -0,0 +1,8 @@ +use anyhow::Result; + +/// Purge all local data anc cache +pub async fn execute() -> Result<()> { + e3_entrypoint::nodes::purge::execute().await?; + e3_support_scripts::program_cache_purge().await?; + Ok(()) +} diff --git a/crates/entrypoint/src/nodes/mod.rs b/crates/entrypoint/src/nodes/mod.rs index 39303c0b1b..a5ee053e86 100644 --- a/crates/entrypoint/src/nodes/mod.rs +++ b/crates/entrypoint/src/nodes/mod.rs @@ -4,6 +4,7 @@ pub mod down; pub mod nodes; pub mod process_manager; pub mod ps; +pub mod purge; pub mod restart; pub mod server; pub mod start; diff --git a/crates/entrypoint/src/nodes/purge.rs b/crates/entrypoint/src/nodes/purge.rs new file mode 100644 index 0000000000..95283a098b --- /dev/null +++ b/crates/entrypoint/src/nodes/purge.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use std::env; +use tokio::fs; + +/// Purge all ciphernode data +pub async fn execute() -> Result<()> { + let cwd = env::current_dir()?; + let data_folder = cwd.join(".enclave/data"); + if fs::try_exists(&data_folder).await? { + fs::remove_dir_all(data_folder).await?; + } + let config_folder = cwd.join(".enclave/config"); + if fs::try_exists(&config_folder).await? { + fs::remove_dir_all(config_folder).await?; + } + Ok(()) +} diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 09ac784863..3d78119549 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -80,3 +80,11 @@ pub async fn program_start(program_config: &ProgramConfig) -> Result<()> { run_bash_script(&cwd, &script, &args).await?; Ok(()) } + +/// Purge all build caches from support +pub async fn program_cache_purge() -> Result<()> { + let cwd = env::current_dir()?; + let caches = cwd.join(".enclave/caches"); + fs::remove_dir_all(caches).await?; + Ok(()) +} diff --git a/templates/default/foo b/templates/default/foo deleted file mode 100644 index e69de29bb2..0000000000 From fb345c394b7ab468b1909c98eea0f572c0ce32e5 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 24 Jun 2025 19:37:04 +0500 Subject: [PATCH 097/106] Update Docs (#514) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rollback metamask version * Fix Computation Flow * Start Script * Tutorial * Crisp Updates * Remove takeaways * fix lockfile merge --------- Co-authored-by: гλ --- .github/workflows/crisp-e2e.yaml | 3 +- deploy/local/start.sh | 132 +++++++++ docs/pages/CRISP/_meta.json | 2 +- docs/pages/CRISP/introduction.mdx | 122 +++++++-- docs/pages/CRISP/running-e3.mdx | 193 ++++++++------ docs/pages/CRISP/setup.mdx | 228 ++++++++++------ docs/pages/_meta.json | 15 +- docs/pages/computation-flow.mdx | 48 ++-- docs/pages/hello-world-tutorial.mdx | 200 ++++++++++++++ docs/pages/installation.mdx | 104 ++++++++ docs/pages/putting-it-together.mdx | 4 +- docs/pages/quick-start.mdx | 106 ++++++++ docs/pages/setting-up-server.mdx | 386 +++++++++++++++++++++++---- docs/public/crisp-overview-light.png | Bin 242648 -> 0 bytes examples/CRISP/package.json | 3 +- examples/CRISP/playwright.config.ts | 1 + pnpm-lock.yaml | 105 +++++--- 17 files changed, 1328 insertions(+), 324 deletions(-) create mode 100755 deploy/local/start.sh create mode 100644 docs/pages/hello-world-tutorial.mdx create mode 100644 docs/pages/installation.mdx create mode 100644 docs/pages/quick-start.mdx delete mode 100644 docs/public/crisp-overview-light.png diff --git a/.github/workflows/crisp-e2e.yaml b/.github/workflows/crisp-e2e.yaml index a10322a8a1..1d9e70ff74 100644 --- a/.github/workflows/crisp-e2e.yaml +++ b/.github/workflows/crisp-e2e.yaml @@ -74,9 +74,10 @@ jobs: - name: Run Playwright tests working-directory: ./examples/CRISP - run: pnpm test:e2e env: PLAYWRIGHT_WORKERS: 4 + METAMASK_VERSION: 11.8.2 + run: pnpm test:e2e - name: Upload test results if: always() diff --git a/deploy/local/start.sh b/deploy/local/start.sh new file mode 100755 index 0000000000..ac0d9ed346 --- /dev/null +++ b/deploy/local/start.sh @@ -0,0 +1,132 @@ +#!/bin/bash + +set -e + +echo "🚀 Starting CRISP Development Environment..." + +# Function to check if a command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Check dependencies +echo "📋 Checking dependencies..." + +if ! command_exists "cargo"; then + echo "❌ Rust/Cargo is required but not installed" + exit 1 +fi + +if ! command_exists "pnpm"; then + echo "❌ pnpm is required but not installed" + exit 1 +fi + +if ! command_exists "concurrently"; then + echo "❌ concurrently is required but not installed" + echo "Install with: npm install -g concurrently" + exit 1 +fi + +if ! command_exists "anvil"; then + echo "❌ Foundry/Anvil is required but not installed" + exit 1 +fi + +echo "✅ All dependencies found" + +# Install the enclave binary +echo "🔧 Installing Enclave CLI..." +cargo install --path ./crates/cli --bin enclave -f + +# Function to wait for a service to be ready +wait_for_service() { + local url=$1 + local service_name=$2 + local max_attempts=30 + local attempt=1 + + echo "⏳ Waiting for $service_name to be ready..." + + while [ $attempt -le $max_attempts ]; do + if curl -s "$url" >/dev/null 2>&1; then + echo "✅ $service_name is ready!" + return 0 + fi + echo " Attempt $attempt/$max_attempts - $service_name not ready yet..." + sleep 2 + attempt=$((attempt + 1)) + done + + echo "❌ $service_name failed to start after $max_attempts attempts" + return 1 +} + +# Function to deploy contracts +deploy_contracts() { + echo "📄 Deploying contracts..." + + # Deploy Enclave contracts + echo " Deploying Enclave contracts..." + (cd packages/evm && rm -rf deployments/localhost && pnpm deploy:mocks --network localhost) + + # Deploy CRISP contracts + echo " Deploying CRISP contracts..." + (cd examples/CRISP && ETH_WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 FOUNDRY_PROFILE=local forge script --rpc-url http://localhost:8545 --broadcast deploy/Deploy.s.sol) + + # Wait a bit for nodes to be ready + sleep 5 + + # Add ciphernodes to the registry + echo " Adding ciphernodes to registry..." + CN1=0xbDA5747bFD65F08deb54cb465eB87D40e51B197E + CN2=0xdD2FD4581271e230360230F9337D5c0430Bf44C0 + CN3=0x2546BcD3c84621e976D8185a91A922aE77ECEc30 + + pnpm ciphernode:add --ciphernode-address "$CN1" --network "localhost" + pnpm ciphernode:add --ciphernode-address "$CN2" --network "localhost" + pnpm ciphernode:add --ciphernode-address "$CN3" --network "localhost" + + # Clean up local database + echo " Cleaning up local database..." + rm -rf ./examples/CRISP/apps/server/database + + echo "✅ Contracts deployed successfully!" +} + +# Start infrastructure (anvil + ciphernodes) in background +echo "🏗️ Starting infrastructure..." +concurrently \ + --names "ANVIL,NODES" \ + --prefix-colors "blue,yellow" \ + "anvil" \ + "cd examples/CRISP && enclave wallet set --name ag --private-key '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' && enclave nodes up -v" & + +INFRA_PID=$! + +# Wait for Anvil to be ready +wait_for_service "http://localhost:8545" "Anvil" + +# Deploy contracts +deploy_contracts + +# Wait a moment for everything to stabilize +echo "⏳ Waiting for infrastructure to stabilize..." +sleep 3 + +# Install CRISP dependencies +echo "📦 Installing CRISP dependencies..." +(cd examples/CRISP/apps/client && pnpm install) + +echo "🎯 Starting CRISP applications..." + +# Start all CRISP applications +concurrently \ + --names "CLIENT,SERVER,PROGRAM" \ + --prefix-colors "green,yellow,magenta" \ + "cd examples/CRISP/apps/client && pnpm dev" \ + "cd examples/CRISP/apps/server && cargo run --bin server" \ + "cd examples/CRISP/apps/program && cargo run" + +# This will run until interrupted +echo "🚨 CRISP development environment stopped" \ No newline at end of file diff --git a/docs/pages/CRISP/_meta.json b/docs/pages/CRISP/_meta.json index 7300cb711f..60f4927cd8 100644 --- a/docs/pages/CRISP/_meta.json +++ b/docs/pages/CRISP/_meta.json @@ -8,4 +8,4 @@ "running-e3": { "title": "Running an E3 Program" } -} +} \ No newline at end of file diff --git a/docs/pages/CRISP/introduction.mdx b/docs/pages/CRISP/introduction.mdx index 2a90aa7403..e0c3245e0b 100644 --- a/docs/pages/CRISP/introduction.mdx +++ b/docs/pages/CRISP/introduction.mdx @@ -1,60 +1,124 @@ --- title: 'CRISP Introduction' -description: '' +description: 'Coercion-Resistant Impartial Selection Protocol - A complete E3 program example' --- # Introduction to CRISP + CRISP (Coercion-Resistant Impartial Selection Protocol) is a secure protocol for digital decision-making, leveraging fully homomorphic encryption (FHE) and distributed threshold cryptography (DTC) to enable verifiable secret ballots. Built with Enclave, CRISP safeguards democratic systems and decision-making applications against coercion, manipulation, and other vulnerabilities. -This project is a comprehensive example of an E3 Program, designed to demonstrate secure and impartial decision-making processes. It includes a full-stack implementation with a front-end, back-end, smart contracts, and zkVM components, providing a robust framework for developers to explore and extend. +This project serves as a comprehensive example of an E3 Program, demonstrating secure and impartial decision-making processes with a modern Hardhat-based architecture. It showcases a complete full-stack implementation including frontend, backend, smart contracts, and zkVM components. ## Why CRISP? -Open ballots are known to produce suboptimal outcomes, exposing participants to bribery and coercion. CRISP mitigates these risks and other vulnerabilities with secret, receipt-free ballots, fostering secure and impartial decision-making environments. +Open ballots are known to produce suboptimal outcomes, exposing participants to bribery and coercion. CRISP mitigates these risks through: + +- **Secret ballots**: Votes remain encrypted throughout the process +- **Receipt-free voting**: No proof of vote can be generated for coercion +- **Verifiable results**: Zero-knowledge proofs ensure computation integrity +- **Distributed trust**: No single point of failure or control + +## Project Structure +CRISP follows a modern Hardhat-based structure with clear separation of concerns: -## CRISP Overview -![CRISP Project Structure](/crisp-overview-light.png) +``` +CRISP/ +├── apps/ # Application components +│ ├── client/ # React frontend application +│ ├── server/ # Rust coordination server +│ ├── program/ # RISC Zero computation program +│ └── wasm-crypto/ # WebAssembly crypto utilities +├── contracts/ # Smart contracts (Solidity) +├── circuits/ # Noir circuits for ZK proofs +├── scripts/ # Development and utility scripts +├── enclave.config.yaml # Ciphernode configuration +``` --- -### **Client** -The Client is a React application that serves as the front-end interface for users to interact with the CRISP protocol. It is organized into the following components: +### **Client Application** (`/apps/client`) -- `/libs/wasm/pkg/`: A WebAssembly library package responsible for encrypting the user's vote before sending it to the server. -- `/public/`: Static assets such as images and stylesheets. -- `/src/`: React components and the source code for the application. -- Configuration files and README for project setup and documentation. +The client is a React application built with TypeScript that provides a voting interface: + +- Wallet connection with MetaMask and other wallets +- Vote encryption using WebAssembly-based FHE encryption before submission +- Noir Zero-knowledge proof generation for vote validation +- Real-time updates on voting status and results --- -### **Server** -The Server is an Actix backend that handles the core functionality of the CRISP protocol: +### **Coordination Server** (`/apps/server`) -- **Voting:** Provides a secure interface for users to cast their votes. -- **Blockchain Event Listener:** Listens for and responds to events from the Enclave smart contracts. -- **Compute Provider Invocation:** Calls the Compute Provider to execute the Secure Process inside the RISC Zero zkVM (Zero-Knowledge Virtual Machine) to perform Fully Homomorphic Encryption (FHE) computations. -- **Result Publishing:** Publishes the computed results back to the blockchain for transparency and immutability. +The server is a Rust-based coordination service that manages the E3 lifecycle: -Aside from the core functionality, the Server module also includes a CLI that can be used to request a new voting round, submit a vote, and publish results. +- Listens to blockchain events and coordinates protocol progression +- Collects encrypted votes from the Smart Contract +- Triggers FHE computations after the voting round is closed. +- Publishes results back to the blockchain +- RESTful API for client interactions --- -### **RISC Zero** -CRISP utilizes the RISC Zero zkVM to run its Secure Process and perform FHE computations. This module includes: +### **ZK Program** (`/apps/program`) + +The core computation logic written in Rust for zkVM: -- The Secure Process, written in Rust, that performs encrypted computations. - - `/apps`: The host application that is responsible for interfacing with the Client and the Server. - - `/core`: The common logic shared between the host and the guest program. - - `/methods`: The Secure Process that is executed inside the zkVM. -- Verifier contracts that ensure the integrity and correctness of the computations. +- Performs computations on encrypted votes +- Counts votes without decrypting individual ballots +- Creates proofs of correct computation --- -### **Compute Provider** -A helper library designed to interface with the RISC Zero Compute Provider for executing secure computations. It can be used to run any Secure Process within a Compute Provider of your choice (e.g., SP1, Jolt, etc.). +### **WebAssembly Crypto** (`/apps/wasm-crypto`) + +High-performance cryptographic operations compiled to WebAssembly: + +- Client-side fully homomorphic encryption +- ZK Circuit input generation for Noir proofs +- Optimized for browser execution --- -### **Web Rust** -The Web Rust module contains the logic for encrypting data using an FHE public key. Compiled to WebAssembly, it is used by the Client to securely encrypt the user's vote before sending it to the Server for further processing. +### **Smart Contracts** (`/contracts`) + +Solidity contracts implementing the E3 program interface: + +#### **CRISPProgram.sol** +Main E3 program contract implementing the `IE3Program` interface: +- `validate()`: Validates voting parameters and setup +- `verify()`: Verifies zkVM proofs of computation + +#### **CRISPInputValidator.sol** +Handles vote validation and zero-knowledge proof verification: +- Validates encrypted vote format +- Verifies voter eligibility proofs +- Ensures vote uniqueness + +#### **CRISPVerifier.sol** +Noir verifier for proof of correct encryption: +- Verifies if the vote was encrypted correctly +- Verifies if the vote is valid + +#### **CRISPPolicy.sol** +Manages voting policies and governance: +- Defines voting rules and constraints +- Manages voter registration + +#### **CRISPChecker.sol** +Additional verification and checking logic: +- Vote format validation +- Eligibility checking +- Result verification + +--- + +## Next Steps + +To get started with CRISP: + +1. **[Setup](/CRISP/setup)**: Install dependencies and configure your environment +2. **[Running E3](/CRISP/running-e3)**: Deploy and run the complete CRISP protocol +3. **Study the code**: Examine the implementation for your own E3 programs + +CRISP demonstrates the full potential of E3 programs for privacy-preserving applications, providing a complete reference implementation for developers building with Enclave. diff --git a/docs/pages/CRISP/running-e3.mdx b/docs/pages/CRISP/running-e3.mdx index 76139cd42b..612122a6e0 100644 --- a/docs/pages/CRISP/running-e3.mdx +++ b/docs/pages/CRISP/running-e3.mdx @@ -3,132 +3,134 @@ title: Running an E3 Program description: '' --- +import { Steps } from 'nextra/components' + # Running an E3 Program -In this section, we will go through all the steps to run an E3 Program using CRISP. -We will run a single voting round of CRISP and do the following: + +In this section, we will go through all the steps to run an E3 Program using CRISP. We will run a complete voting round of CRISP and do the following: + +- Start the infrastructure (nodes and contracts) +- Start the CRISP applications (client, server, program) - Request an E3 Voting Round -- Submit a vote -- Compute the result -- Verify the result +- Submit votes through the web interface +- Compute and verify results Please make sure you have followed the [CRISP Setup](/CRISP/setup) guide before proceeding. + -## Ciphernodes Setup +### Start Infrastructure -### Running Ciphernodes -In the root `enclave` directory, you have to run the Ciphernodes. To run four Ciphernodes, use the provided script [`run_ciphernodes.sh`](https://github.com/gnosisguild/CRISP/blob/main/packages/local_testnet/run_ciphernodes.sh). Ensure you run the script from the root `enclave` directory to set the environment variables correctly: +First, ensure you have the infrastructure running. If you haven't already, complete the setup: + +**Terminal 1: Start Anvil** ```sh -RUST_LOG=info ./run_aggregator.sh +anvil ``` -### Running the Aggregator -After starting the Ciphernodes, run the aggregator with the script [`run_aggregator.sh`](https://github.com/gnosisguild/enclave/blob/main/evm/run_aggregator.sh): - +**Terminal 2: Start Ciphernodes** ```sh -RUST_LOG=info ./run_aggregator.sh +cd examples/CRISP +enclave nodes up -v ``` -### Adding Ciphernodes to the Registry -Once the aggregator is running, you can add the Ciphernodes to the registry with the script [`add_ciphernodes.sh`](https://github.com/gnosisguild/CRISP/blob/main/packages/local_testnet/add_ciphernodes.sh): +Make sure contracts are deployed and ciphernodes are added to the registry as described in the setup guide. -```sh -./add_ciphernodes.sh -``` +### Start the Client Application + +**Terminal 3: Client** + +Navigate to the client directory and start the React application: -After running the script, you should see the following output in the aggregator terminal: ```sh -[AGG]: READY -[AGG]: CiphernodeAdded(0x2546BcD3c84621e976D8185a91A922aE77ECEc30) -[AGG]: CiphernodeAdded(0xbDA5747bFD65F08deb54cb465eB87D40e51B197E) -[AGG]: CiphernodeAdded(0xdD2FD4581271e230360230F9337D5c0430Bf44C0) -[AGG]: CiphernodeAdded(0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199) +cd examples/CRISP/apps/client +pnpm dev ``` +The client application will start on `http://localhost:3000`. -## Running the CRISP Server +### Start the Server Application -To run the CRISP Server, navigate to the `CRISP/packages/server` directory and execute the following command: -> **Note:** Make sure you have set the environment variables correctly before running the server. +**Terminal 4: Server** + +Navigate to the server directory and start the backend server: ```sh +cd examples/CRISP/apps/server cargo run --bin server ``` -## Interacting with CRISP via CLI +The server will start and begin listening for blockchain events. -Once the Server is running, you can interact with the CRISP by using the CLI. +### Start the Program Server -### Requesting a New Round +**Terminal 5: Program** +Navigate to the program directory and start the program server: -1. Run the CLI: -```sh -cargo run --bin cli -``` -You should see the following output: ```sh -? Enclave (EEEE): Please choose the private execution environment you would like to run! › -❯ CRISP: Voting Protocol (ETH) - More Coming Soon! +cd examples/CRISP/apps/program +cargo run ``` -2. Select `CRISP: Voting Protocol (ETH)` from the menu. +This runs the RISC Zero program server that handles secure computations. + +### Initialize a New Voting Round + +**Terminal 6: CLI** + +Navigate to the server directory and start the CLI: + ```sh -❯ Initialize new E3 round. - Activate an E3 round. - Participate in an E3 round. - Decrypt Ciphertext & Publish Results +cd examples/CRISP/apps/server +cargo run --bin cli ``` -3. To initiate a new CRISP voting round, choose the option `Initialize new CRISP round`. +Follow these steps in the CLI: + +1. Select `CRISP: Voting Protocol (ETH)` from the menu +2. Choose `Initialize new E3 round` to start a new voting round + +You should see output similar to: ```sh -✔ Initialize new E3 round. [2024-10-22 11:56:11] [commands.rs:42] - Starting new CRISP round! [2024-10-22 11:56:11] [commands.rs:46] - Enabling E3 Program... [2024-10-22 11:56:11] [commands.rs:50] - E3 Program enabled. TxHash: 0xa391a4cd2dcc59f4bc6dd1f5ed1c78006dbba4556ea633f4b6a53e2271538682 [2024-10-22 11:56:11] [commands.rs:74] - E3 request sent. TxHash: 0xe7998b9748e3526f6ca992c9bb498beabe4f387b02240a23d0f42a2386d3c305 ``` -Ensure all services are running correctly and that components are communicating as expected before starting a new CRISP round. +### Set Up MetaMask +To interact with the client application, you need to configure MetaMask: -### Submitting a Vote +1. Open MetaMask in your browser +2. Add the Anvil private key to your wallet: + ``` + 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + ``` +3. Connect to the local Anvil network: + - Network Name: Anvil Local + - RPC URL: `http://localhost:8545` + - Chain ID: `31337` + - Currency Symbol: `ETH` -1. Run the CLI: -```sh -cargo run --bin cli -``` +### Submit Votes via Web Interface -2. Select the option `Participate in an E3 round`. -```sh -✔ Participate in an E3 round. -``` +1. Navigate to `http://localhost:3000` in your browser +2. Connect your MetaMask wallet +3. You should see the active voting round +4. Submit your vote by selecting your choice and confirming the transaction -3. Select the round you would like to participate in. -```sh -? Enter CRISP round ID. -❯ 0 -``` -4. Submit your vote by entering the vote in the prompt. -```sh -? Please select your voting option. -❯ Abstain - Yes - No -``` +### Monitor the Process -After submitting your vote, you should see the following output: -```sh -✔ Enclave (EEEE): Please choose the private execution environment you would like to run! · CRISP: Voting Protocol (ETH) -✔ Create a new CRISP round or participate in an existing round. · Participate in an E3 round. -✔ Enter CRISP round ID. · 0 -✔ Please select your voting option. · Vote yes. -[2024-10-22 11:58:58] [commands.rs:129] - Vote broadcast. TxHash: 0x389466265c543845f050aa931472840eb1d3f67276d1650aede77ce07426e98e -``` +You can monitor the entire process through the various terminal outputs: -### Computing the Result -After the voting period has ended, the server will compute the result and publish the ciphertext. +**Server logs will show:** +- Vote submissions being received +- Computation starting when the voting period ends +- Results being computed and published + +**Example server output:** ```sh [2024-10-22 11:59:12] [handlers.rs:95] - Vote Count: 1 [2024-10-22 11:59:12] [handlers.rs:101] - Starting computation for E3: 0 @@ -138,8 +140,7 @@ Prove function execution time: 2 minutes and 37 seconds [2024-10-22 12:01:49] [handlers.rs:111] - Publishing ciphertext... ``` -### Decrypting the Result -The Ciphernodes will capture the published ciphertext, decrypt it, and publish the plaintext. +**Ciphernode logs will show:** ```sh INFO Extracted log from evm sending now. INFO evt=CiphertextOutputPublished(e3_id: 0) e3_id=0 @@ -149,10 +150,7 @@ INFO evt=E3RequestComplete(e3_id: 0) INFO Plaintext published. tx=0x320dd95358cc86c2a709b6fec0c6865b43fa063cb61dfcb8a748005d4886f040 ``` -### Verifying the Result - -The server captures the plaintext, decodes it, and displays it. - +**Final result logs:** ```sh [2024-10-22 12:01:49] [handlers.rs:171] - Handling PlaintextOutputPublished event... [2024-10-22 12:01:49] [handlers.rs:181] - Vote Count: 1 @@ -161,5 +159,34 @@ The server captures the plaintext, decodes it, and displays it. [2024-10-22 12:01:49] [handlers.rs:187] - PlaintextOutputPublished event handled. ``` + + +## Understanding the Process + +The CRISP voting process involves several key steps: + +1. **Initialization**: A new E3 round is created on the blockchain +2. **Vote Submission**: Users submit encrypted votes through the web interface +3. **Computation**: After the voting period, RISC Zero computes the results using FHE +4. **Decryption**: Ciphernodes collaboratively decrypt the results +5. **Publication**: Final results are published to the blockchain and displayed + +## Troubleshooting + +- **Ensure all terminals remain open** during the voting process +- **MetaMask connection issues**: Check that you're connected to the correct network (Chain ID: 31337) +- **Transaction failures**: Verify you have sufficient ETH balance from the Anvil faucet +- **Server errors**: Monitor the server logs for detailed error messages +- **Ciphernode issues**: Ensure all ciphernode processes are running and connected + +## Next Steps + +Once you've successfully run a voting round, you can: + +- **Experiment with different voting scenarios**: Try multiple votes and different options +- **Modify voting parameters**: Adjust the configuration for different use cases +- **Explore the codebase**: Understand the implementation details for your own E3 programs +- **Deploy to testnet**: Move beyond local development to public testnets + ![Result](/poll-result.png) diff --git a/docs/pages/CRISP/setup.mdx b/docs/pages/CRISP/setup.mdx index c930ec55c9..855a3b2d7b 100644 --- a/docs/pages/CRISP/setup.mdx +++ b/docs/pages/CRISP/setup.mdx @@ -7,12 +7,52 @@ import { Steps } from 'nextra/components' # Getting Started with CRISP -This guide will walk you through the steps to set up and run CRISP locally. CRISP is a complete example of an E3 Program, and setting it up involves installing dependencies and deploying both the RISC Zero contracts and Enclave contracts. +This guide will walk you through the steps to set up and run CRISP locally. CRISP is a complete example of an E3 Program, built with a modern Hardhat-based architecture that includes smart contracts, frontend applications, and secure computation components. The setup includes the following: -- RISC Zero contracts located in the `CRISP/packages/risc0` directory. -- Ciphernodes (Enclave, Registry, etc.) located in the `evm` directory of the [Enclave Repo](https://github.com/gnosisguild/enclave). +- **CRISP contracts**: Smart contracts located in the `contracts/` directory +- **Applications**: Frontend, server, and computation programs in the `apps/` directory +- **Ciphernodes**: Distributed nodes managed through the Enclave CLI +- **Development environment**: Hardhat + Foundry hybrid setup + +## Quick Start with Docker (Recommended) + +The fastest way to get CRISP running is using the Docker development environment: + +```sh +cd examples/CRISP + +# Setup and build the development environment +pnpm dev:setup + +# Start all services (Anvil, Ciphernodes, Applications) +pnpm dev:up +``` + +This will: +- Build all necessary Docker containers +- Start Anvil (local blockchain) +- Deploy all contracts +- Start the ciphernode network +- Launch all CRISP applications + +**Available Docker Commands:** +- `pnpm dev:setup` - Build the development containers +- `pnpm dev:up` - Start all services +- `pnpm dev:down` - Stop and clean up all services +- `pnpm dev:build` - Rebuild containers +- `pnpm cli` - Invoke the Server CLI inside the Docker Container + +Once everything is running, you can: +1. Run `pnpm cli` to start a new E3 Round. +2. Open `http://localhost:3000` for the client interface +3. Configure MetaMask with the Anvil network (see [MetaMask Setup](#metamask-setup) below) +4. Start voting! + +## Manual Setup + +If you prefer to set up CRISP manually or want to understand each component: ## Prerequisites @@ -23,9 +63,34 @@ Before getting started, ensure you have the following tools installed: - **RISC Zero toolchain** (for RISC Zero program development) - **Node.js** (JavaScript runtime for client-side dependencies) - **Anvil** (local Ethereum node) +- **Enclave CLI** (for managing ciphernodes) ## Install Dependencies +### Install Enclave CLI + +The recommended way to install the Enclave CLI is using our installer script: + +```sh +curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +This will install `enclaveup`, which can then install the Enclave CLI: + +```sh +enclaveup install +``` + +For more installation options and details, see the [Installation Guide](/installation). + +**Alternative: Build from Source** + +If you prefer to build from source: + +```sh +cargo install --path ./crates/cli --bin enclave -f +``` + ### Install Rust and Foundry First, install Rust and Foundry. After installation, restart your terminal. @@ -60,30 +125,24 @@ At this point, you should have all the necessary tools to develop and deploy app ## Setting Up the Client -The Client is a simple React application used to interact with the CRISP Server. Follow these steps to set it up locally: +The Client is a React application used to interact with the CRISP Server. Follow these steps to set it up locally: -1. Clone the repository: +1. Navigate to the client directory: ```sh - git clone https://github.com/gnosisguild/CRISP.git + cd examples/CRISP/apps/client ``` -2. Navigate to the `client` directory: +2. Install dependencies: ```sh - cd CRISP/packages/client + pnpm install ``` -3. Install dependencies: +3. Start the development server: ```sh - yarn install - ``` - -4. Start the development server: - - ```sh - yarn dev + pnpm dev ``` ## Setting Up the CRISP Server @@ -102,21 +161,22 @@ The CRISP server setup involves several components. This guide will walk you thr Keep this terminal open and running. Open a new terminal for the next steps. -### Deploying the Enclave Contracts +### Deploy the Enclave Contracts -1. Clone the [Enclave Repo](https://github.com/gnosisguild/enclave): +1. Clone the [Enclave Repository](https://github.com/gnosisguild/enclave) if you haven't already: ```sh git clone https://github.com/gnosisguild/enclave.git cd enclave ``` -2. Install the dependencies and Compile the contracts: +2. Install the dependencies: ```sh - yarn && yarn compile + pnpm install ``` -3. Navigate to the `evm` directory: + +3. Navigate to the `packages/evm` directory: ```sh cd packages/evm @@ -125,102 +185,106 @@ Keep this terminal open and running. Open a new terminal for the next steps. 4. Deploy the Enclave contracts on the local testnet: ```sh - yarn deploy:mocks --network localhost + rm -rf deployments/localhost + pnpm deploy:mocks --network localhost ``` After deployment, take note of the addresses for the following contracts: -- Enclave -- Ciphernode Registry -- Naive Registry Filter -- Mock Input Validator +- **Enclave**: Main protocol contract +- **Ciphernode Registry**: Registry for compute nodes +- **Filter Registry**: Registry for computation filters +- **Mock Input Validator**: Development input validation -### Deploying the E3 Program and Verifier RISC Zero Contract +### Deploy the CRISP Contracts -1. Set up the environment variables by by exporting the Bonsai API Key: +1. Navigate to the CRISP directory: + + ```sh + cd examples/CRISP + ``` - > **_Note:_** _You will need a Bonsai API Key. You can request one [here](https://bonsai.xyz/apply)._ +2. Set up the environment variables by exporting the ETH wallet private key (Anvil's default private key): ```sh - export BONSAI_API_KEY="your_api_key" - export BONSAI_API_URL="your_api_url" + export ETH_WALLET_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ``` -2. Navigate to the `CRISP/packages/evm_base` directory and install the dependencies: +3. **Optional**: Set up Bonsai for faster proving (requires API key): + + > **_Note:_** _You can request a Bonsai API Key [here](https://bonsai.xyz/apply)._ ```sh - cd CRISP/packages/evm_base - yarn install + export BONSAI_API_KEY="your_api_key" + export BONSAI_API_URL="your_api_url" ``` -3. Navigate to the `CRISP/packages/risc0` directory and build the contracts: +4. Deploy the CRISP contracts using Foundry: ```sh - cd CRISP/packages/risc0 - forge build + FOUNDRY_PROFILE=local forge script --rpc-url http://localhost:8545 --broadcast deploy/Deploy.s.sol ``` -4. In the `risc0/script` directory, update the `config.toml` with the deployed contract addresses: +Make sure to take note of the **CRISP Program Contract Address**, as this will serve as the **E3 Program Address**. + +### Set Up Ciphernodes - ```toml - [profile.custom] - chainId = 31337 - riscZeroVerifierAddress = "0x0000000000000000000000000000000000000000" - enclaveAddress = "your_enclave_address" - inputValidatorAddress = "your_input_validator_address" +Start the ciphernodes using the Enclave CLI: + +1. Set up the aggregator wallet: + + ```sh + enclave wallet set --name ag --private-key "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ``` -4. Export the ETH wallet private key (Anvil’s default private key): +2. Start the ciphernode network: ```sh - export ETH_WALLET_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + enclave nodes up -v ``` -5. Deploy the contracts: +3. Add ciphernodes to the registry: ```sh - forge script --rpc-url http://localhost:8545 --broadcast script/Deploy.s.sol + # Navigate back to the Enclave repository + cd ../../packages/evm + + # Add the ciphernodes + pnpm ciphernode:add --ciphernode-address "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" --network "localhost" + pnpm ciphernode:add --ciphernode-address "0xdD2FD4581271e230360230F9337D5c0430Bf44C0" --network "localhost" + pnpm ciphernode:add --ciphernode-address "0x2546BcD3c84621e976D8185a91A922aE77ECEc30" --network "localhost" ``` -Make sure to take note of the **CRISPRisc0 Contract Address**, as this will serve as the **E3 Program Address**. +### Configuration -### Set Up Environment Variables +The CRISP project uses an `enclave.config.yaml` file that defines: -Create a `.env` file in the `CRISP/packages/server` directory and fill in the values you noted during the previous steps: +- **Chains**: Network configuration (Hardhat/Anvil) +- **Contract addresses**: Enclave, Ciphernode Registry, Filter Registry +- **Nodes**: Configuration for ciphernodes (cn1, cn2, cn3) and aggregator (ag) -```sh -CRON_API_KEY=your_cron_api_key # Optional for e3_cron binary - -PRIVATE_KEY=your_private_key -ENCLAVE_SERVER_URL=http://0.0.0.0:4000 -HTTP_RPC_URL=http://localhost:8545 -WS_RPC_URL=ws://localhost:8545 -CHAIN_ID=your_chain_id - -ENCLAVE_ADDRESS=your_enclave_contract_address -E3_PROGRAM_ADDRESS=your_e3_program_address # CRISPRisc0 Contract Address -CIPHERNODE_REGISTRY_ADDRESS=your_ciphernode_registry_address -NAIVE_REGISTRY_FILTER_ADDRESS=your_naive_registry_filter_address - -# E3 Config -E3_WINDOW_SIZE=600 -E3_THRESHOLD_MIN=1 -E3_THRESHOLD_MAX=2 -E3_DURATION=600 - -# E3 Compute Provider Config -E3_COMPUTE_PROVIDER_NAME="RISC0" -E3_COMPUTE_PROVIDER_PARALLEL=false -E3_COMPUTE_PROVIDER_BATCH_SIZE=4 # Must be a power of 2 -``` +The default configuration is already set up for local development with Anvil. -## Overview +## MetaMask Setup + +To interact with CRISP through the web interface, configure MetaMask: + +1. **Add the Anvil private key** to your wallet: + ``` + 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + ``` + +2. **Add the local Anvil network**: + - Network Name: `Anvil Local` + - RPC URL: `http://localhost:8545` + - Chain ID: `31337` + - Currency Symbol: `ETH` + +3. **Connect to the application** at `http://localhost:3000` + -If you followed the steps correctly, you should now have: +## Next Steps -- A local testnet running with Anvil -- Enclave contracts deployed -- RISC Zero E3 Program and Verifier contracts deployed -- CRISP Server set up with appropriate environment variables \ No newline at end of file +Once you have completed the setup, you can proceed to [Running an E3 Program](/CRISP/running-e3) to learn how to interact with CRISP and run voting rounds. \ No newline at end of file diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index fff010cdb1..fddb92457b 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -22,6 +22,19 @@ "building-with-enclave": { "title": "Building with Enclave" }, + "-- TUTORIAL": { + "type": "separator", + "title": "Tutorial" + }, + "installation": { + "title": "Installation" + }, + "quick-start": { + "title": "Quick Start" + }, + "hello-world-tutorial": { + "title": "Hello World" + }, "-- BUILD AN E3": { "type": "separator", "title": "BUILD AN E3 Program" @@ -61,4 +74,4 @@ "whitepaper": { "title": "White Paper" } -} +} \ No newline at end of file diff --git a/docs/pages/computation-flow.mdx b/docs/pages/computation-flow.mdx index 1fab789e29..cd4ade37b7 100644 --- a/docs/pages/computation-flow.mdx +++ b/docs/pages/computation-flow.mdx @@ -26,17 +26,17 @@ Providers, or other network participant. 4. **Submit the Request**: Call `request` on the Enclave contract to publish the request and initialize the E3. -```solidity -function request( - address filter, - uint32[2] calldata threshold, - uint256[2] calldata startWindow, - uint256 duration, - IE3Program e3Program, - bytes memory e3ProgramParams, - bytes memory computeProviderParams - ) external payable returns (uint256 e3Id, E3 memory e3) -``` + ```solidity + function request( + address filter, + uint32[2] calldata threshold, + uint256[2] calldata startWindow, + uint256 duration, + IE3Program e3Program, + bytes memory e3ProgramParams, + bytes memory computeProviderParams + ) external payable returns (uint256 e3Id, E3 memory e3) + ``` ### Phase 2: Node Selection @@ -57,19 +57,15 @@ During this phase, Data Providers — who may include individual users, applicat ensure they are valid for the requested E3. Some of these proofs are generic (e.g., proof of valid encryption) while others will be specific to your application. 3. **Submit Inputs**: Both encrypted data and ZKPs are submitted to the Enclave contract, which will - call the `validate` function on your E3P smart contract. The input hash is then added to a Merkle + call the `validate` function on your E3P InputValidator smart contract. The input hash is then added to a Merkle tree, the root of which can later be used to anchor proofs of correct execution of your E3 Program. ```solidity function validate( - uint256 e3Id, - uint256 seed, - bytes calldata e3ProgramParams, - bytes calldata computeProviderParams - ) - external - returns (bytes32 encryptionSchemeId, IInputValidator inputValidator); + address sender, + bytes memory data + ) external returns (bytes memory input); ``` ### Phase 4: Execution @@ -84,10 +80,10 @@ publishes the encrypted output back to Enclave contract. ```solidity function publishCiphertextOutput( - uint256 e3Id, - bytes memory ciphertextOutput, - bytes memory proof - ) external returns (bool success); + uint256 e3Id, + bytes memory ciphertextOutput, + bytes memory proof + ) external returns (bool success); ``` ### Phase 5: Decryption @@ -99,3 +95,9 @@ Enclave contract's `getE3()` function. ```solidity function getE3(uint256 e3Id) external view returns (E3 memory e3); ``` + +or by listening to the `PlaintextOutputPublished` event. + +```solidity +event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); +``` diff --git a/docs/pages/hello-world-tutorial.mdx b/docs/pages/hello-world-tutorial.mdx new file mode 100644 index 0000000000..d50b42672b --- /dev/null +++ b/docs/pages/hello-world-tutorial.mdx @@ -0,0 +1,200 @@ +--- +title: 'Hello World Tutorial' +description: 'Build your first E3 program from scratch with step-by-step explanations' +--- + +# Hello World Tutorial + +This tutorial walks you through building your first E3 program from scratch. You'll learn how each component works and how they interact to create a secure, encrypted computation. + +> Make sure to complete the [Quick Start](/quick-start) guide first to get familiar with the basic workflow before diving into this detailed tutorial. + +## What We're Building + +We'll create a simple E3 program that: +1. **Accepts** two encrypted numbers from users +2. **Computes** their sum using Fully Homomorphic Encryption +3. **Returns** the encrypted result without ever decrypting the inputs + +## Prerequisites + +Before starting, ensure you have: +- [Enclave CLI installed](/installation) +- Basic knowledge of Rust and TypeScript +- Rust, Docker, Node.js, and pnpm installed + +## Step 1: Project Setup + +Create a new E3 project: + +```bash +enclave init hello-world-e3 +cd hello-world-e3 +``` + +Let's examine the generated project structure: + +``` +hello-world-e3/ +├── program/ # FHE computation logic (Rust) +├── contracts/ # Smart contracts (Solidity) +├── client/ # Frontend application (React/TypeScript) +├── server/ # Coordination server (TypeScript) +├── enclave.config.yaml # Enclave configuration +└── README.md # Project documentation +``` + +## Step 2: Understanding the FHE Program + +The heart of your E3 program is in `./program/src/lib.rs`. Let's examine the default implementation: + +```rust +use e3_bfv_helpers::decode_bfv_params_arc; +use e3_compute_provider::FHEInputs; +use fhe_rs::bfv::Ciphertext; +use fhe_traits::{DeserializeParametrized, Serialize}; + +/// Implementation of the CiphertextProcessor function +pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { + // Decode the FHE parameters + let params = decode_bfv_params_arc(&fhe_inputs.params); + + // Start with zero (encrypted) + let mut sum = Ciphertext::zero(¶ms); + + // Add each encrypted input to the sum + for ciphertext_bytes in &fhe_inputs.ciphertexts { + let ciphertext = Ciphertext::from_bytes(&ciphertext_bytes.0, ¶ms).unwrap(); + sum += &ciphertext; // Homomorphic addition + } + + // Return the encrypted result + sum.to_bytes() +} +``` + +### Key Concepts: + +- **`FHEInputs`**: Contains encrypted data and parameters +- **`Ciphertext`**: Encrypted values that can be computed on +- **Homomorphic operations**: `+=` works on encrypted data +- **No decryption**: We never see the actual values + +## Step 3: Modifying the Computation + +Let's create a more interesting computation. Replace the content of `./program/src/lib.rs`: + +```rust +use e3_bfv_helpers::decode_bfv_params_arc; +use e3_compute_provider::FHEInputs; +use fhe_rs::bfv::Ciphertext; +use fhe_traits::{DeserializeParametrized, Serialize}; + +/// Compute: (a + b) * 2 +pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { + let params = decode_bfv_params_arc(&fhe_inputs.params); + + // Get the two input ciphertexts + if fhe_inputs.ciphertexts.len() != 2 { + panic!("Expected exactly 2 inputs"); + } + + let a = Ciphertext::from_bytes(&fhe_inputs.ciphertexts[0].0, ¶ms).unwrap(); + let b = Ciphertext::from_bytes(&fhe_inputs.ciphertexts[1].0, ¶ms).unwrap(); + + // Compute (a + b) * 2 homomorphically + let sum = &a + &b; // Add encrypted numbers + let double = &sum + ∑ // Multiply by 2 (via addition) + + double.to_bytes() +} +``` + +## Step 4: Understanding the Configuration + +The `enclave.config.yaml` file configures your development environment: + +```yaml +chains: + - name: "hardhat" + rpc_url: "ws://localhost:8545" + contracts: + e3_program: "0x9A676e781A523b5d0C0e43731313A708CB607508" + # ... other contract addresses + +nodes: + cn1: # Ciphernode 1 + address: "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" + quic_port: 9201 + autonetkey: true + autopassword: true + # ... more nodes +``` + +### Key Components: + +- **Chains**: Blockchain networks your E3 program uses +- **Contracts**: Deployed smart contract addresses +- **Nodes**: Ciphernodes that coordinate the E3 process + +## Step 5: Build and Test + +Compile your modified program: + +```bash +enclave program compile +``` + +Start the development environment: + +```bash +pnpm dev:all +``` + +## Step 6: Understanding the Client + +The client application (in `./client/`) handles: + +1. **Encryption**: User inputs → encrypted ciphertexts +2. **Submission**: Publish encrypted data to the Enclave contract +3. **Result retrieval**: Get the decrypted result from the Enclave contract + +## Step 7: Test Your Program + +1. Open [http://localhost:3000](http://localhost:3000) +2. Enter two numbers (e.g., 5 and 3) +3. Submit the request +4. Watch the result: `(5 + 3) * 2 = 16` + +The computation happened entirely on encrypted data! + +## Step 8: Exploring Further + +Now that you understand the basics, try these modifications: + +### Change the Computation + +```rust +// Compute a² + b² +let a_squared = &a * &a; +let b_squared = &b * &b; +let result = &a_squared + &b_squared; +``` + +### Add More Inputs + +Modify your program to accept 3 or more encrypted inputs. + +### Update the UI + +Customize the client application in `./client/src/` to match your computation. + +Happy building with Enclave! 🚀 + +## Next Steps + +Ready to build more complex E3 programs? Continue with: + +1. [Writing the Secure Process](/write-secure-program) - Advanced FHE programming +2. [Writing the E3 Program Contract](/write-e3-contract) - Smart contract integration +3. [Setting Up the Server](/setting-up-server) - Custom coordination logic diff --git a/docs/pages/installation.mdx b/docs/pages/installation.mdx new file mode 100644 index 0000000000..41fac9e033 --- /dev/null +++ b/docs/pages/installation.mdx @@ -0,0 +1,104 @@ +--- +title: 'Installation' +description: 'Install and set up the Enclave CLI' +--- + +# Installation + +This guide covers how to install the Enclave CLI and get your development environment set up. + +## Prerequisites + +Before installing Enclave, make sure you have the following dependencies: + +- [Rust](https://www.rust-lang.org/tools/install) + +## Quick Install (Recommended) + +The easiest way to install the Enclave CLI is using our installer script: + +```bash +curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +Or if you prefer `wget`: + +```bash +wget -qO- https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +This script will download and install `enclaveup`, which is the standalone installer for the Enclave CLI. + +## Using enclaveup + +Once you have `enclaveup` installed, you can manage your Enclave CLI installation: + +### Install the Enclave CLI + +```bash +# Install to ~/.local/bin (default) +enclaveup install + +# Install to /usr/local/bin (requires sudo) +enclaveup install --system +``` + +Running `enclaveup install` will install the latest version of the Enclave CLI. +See `enclaveup --help` for more options. + +## Manual Installation + +If you prefer to install manually: + +1. Visit the [releases page](https://github.com/gnosisguild/enclave/releases) +2. Download the appropriate binary for your platform: + - Linux: `enclave-linux-x86_64.tar.gz` + - macOS: `enclave-macos-aarch64.tar.gz` +3. Extract the binary and place it in your PATH (e.g., `~/.local/bin` or `/usr/local/bin`) +4. Make sure the binary is executable: `chmod +x enclave` + +## Platform Support + +| Platform | Architecture | Status | +|----------|-------------|---------| +| Linux | x86_64 | ✅ Native binary | +| macOS | Apple Silicon (M1/M2/M3) | ✅ Native binary | +| macOS | Intel | ✅ Via Rosetta 2 | + +*Note: Intel Macs automatically run Apple Silicon binaries through Rosetta 2 translation.* + + +### Building from Source + +If you need to build `enclave` from source: +1. Ensure you have Rust installed (using [rustup](https://rustup.rs/)) +2. Clone the repository + +```bash +git clone https://github.com/gnosisguild/enclave.git +cd enclave +``` + +3. Build the binary + +```bash +cargo install --path ./crates/cli --bin enclave -f +``` + +## Verify Installation + +After installation, verify that the Enclave CLI is working correctly: + +```bash +enclave --help +``` + +You should see the help information for the Enclave CLI. + +## Next Steps + +Once you have the Enclave CLI installed, you're ready to: + +1. [Run your first E3 program](/quick-start) +2. [Learn about E3 concepts](/what-is-e3) +3. [Explore the architecture](/architecture-overview) \ No newline at end of file diff --git a/docs/pages/putting-it-together.mdx b/docs/pages/putting-it-together.mdx index 39b476a19a..38bf69ceb7 100644 --- a/docs/pages/putting-it-together.mdx +++ b/docs/pages/putting-it-together.mdx @@ -195,8 +195,8 @@ By following this guide, you should now have a solid understanding of Enclave an ## Additional Resources - **Enclave GitHub Repository**: [https://github.com/gnosisguild/enclave](https://github.com/gnosisguild/enclave) -- **CRISP GitHub Repository**: [https://github.com/gnosisguild/crisp](https://github.com/gnosisguild/crisp) -- **Enclave Starter Template**: [https://github.com/gnosisguild/enclave-starter-template](https://github.com/gnosisguild/enclave-starter-template) +- **CRISP GitHub Repository**: [https://github.com/gnosisguild/enclave](https://github.com/gnosisguild/enclave/tree/main/examples/CRISP) +- **Enclave Quick Start**: [Quick Start](/quick-start) - **RISC Zero Documentation**: [https://www.risczero.com](https://www.risczero.com) - **Compute Provider Package**: Check the Enclave repository for the Compute Provider package and examples. - **FHE Libraries**: Explore libraries like `fhe.rs` for Rust to handle homomorphic encryption. diff --git a/docs/pages/quick-start.mdx b/docs/pages/quick-start.mdx new file mode 100644 index 0000000000..2c8941bd41 --- /dev/null +++ b/docs/pages/quick-start.mdx @@ -0,0 +1,106 @@ +--- +title: 'Quick Start' +description: 'Get up and running with your first E3 program' +--- + +# Quick Start + +Get your first E3 program running on the Enclave Protocol! This guide assumes you have the [Enclave CLI installed](/installation). + +## Prerequisites Check + +Make sure you have the required software installed: + +```bash +# Check versions +docker --version # Should be 25.0.6+ +node --version # Should be 22.10.0+ +pnpm --version # Should be 10.7.1+ +rustc --version # Should be 1.85.1+ +enclave --version # Confirm CLI is installed +``` + +## 1. Create Your Project + +Generate a new E3 program from the default template: + +```bash +enclave init my-first-e3 +cd my-first-e3 +``` + +This creates a complete E3 project with: +- **FHE computation logic** (`./program/`) +- **Smart contracts** (`./contracts/`) +- **Client application** (`./client/`) +- **Coordination server** (`./server/`) +- **Configuration** (`enclave.config.yaml`) + +## 2. Compile Your E3 Program + +First, compile your E3 program to build the Risc0 zkvm image: + +```bash +enclave program compile +``` + +This builds the Risc0 zkvm image that will be deployed on the blockchain and used for verification of the final proof. + +## 3. Start the Development Environment + +Launch all services with one command: + +```bash +pnpm dev:all +``` + +This starts: +- Local Ethereum network (Hardhat) +- Deploys all the smart contracts to the local network +- Multiple ciphernodes for FHE processing +- TypeScript coordination server +- FHE program server +- Frontend client application + +**Wait for all services to start** (usually 30-60 seconds). + +## 4. Access Your Application + +1. Open your browser to [http://localhost:3000](http://localhost:3000) +2. Configure MetaMask for local development: + - Network: `http://localhost:8545` + - Chain ID: `31337` + +## 5. Test the FHE Computation + +The default template includes a simple addition program that: + +1. **Encrypts** two numbers on the client +2. **Computes** their sum using FHE (without decrypting) +3. **Returns** the encrypted result +4. **Decrypts** and displays the result + +Try it: +- Input two numbers in the web interface +- Click "Submit" +- Watch the encrypted computation happen! + +## What Just Happened? + +You successfully ran a **Fully Homomorphic Encryption** computation where: + +- Your inputs were encrypted before leaving the browser +- The computation happened on encrypted data +- The result was computed without exposing your private inputs +- All coordination was handled by the Enclave protocol + +## Next Steps + +Now that you have a working E3 program: + +1. **Explore the code**: Check out `./program/src/lib.rs` to see the FHE computation +2. **Modify the computation**: Try changing the addition to multiplication +3. **Update the UI**: Customize the client in `./client/src/` +4. **Deploy**: Learn about production deployment + +Ready to dive deeper? Continue with our [Hello World Tutorial](/hello-world-tutorial) for a step-by-step breakdown of building E3 programs from scratch. \ No newline at end of file diff --git a/docs/pages/setting-up-server.mdx b/docs/pages/setting-up-server.mdx index 8ad7f423af..907c61be50 100644 --- a/docs/pages/setting-up-server.mdx +++ b/docs/pages/setting-up-server.mdx @@ -1,89 +1,361 @@ --- -title: 'Setting Up An E3 Nudging Server' -description: '' +title: 'Setting Up the Client and Server' +description: 'Build client applications and coordination servers using the Enclave SDK' --- -# Setting Up an E3 Nudging Server +# Setting Up the Client and Server -The end-to-end flow of an Encrypted Execution Environment (E3) involves multiple phases, each of which can be nudged along by anyone. However, to reduce delays and ensure a smooth progression of processes in your application, running a dedicated **E3 Nudging Server** can greatly enhance reliability and quality of service. While the protocol itself is decentralized and open to all, application developers are encouraged to manage this infrastructure for a more seamless experience. +Building E3 applications involves creating client-side interfaces for users and coordination logic for managing the E3 lifecycle. The Enclave SDK provides powerful TypeScript and React tools to streamline this development process. -## **What is an E3 Nudging Server?** +## Overview -An **E3 Nudging Server** is a process designed to ensure the seamless progression of the Enclave protocol. While any party can theoretically nudge an E3 forward, certain critical operations require dependable infratructure for efficient execution, such as: +Modern E3 applications typically consist of: -1. Event Monitoring: Listening for blockchain events. -2. Input Aggregation: Collecting and managing inputs for computations. -3. Computation Triggers: Running secure processes in a zkVM or similar environments. -4. Result Publication: Verifying and submitting outputs to the Enclave smart contracts. +1. **Client Application**: User interface with wallet integration and FHE encryption +2. **Coordination Logic**: Server-side or client-side coordination of E3 processes +3. **Event Management**: Real-time monitoring of E3 lifecycle events +4. **Contract Interactions**: Type-safe smart contract communication -By providing an automated and secure solution, the E3 Nudging Server reduces manual overhead for developers, ensures process continuity, and minimizes delays. +The Enclave SDK handles much of this complexity for you, providing: +- Type-safe contract interactions +- Real-time event listening +- React hooks for easy frontend integration +- Comprehensive error handling -### **Why Use an E3 Nudging Server?** +## Setting Up a Client Application -Enclave relies on external actions to progress through its phases. Without an E3 Nudging Serverr, the following challenges may arise: +### Install the SDK -- Missed Protocol Events: Key actions like **Key Publish** or **Input Publish** might go unnoticed, stalling the process. -- Increased Developer Overhead: Manual event handling and protocol nudging require custom infrastructure. -- Reduced Reliability: Disruptions in protocol execution can lead to delays or errors, impacting user trust. +For TypeScript/JavaScript applications: -The E3 Nudging Server ensures: +```bash +pnpm add @gnosis-guild/enclave +``` -- Seamless event handling and input collection. -- Reliable computation triggers in secure environments (e.g., zkVM). -- Automatic publication of verified results to maintain decentralized integrity +For React applications: -## **Building on Enclave with the Starter Template** +```bash +pnpm add @gnosis-guild/enclave @gnosis-guild/enclave-react +``` -To simplify development, the **Enclave Starter Template** provides a pre-built foundation for developers to interact with the -protocol, write secure zkVM-based computations, and deploy reliable infrastructure. Template features: +### Basic TypeScript Client -1. **Server Implementation**: An E3 Nudging Server for automating protocol progression. -2. **zkVM Framework**: Based on - [RISC Zero Foundry Template](https://github.com/risc0/risc0-foundry-template), enabling secure, verifiable off-chain computations. +Create a type-safe client that can interact with Enclave contracts: -### **How to Use the Starter Template** +```typescript +import { EnclaveSDK, EnclaveEventType } from "@gnosis-guild/enclave/sdk"; +import { createPublicClient, createWalletClient, http, custom } from "viem"; -#### **1. Setting Up the Server** +// Initialize clients +const publicClient = createPublicClient({ + transport: http("http://localhost:8545"), // Your RPC URL +}); -The E3 Nudging Server ensures the protocol progresses by listening for events, gathering inputs, and triggering the next steps. +const walletClient = createWalletClient({ + transport: custom(window.ethereum), +}); -- Clone and build the server: +// Create SDK instance +const sdk = new EnclaveSDK({ + publicClient, + walletClient, + contracts: { + enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + }, + chainId: 31337, // Hardhat local network +}); - ```bash - git clone https://github.com/gnosisguild/enclave-starter-template.git - cd packages/server - cargo build - ``` +// Initialize the SDK +await sdk.initialize(); -- Implement custom logic if necessary: - - Event handlers can be extended to perform application-specific tasks. - - Routes and models can be customized to match your application's requirements. +// Request a new E3 computation +const hash = await sdk.requestE3({ + filter: "0x0000000000000000000000000000000000000000", + threshold: [2, 3], + startWindow: [BigInt(0), BigInt(100)], + duration: BigInt(3600), + e3Program: "0x9A676e781A523b5d0C0e43731313A708CB607508", + e3ProgramParams: "0x", + computeProviderParams: "0x", +}); -#### **2. Writing E3 Programs** +console.log("E3 requested with hash:", hash); +``` -The E3 Nudging Server interacts with the E3 Program (zkVM logic) to securely process inputs and publish -verified outputs. Refer to the [**Building an E3 Program**](./write-secure-program.mdx) section of -the documentation for detailed instructions on: +### React Application with Hooks -- Writing the Secure Process logic. -- Implementing guest programs. -- Deploying the associated smart contracts. +For React applications, use the `useEnclaveSDK` hook for seamless integration: -> **Note:** The zkVM framework follows the -> [RISC Zero Foundry Template](https://github.com/risc0/risc0-foundry-template). Developers can use -> the guide linked above to understand the nuances of RISC Zero development. +```typescript +import React, { useEffect, useState } from 'react'; +import { useEnclaveSDK } from '@gnosis-guild/enclave-react'; -#### **3. Configuring the Protocol Interaction** +function E3Dashboard() { + const [e3Data, setE3Data] = useState(null); + + const { + sdk, + isInitialized, + error, + requestE3, + onEnclaveEvent, + off, + EnclaveEventType + } = useEnclaveSDK({ + autoConnect: true, + contracts: { + enclave: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + ciphernodeRegistry: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' + }, + chainId: 31337 + }); -Use the E3 Nudging Server to automate protocol nudging by: + // Listen to E3 events + useEffect(() => { + if (!isInitialized) return; -- Monitoring events such as **Key Publish** or **E3 Round Activiation**. -- Managing custom blockchain interaction logic under the `blockchain` directory. + const handleE3Requested = (event) => { + console.log('New E3 request:', event.data); + setE3Data(event.data); + }; -#### **4. Deploying Smart Contracts** + const handleE3Activated = (event) => { + console.log('E3 activated:', event.data); + }; -The E3 Nudging Server publishes computation results to the blockchain using smart contracts. Use the template's pre-built -contracts as a starting point: + onEnclaveEvent(EnclaveEventType.E3_REQUESTED, handleE3Requested); + onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3Activated); -- `CRISPRisc0.sol`: Verifies zkVM proofs and updates the state. -- Extend or modify contracts as needed to fit your application's logic. + return () => { + off(EnclaveEventType.E3_REQUESTED, handleE3Requested); + off(EnclaveEventType.E3_ACTIVATED, handleE3Activated); + }; + }, [isInitialized, onEnclaveEvent, off, EnclaveEventType]); + + const handleRequestE3 = async () => { + try { + const hash = await requestE3({ + filter: '0x0000000000000000000000000000000000000000', + threshold: [2, 3], + startWindow: [BigInt(Date.now()), BigInt(Date.now() + 300000)], + duration: BigInt(1800), + e3Program: '0x9A676e781A523b5d0C0e43731313A708CB607508', + e3ProgramParams: '0x', + computeProviderParams: '0x', + }); + console.log('E3 requested:', hash); + } catch (error) { + console.error('Failed to request E3:', error); + } + }; + + if (error) { + return

; + } + + if (!isInitialized) { + return
Connecting to Enclave...
; + } + + return ( +
+

E3 Dashboard

+ + {e3Data && ( +
+

Latest E3 Request

+
{JSON.stringify(e3Data, null, 2)}
+
+ )} +
+ ); +} + +export default E3Dashboard; +``` + +## Event-Driven Architecture + +The SDK provides comprehensive event handling for the entire E3 lifecycle: + +### Enclave Events + +```typescript +// Listen to key E3 lifecycle events +sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, (event) => { + console.log("New E3 computation requested:", event.data); +}); + +sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, (event) => { + console.log("E3 environment activated:", event.data); +}); + +sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, (event) => { + console.log("Input data published:", event.data); +}); + +sdk.onEnclaveEvent(EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED, (event) => { + console.log("Computation result available:", event.data); +}); +``` + +### Registry Events + +```typescript +import { RegistryEventType } from '@gnosis-guild/enclave/sdk'; + +// Monitor ciphernode network changes +sdk.onEnclaveEvent(RegistryEventType.CIPHERNODE_ADDED, (event) => { + console.log("New ciphernode joined:", event.data); +}); + +sdk.onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, (event) => { + console.log("Committee selection complete:", event.data); +}); +``` + +## Server-Side Coordination + +For server-side applications, you can create automated coordination services: + +```typescript +import { EnclaveSDK } from "@gnosis-guild/enclave/sdk"; +import { createPublicClient, createWalletClient, http } from "viem"; +import { privateKeyToAccount } from "viem/accounts"; + +class E3CoordinationServer { + private sdk: EnclaveSDK; + + constructor(privateKey: string, rpcUrl: string) { + const account = privateKeyToAccount(privateKey as `0x${string}`); + + const publicClient = createPublicClient({ + transport: http(rpcUrl), + }); + + const walletClient = createWalletClient({ + account, + transport: http(rpcUrl), + }); + + this.sdk = new EnclaveSDK({ + publicClient, + walletClient, + contracts: { + enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + }, + }); + } + + async start() { + await this.sdk.initialize(); + this.setupEventListeners(); + console.log("E3 Coordination Server started"); + } + + private setupEventListeners() { + // Auto-activate E3s when they become available + this.sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, async (event) => { + const { e3Id } = event.data; + console.log(`Auto-activating E3 ${e3Id}`); + + try { + // In a real implementation, you'd generate/retrieve the public key + const publicKey = "0x..."; // Your FHE public key + await this.sdk.activateE3(e3Id, publicKey); + } catch (error) { + console.error(`Failed to activate E3 ${e3Id}:`, error); + } + }); + + // Handle input aggregation + this.sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, async (event) => { + console.log("Input published:", event.data); + // Implement your input aggregation logic here + }); + } + + async stop() { + this.sdk.cleanup(); + console.log("E3 Coordination Server stopped"); + } +} + +// Usage +const server = new E3CoordinationServer( + process.env.PRIVATE_KEY!, + process.env.RPC_URL! +); + +server.start(); +``` + +## Error Handling + +The SDK includes comprehensive error handling: + +```typescript +import { SDKError } from "@gnosis-guild/enclave/sdk"; + +try { + await sdk.requestE3(params); +} catch (error) { + if (error instanceof SDKError) { + console.error(`SDK Error (${error.code}): ${error.message}`); + + switch (error.code) { + case "MISSING_PUBLIC_CLIENT": + // Handle missing client + break; + case "INVALID_ADDRESS": + // Handle invalid contract address + break; + case "TRANSACTION_FAILED": + // Handle transaction failure + break; + default: + console.error("Unknown SDK error:", error); + } + } else { + console.error("Unexpected error:", error); + } +} +``` + +## Configuration Management + +### Development Configuration + +For local development with the default template: + +```typescript +const devConfig = { + contracts: { + enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + }, + chainId: 31337, + rpcUrl: "http://localhost:8545", +}; +``` + +### Production Configuration + +For production deployments: + +```typescript +const prodConfig = { + contracts: { + enclave: process.env.ENCLAVE_CONTRACT_ADDRESS!, + ciphernodeRegistry: process.env.REGISTRY_CONTRACT_ADDRESS!, + }, + chainId: 1, // Mainnet + rpcUrl: process.env.RPC_URL!, +}; +``` + +The Enclave SDK abstracts away much of the complexity, allowing you to focus on your application's unique business logic while ensuring robust, type-safe interaction with the Enclave protocol. diff --git a/docs/public/crisp-overview-light.png b/docs/public/crisp-overview-light.png deleted file mode 100644 index 2b0097dcf935b20593e6b9b53bf2dcfceaa3c0b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242648 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 Mnvmd9d_wA;&>e!zh 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�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 diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index 9014b34388..60f7ee83d4 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -40,8 +40,8 @@ "@nomicfoundation/hardhat-verify": "^2.0.0", "@nomicfoundation/ignition-core": "^0.15.5", "@playwright/test": "1.52.0", - "playwright": "1.52.0", "@synthetixio/synpress": "^4.1.0", + "@synthetixio/synpress-cache": "^0.0.12", "@typechain/ethers-v6": "^0.5.0", "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", @@ -50,6 +50,7 @@ "hardhat": "^2.22.10", "hardhat-deploy": "^0.12.4", "hardhat-gas-reporter": "^1.0.8", + "playwright": "1.52.0", "solidity-coverage": "^0.8.1", "ts-node": "^10.9.2", "typechain": "^8.3.0", diff --git a/examples/CRISP/playwright.config.ts b/examples/CRISP/playwright.config.ts index 66f8642847..85b252f894 100644 --- a/examples/CRISP/playwright.config.ts +++ b/examples/CRISP/playwright.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ timeout: 5 * 60 * 1000, use: { baseURL: "http://localhost:3000", + actionTimeout: 60 * 1000, }, retries: process.env.CI ? 2 : 0, fullyParallel: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e05286ddb..c188a7c4a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,10 +75,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 version: 1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -87,13 +87,13 @@ importers: version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(cb16358cc88a50382973a3462bc448f8) + version: 5.0.0(21c4d7a5429e39aca71bda0cc08815c6) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -105,13 +105,16 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/synpress-cache': + specifier: ^0.0.12 + version: 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -469,7 +472,7 @@ importers: version: 5.3.0 '@risc0/ethereum': specifier: file:lib/risc0-ethereum - version: risc0-ethereum@file:templates/default/lib/risc0-ethereum + version: file:templates/default/lib/risc0-ethereum '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) @@ -2703,6 +2706,9 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': + resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} + '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} @@ -7688,9 +7694,6 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - risc0-ethereum@file:templates/default/lib/risc0-ethereum: - resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} - rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -10035,10 +10038,11 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -11241,40 +11245,42 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.0 '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -11284,11 +11290,12 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': @@ -11357,19 +11364,20 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(cb16358cc88a50382973a3462bc448f8)': + '@nomicfoundation/hardhat-toolbox@5.0.0(21c4d7a5429e39aca71bda0cc08815c6)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.7.5 chai: 4.5.0 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -11751,6 +11759,8 @@ snapshots: - utf-8-validate - zod + '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} + '@rolldown/pluginutils@1.0.0-beta.9': {} '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': @@ -12193,9 +12203,9 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 @@ -12278,10 +12288,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -12364,6 +12374,14 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + dependencies: + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -12372,19 +12390,20 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': @@ -18529,8 +18548,6 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 - risc0-ethereum@file:templates/default/lib/risc0-ethereum: {} - rlp@2.2.7: dependencies: bn.js: 5.2.2 From b576eb791900be8e9aa6bedbbcb8b2ef3ded3fd5 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 24 Jun 2025 20:52:54 +0500 Subject: [PATCH 098/106] enforce 9-character Git SHA in build script (#553) --- .github/workflows/support-docker.yml | 4 ++-- crates/cli/build.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/support-docker.yml b/.github/workflows/support-docker.yml index a504e9f42b..c78a6081a7 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/support-docker.yml @@ -26,11 +26,11 @@ jobs: - name: Generate version tag id: version run: | - echo "version=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT + echo "version=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - name: Generate tags id: tags run: | - VERSION=$(git rev-parse --short=7 HEAD) + VERSION=$(git rev-parse --short=9 HEAD) TAGS="${{ env.IMAGE_NAME }}:$VERSION" if [ "${{ github.ref }}" = "refs/heads/main" ]; then TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" diff --git a/crates/cli/build.rs b/crates/cli/build.rs index 5df4faa153..de4c6cde3f 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -3,7 +3,7 @@ use std::process::Command; fn main() { // Try to get local git SHA first let output = Command::new("git") - .args(&["rev-parse", "--short", "HEAD"]) + .args(&["rev-parse", "--short=9", "HEAD"]) .output(); let git_sha = match output { @@ -42,7 +42,7 @@ fn get_remote_commit_hash() -> Option { .split_whitespace() .next()? .chars() - .take(7) + .take(9) .collect::(); if commit_hash.is_empty() { From 78a1c07e30843645df93038fd0486456209fec2f Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Fri, 27 Jun 2025 13:52:21 +0500 Subject: [PATCH 099/106] Switch to Semaphore Noir (#557) Update Dockerfile Add Missing Packages Use Correct Addresses --- .github/workflows/crisp-e2e.yaml | 1 + examples/CRISP/Dockerfile | 3 +- examples/CRISP/apps/client/.env.example | 4 +- examples/CRISP/apps/client/package.json | 6 +- .../client/src/hooks/voting/useVoteCasting.ts | 6 +- .../apps/client/src/utils/proof-encoding.ts | 28 +- examples/CRISP/apps/server/.env.example | 2 +- examples/CRISP/contracts/CRISPChecker.sol | 6 +- examples/CRISP/contracts/CRISPPolicy.sol | 6 +- examples/CRISP/contracts/CRISPProgram.sol | 2 +- examples/CRISP/deploy/Deploy.s.sol | 14 +- examples/CRISP/package.json | 4 +- pnpm-lock.yaml | 3219 ++++++++++------- 13 files changed, 1882 insertions(+), 1419 deletions(-) diff --git a/.github/workflows/crisp-e2e.yaml b/.github/workflows/crisp-e2e.yaml index 1d9e70ff74..f961b1a140 100644 --- a/.github/workflows/crisp-e2e.yaml +++ b/.github/workflows/crisp-e2e.yaml @@ -18,6 +18,7 @@ jobs: - name: Remove unnecessary files run: | sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Set environment variables for Docker Compose diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index 7b0b86137e..493eceeaed 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -47,7 +47,8 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ | sh -s -- -y --default-toolchain ${RUST_VERSION} ENV PATH="/home/${USERNAME}/.cargo/bin:${PATH}" RUN rustup component add rustfmt clippy - +ENV RUSTFLAGS="-C debuginfo=0 -C strip=symbols" \ + CARGO_TERM_COLOR=always # ──────────────────────────────────────────────────────────────────────────────── # Foundry # ──────────────────────────────────────────────────────────────────────────────── diff --git a/examples/CRISP/apps/client/.env.example b/examples/CRISP/apps/client/.env.example index 22a485a7a3..75c76f98fd 100644 --- a/examples/CRISP/apps/client/.env.example +++ b/examples/CRISP/apps/client/.env.example @@ -1,7 +1,7 @@ VITE_ENCLAVE_API=http://127.0.0.1:4000 VITE_TWITTER_SERVERLESS_API= VITE_WALLETCONNECT_PROJECT_ID= -VITE_E3_PROGRAM_ADDRESS=0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE # Default E3 program address from anvil -VITE_SEMAPHORE_ADDRESS=0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0 +VITE_E3_PROGRAM_ADDRESS=0xc6e7DF5E7b4f2A278906862b61205850344D4e7d # Default E3 program address from anvil +VITE_SEMAPHORE_ADDRESS=0x0B306BF915C4d645ff596e518fAf3F9669b97016 diff --git a/examples/CRISP/apps/client/package.json b/examples/CRISP/apps/client/package.json index 859f486098..cf3b9ff4d8 100644 --- a/examples/CRISP/apps/client/package.json +++ b/examples/CRISP/apps/client/package.json @@ -20,9 +20,11 @@ "@aztec/bb.js": "^0.82.2", "@emotion/babel-plugin": "^11.11.0", "@emotion/react": "^11.11.4", + "@noir-lang/acvm_js": "1.0.0-beta.3", "@noir-lang/noir_js": "1.0.0-beta.3", + "@noir-lang/noirc_abi": "1.0.0-beta.3", "@phosphor-icons/react": "^2.1.4", - "@semaphore-protocol/core": "^4.9.2", + "@semaphore-protocol/core": "github:hmzakhalid/semaphore-noir#dist-core", "@semaphore-protocol/data": "^4.9.2", "@svgr/rollup": "^8.1.0", "@tanstack/react-query": "^5.74.3", @@ -62,4 +64,4 @@ "vite-plugin-wasm": "^3.3.0" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" -} +} \ No newline at end of file diff --git a/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts index cf7dfa1db9..e729d00cf1 100644 --- a/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/apps/client/src/hooks/voting/useVoteCasting.ts @@ -4,7 +4,7 @@ import { useVoteManagementContext } from '@/context/voteManagement'; import { useNotificationAlertContext } from '@/context/NotificationAlert/NotificationAlert.context.tsx'; import { Poll } from '@/model/poll.model'; import { BroadcastVoteRequest } from '@/model/vote.model'; -import { Group, generateProof, SemaphoreProof } from '@semaphore-protocol/core'; +import { Group, generateNoirProof, SemaphoreNoirProof, initSemaphoreNoirBackend } from '@semaphore-protocol/core'; import { encodeSemaphoreProof } from '@/utils/proof-encoding'; export const useVoteCasting = () => { @@ -67,7 +67,9 @@ export const useVoteCasting = () => { const group = new Group(currentGroupMembers); const scope = String(roundState.id); const message = String(pollSelected.value); - const fullProof: SemaphoreProof = await generateProof(semaphoreIdentity, group, message, scope); + const merkleTreeDepth = 10; + const noirBackend = await initSemaphoreNoirBackend(merkleTreeDepth); + const fullProof: SemaphoreNoirProof = await generateNoirProof(semaphoreIdentity, group, message, scope, noirBackend, true); console.log("Full generated proof object:", fullProof); const proofBytes = encodeSemaphoreProof(fullProof); diff --git a/examples/CRISP/apps/client/src/utils/proof-encoding.ts b/examples/CRISP/apps/client/src/utils/proof-encoding.ts index 4f2a0e779e..f05d0b271d 100644 --- a/examples/CRISP/apps/client/src/utils/proof-encoding.ts +++ b/examples/CRISP/apps/client/src/utils/proof-encoding.ts @@ -1,26 +1,22 @@ -import { hexToBytes, encodeAbiParameters, parseAbiParameters } from 'viem'; -import { type SemaphoreProof } from '@semaphore-protocol/core'; +import { hexToBytes, encodeAbiParameters, parseAbiParameters, bytesToHex } from 'viem'; +import { type SemaphoreNoirProof } from '@semaphore-protocol/core'; const abi = parseAbiParameters( - 'uint256,uint256,uint256,uint256,uint256,uint256[8]' + '(uint256,uint256,uint256,uint256,uint256,bytes)' ); -type Tuple8 = readonly [T, T, T, T, T, T, T, T]; - export function encodeSemaphoreProof( - { merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, points }: SemaphoreProof + { merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, proofBytes }: SemaphoreNoirProof ): Uint8Array { - if (points.length !== 8) { - throw new Error('Semaphore proof must have 8 points'); - } - const hex = encodeAbiParameters(abi, [ - BigInt(merkleTreeDepth), - BigInt(merkleTreeRoot), - BigInt(nullifier), - BigInt(message), - BigInt(scope), - points.map(BigInt) as unknown as Tuple8, + [ + BigInt(merkleTreeDepth), + BigInt(merkleTreeRoot), + BigInt(nullifier), + BigInt(message), + BigInt(scope), + bytesToHex(proofBytes), + ] ]); return hexToBytes(hex); diff --git a/examples/CRISP/apps/server/.env.example b/examples/CRISP/apps/server/.env.example index 49c725d46a..1166578dd8 100644 --- a/examples/CRISP/apps/server/.env.example +++ b/examples/CRISP/apps/server/.env.example @@ -12,7 +12,7 @@ CRON_API_KEY=1234567890 ENCLAVE_ADDRESS="0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" CIPHERNODE_REGISTRY_ADDRESS="0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" NAIVE_REGISTRY_FILTER_ADDRESS="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" -E3_PROGRAM_ADDRESS="0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE" # CRISPProgram Contract Address +E3_PROGRAM_ADDRESS="0xc6e7DF5E7b4f2A278906862b61205850344D4e7d" # CRISPProgram Contract Address # E3 Config E3_WINDOW_SIZE=40 diff --git a/examples/CRISP/contracts/CRISPChecker.sol b/examples/CRISP/contracts/CRISPChecker.sol index e1a368f261..56712236be 100644 --- a/examples/CRISP/contracts/CRISPChecker.sol +++ b/examples/CRISP/contracts/CRISPChecker.sol @@ -2,7 +2,7 @@ pragma solidity >=0.8.27; import {BaseChecker} from "@excubiae/contracts/checker/BaseChecker.sol"; -import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphore.sol"; +import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphoreNoir.sol"; /// @title CRISPChecker. /// @notice Enclave Input Validator @@ -45,9 +45,9 @@ contract CRISPChecker is BaseChecker { ) internal view override returns (bool) { super._check(subject, evidence); - ISemaphore.SemaphoreProof memory proof = abi.decode( + ISemaphore.SemaphoreNoirProof memory proof = abi.decode( evidence, - (ISemaphore.SemaphoreProof) + (ISemaphore.SemaphoreNoirProof) ); // The proof scope encodes both the subject address and group ID to prevent front-running attacks. diff --git a/examples/CRISP/contracts/CRISPPolicy.sol b/examples/CRISP/contracts/CRISPPolicy.sol index 3db670489b..27e80d050e 100644 --- a/examples/CRISP/contracts/CRISPPolicy.sol +++ b/examples/CRISP/contracts/CRISPPolicy.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.27; import {BasePolicy} from "@excubiae/contracts/policy/BasePolicy.sol"; import {BaseChecker} from "@excubiae/contracts/checker/BaseChecker.sol"; -import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphore.sol"; +import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphoreNoir.sol"; /// @title CRISPPolicy /// @notice Policy contract for validating inputs based on Semaphore proofs and usage limits. @@ -36,9 +36,9 @@ contract CRISPPolicy is BasePolicy { address subject, bytes calldata evidence ) internal override(BasePolicy) onlyTarget { - ISemaphore.SemaphoreProof memory proof = abi.decode( + ISemaphore.SemaphoreNoirProof memory proof = abi.decode( evidence, - (ISemaphore.SemaphoreProof) + (ISemaphore.SemaphoreNoirProof) ); uint256 n = proof.nullifier; if (spentNullifiers[n]) revert AlreadyEnforced(); diff --git a/examples/CRISP/contracts/CRISPProgram.sol b/examples/CRISP/contracts/CRISPProgram.sol index cc321fccde..93abd60385 100644 --- a/examples/CRISP/contracts/CRISPProgram.sol +++ b/examples/CRISP/contracts/CRISPProgram.sol @@ -7,7 +7,7 @@ import {IE3Program} from "@gnosis-guild/enclave/contracts/interfaces/IE3Program. import {IBasePolicy} from "@excubiae/contracts/interfaces/IBasePolicy.sol"; import {IInputValidator} from "@gnosis-guild/enclave/contracts/interfaces/IInputValidator.sol"; import {IEnclave} from "@gnosis-guild/enclave/contracts/interfaces/IEnclave.sol"; -import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphore.sol"; +import {ISemaphore} from "@semaphore-protocol/contracts/interfaces/ISemaphoreNoir.sol"; import {CRISPCheckerFactory} from "./CRISPCheckerFactory.sol"; import {CRISPPolicyFactory} from "./CRISPPolicyFactory.sol"; import {CRISPInputValidatorFactory} from "./CRISPInputValidatorFactory.sol"; diff --git a/examples/CRISP/deploy/Deploy.s.sol b/examples/CRISP/deploy/Deploy.s.sol index 13b194837d..d858972074 100644 --- a/examples/CRISP/deploy/Deploy.s.sol +++ b/examples/CRISP/deploy/Deploy.s.sol @@ -27,9 +27,9 @@ import {CRISPPolicy} from "../contracts/CRISPPolicy.sol"; import {CRISPChecker} from "../contracts/CRISPChecker.sol"; import {IE3Program} from "@gnosis-guild/enclave/contracts/interfaces/IE3Program.sol"; import {IEnclave} from "@gnosis-guild/enclave/contracts/interfaces/IEnclave.sol"; -import {Semaphore} from "@semaphore-protocol/contracts/Semaphore.sol"; -import {SemaphoreVerifier} from "@semaphore-protocol/contracts/base/SemaphoreVerifier.sol"; -import {ISemaphoreVerifier} from "@semaphore-protocol/contracts/interfaces/ISemaphoreVerifier.sol"; +import {SemaphoreNoir} from "@semaphore-protocol/contracts/SemaphoreNoir.sol"; +import {SemaphoreNoirVerifier} from "@semaphore-protocol/contracts/base/SemaphoreNoirVerifier.sol"; +import {IVerifier} from "@semaphore-protocol/contracts/interfaces/ISemaphoreNoirVerifier.sol"; import {CRISPCheckerFactory} from "../contracts/CRISPCheckerFactory.sol"; import {CRISPPolicyFactory} from "../contracts/CRISPPolicyFactory.sol"; import {CRISPInputValidatorFactory} from "../contracts/CRISPInputValidatorFactory.sol"; @@ -159,14 +159,14 @@ contract CRISPProgramDeploy is Script { console2.log("Enclave Address: ", address(enclave)); console2.log("Verifier Address: ", address(verifier)); - SemaphoreVerifier semaphoreVerifier = new SemaphoreVerifier(); + SemaphoreNoirVerifier semaphoreVerifier = new SemaphoreNoirVerifier(); console2.log( - "Deployed SemaphoreVerifier to", + "Deployed SemaphoreNoirVerifier to", address(semaphoreVerifier) ); - Semaphore semaphore = new Semaphore( - ISemaphoreVerifier(address(semaphoreVerifier)) + SemaphoreNoir semaphore = new SemaphoreNoir( + IVerifier(address(semaphoreVerifier)) ); console2.log("Deployed Semaphore to", address(semaphore)); diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index 60f7ee83d4..a63ef62a38 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -24,7 +24,7 @@ "dependencies": { "@excubiae/contracts": "^0.4.0", "@gnosis-guild/enclave": "workspace:*", - "@semaphore-protocol/contracts": "^4.9.2", + "@semaphore-protocol/contracts": "github:hmzakhalid/semaphore-noir#dist-contracts", "@zk-kit/lean-imt.sol": "2.0.0", "poseidon-solidity": "^0.0.5", "solady": "^0.1.13" @@ -58,4 +58,4 @@ "wait-on": "^8.0.3" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c188a7c4a0..0debef66cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.27.1 - version: 2.29.4 + version: 2.29.5 husky: specifier: ^9.1.7 version: 9.1.7 @@ -19,13 +19,13 @@ importers: dependencies: next: specifier: ^14.2.1 - version: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^2.13.4 - version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: ^2.13.4 - version: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -47,7 +47,7 @@ importers: version: 18.3.7(@types/react@18.3.23) prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.1 typescript: specifier: 5.5.4 version: 5.5.4 @@ -61,8 +61,8 @@ importers: specifier: workspace:* version: link:../../packages/evm '@semaphore-protocol/contracts': - specifier: ^4.9.2 - version: 4.11.1 + specifier: github:hmzakhalid/semaphore-noir#dist-contracts + version: '@semaphore-protocol/contracts-noir@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/9cd8034957a6f66b787639e224e517d9b2a4c972' '@zk-kit/lean-imt.sol': specifier: 2.0.0 version: 2.0.0 @@ -71,50 +71,50 @@ importers: version: 0.0.5 solady: specifier: ^0.1.13 - version: 0.1.19 + version: 0.1.22 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 - version: 1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.1.4(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.5 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(21c4d7a5429e39aca71bda0cc08815c6) + version: 5.0.0(d1a9b5350250b0c212d224a0066f41ff) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.5 - version: 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': specifier: 1.52.0 version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@synthetixio/synpress-cache': specifier: ^0.0.12 - version: 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + version: 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -123,25 +123,25 @@ importers: version: 10.0.10 concurrently: specifier: ^9.1.2 - version: 9.1.2 + version: 9.2.0 hardhat: specifier: ^2.22.10 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.4 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) playwright: specifier: 1.52.0 version: 1.52.0 solidity-coverage: specifier: ^0.8.1 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) @@ -163,33 +163,39 @@ importers: '@emotion/react': specifier: ^11.11.4 version: 11.14.0(@types/react@18.3.23)(react@18.3.1) + '@noir-lang/acvm_js': + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3 '@noir-lang/noir_js': specifier: 1.0.0-beta.3 version: 1.0.0-beta.3 + '@noir-lang/noirc_abi': + specifier: 1.0.0-beta.3 + version: 1.0.0-beta.3 '@phosphor-icons/react': specifier: ^2.1.4 version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semaphore-protocol/core': - specifier: ^4.9.2 - version: 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: github:hmzakhalid/semaphore-noir#dist-core + version: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/caad5529009ebdeb1613c552c4e188a54b681a43(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10) '@semaphore-protocol/data': specifier: ^4.9.2 - version: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@svgr/rollup': specifier: ^8.1.0 - version: 8.1.0(rollup@4.41.1)(typescript@5.8.3) + version: 8.1.0(rollup@4.44.1)(typescript@5.8.3) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.80.5(react@18.3.1) + version: 5.81.2(react@18.3.1) axios: specifier: ^1.6.8 - version: 1.9.0 + version: 1.10.0 connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) ethers: specifier: ^6.12.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) react: specifier: ^18.2.0 version: 18.3.1 @@ -207,23 +213,23 @@ importers: version: 15.6.1(react@18.3.1) viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + version: 0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -241,13 +247,13 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) + version: 4.6.0(vite@5.4.19(@types/node@22.15.33)) add: specifier: ^2.0.6 version: 2.0.6 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.4) + version: 10.4.21(postcss@8.5.6) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -262,22 +268,22 @@ importers: version: 6.3.0 prettier: specifier: ^3.2.5 - version: 3.5.3 + version: 3.6.1 prettier-plugin-tailwindcss: specifier: ^0.5.13 - version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) + version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1))(prettier@3.6.1) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) typescript: specifier: ^5.2.2 version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.19(@types/node@22.7.5) + version: 5.4.19(@types/node@22.15.33) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.19(@types/node@22.15.33)) packages/enclave-react: dependencies: @@ -289,10 +295,10 @@ importers: version: 18.3.1 viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@types/react': specifier: ^18.2.0 @@ -308,26 +314,26 @@ importers: version: 0.4.0 solady: specifier: ^0.1.13 - version: 0.1.19 + version: 0.1.22 viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(8fa82fbb3ce2b604cbb19f7a657031e8) + version: 4.0.0(7701bdab18209f25884c4218d60ddb07) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.3.0 @@ -336,13 +342,13 @@ importers: version: 5.3.0(@openzeppelin/contracts@5.3.0) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 - version: 4.3.0(prettier@3.5.3) + version: 4.3.0(prettier@3.6.1) '@typechain/ethers-v6': specifier: ^0.5.1 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -375,7 +381,7 @@ importers: version: 7.0.3 dotenv: specifier: ^16.4.5 - version: 16.5.0 + version: 16.6.0 eslint: specifier: ^8.56.0 version: 8.57.1 @@ -384,19 +390,19 @@ importers: version: 9.1.0(eslint@8.57.1) ethers: specifier: ^6.9.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: specifier: ^11.2.0 version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -411,10 +417,10 @@ importers: version: 0.0.5 prettier: specifier: ^3.1.1 - version: 3.5.3 + version: 3.6.1 prettier-plugin-solidity: specifier: ^1.2.0 - version: 1.4.3(prettier@3.5.3) + version: 1.4.3(prettier@3.6.1) rimraf: specifier: ^5.0.5 version: 5.0.10 @@ -423,16 +429,16 @@ importers: version: 5.1.0(typescript@5.8.3) solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3) + version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.6.1))(prettier@3.6.1) solidity-coverage: specifier: ^0.8.5 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.3) @@ -454,19 +460,19 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(f71f0ab2085f15302dd226a52112005a) + version: 4.0.0(f317dad92bdeb5154737798b9f2a79cc) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 @@ -475,16 +481,16 @@ importers: version: file:templates/default/lib/risc0-ethereum '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/express': specifier: ^5.0.2 - version: 5.0.2 + version: 5.0.3 '@types/mocha': specifier: '>=9.1.0' version: 10.0.10 @@ -502,31 +508,31 @@ importers: version: 4.5.0 concurrently: specifier: ^9.1.2 - version: 9.1.2 + version: 9.2.0 ethers: specifier: ^6.9.0 - version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) express: specifier: ^5.1.0 version: 5.1.0 hardhat: specifier: ^2.22.10 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) poseidon-lite: specifier: ^0.3.0 version: 0.3.0 solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) @@ -538,7 +544,7 @@ importers: version: 5.8.3 viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wait-on: specifier: ^8.0.3 version: 8.0.3 @@ -556,13 +562,13 @@ importers: version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.74.3 - version: 5.80.5(react@18.3.1) + version: 5.81.2(react@18.3.1) '@wagmi/core': specifier: ^2.14.16 - version: 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + version: 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) react: specifier: ^18.2.0 version: 18.3.1 @@ -571,14 +577,14 @@ importers: version: 18.3.1(react@18.3.1) viem: specifier: ^2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: specifier: ^2.14.16 - version: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -593,10 +599,10 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.5.1(vite@5.4.19(@types/node@22.7.5)) + version: 4.6.0(vite@5.4.19(@types/node@22.15.33)) autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.4) + version: 10.4.21(postcss@8.5.6) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -608,28 +614,28 @@ importers: version: 0.4.20(eslint@8.57.1) prettier: specifier: ^3.2.5 - version: 3.5.3 + version: 3.6.1 prettier-plugin-tailwindcss: specifier: ^0.5.13 - version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3) + version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1))(prettier@3.6.1) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) typescript: specifier: ^5.2.2 version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.19(@types/node@22.7.5) + version: 5.4.19(@types/node@22.15.33) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)) + version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) + version: 3.4.1(vite@5.4.19(@types/node@22.15.33)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)) wasm-pack: specifier: ^0.13.1 version: 0.13.1 @@ -653,6 +659,10 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@aztec/bb.js@0.82.2': + resolution: {integrity: sha512-MBOHFVHOtfsknyJ1IsHH30paYqf0qLwYkiDTPyH1/KtkMwemvo5VyIgY0Dsl81KQa388MzoKhC6qnaFgERiaog==} + hasBin: true + '@aztec/bb.js@0.82.3': resolution: {integrity: sha512-jtnCqf+/QLw5yJGOmy818RMQqzHzHqcROtTdQZJybSxp0z3h76xpLSwoDQUBmZZVbP9e46FJjOLqB6gM9gY5cw==} hasBin: true @@ -661,12 +671,12 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/compat-data@7.27.7': + resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + '@babel/core@7.27.7': + resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} '@babel/generator@7.17.7': @@ -776,8 +786,8 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + '@babel/parser@7.27.7': + resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -889,8 +899,8 @@ packages: peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.27.1': - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} + '@babel/plugin-transform-classes@7.27.7': + resolution: {integrity: sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -901,8 +911,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.27.3': - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} + '@babel/plugin-transform-destructuring@7.27.7': + resolution: {integrity: sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1027,8 +1037,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.27.3': - resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} + '@babel/plugin-transform-object-rest-spread@7.27.7': + resolution: {integrity: sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1051,8 +1061,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.1': - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1230,16 +1240,16 @@ packages: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/traverse@7.27.7': + resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + '@babel/types@7.27.7': + resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -1248,14 +1258,14 @@ packages: '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.8': - resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.4': - resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true '@changesets/config@3.1.1': @@ -1267,8 +1277,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.12': - resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -1303,13 +1313,18 @@ packages: '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - '@coinbase/wallet-sdk@4.3.0': - resolution: {integrity: sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw==} + '@coinbase/wallet-sdk@4.3.3': + resolution: {integrity: sha512-h8gMLQNvP5TIJVXFOyQZaxbi1Mg5alFR4Z2/PEIngdyXZEoQGcVhzyQGuDa3t9zpllxvqfAaKfzDhsfCo+nhSQ==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} + '@commander-js/extra-typings@12.1.0': + resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} + peerDependencies: + commander: ~12.1.0 + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1988,6 +2003,9 @@ packages: '@iden3/bigarray@0.0.2': resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} + '@iden3/binfileutils@0.0.11': + resolution: {integrity: sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==} + '@iden3/binfileutils@0.0.12': resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} @@ -2107,6 +2125,30 @@ packages: cpu: [x64] os: [win32] + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + engines: {node: '>=18'} + + '@inquirer/input@2.3.0': + resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} + engines: {node: '>=18'} + + '@inquirer/select@2.5.0': + resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2327,59 +2369,59 @@ packages: resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==} engines: {node: '>= 10'} - '@next/env@14.2.29': - resolution: {integrity: sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg==} + '@next/env@14.2.30': + resolution: {integrity: sha512-KBiBKrDY6kxTQWGzKjQB7QirL3PiiOkV7KW98leHFjtVRKtft76Ra5qSA/SL75xT44dp6hOcqiiJ6iievLOYug==} - '@next/swc-darwin-arm64@14.2.29': - resolution: {integrity: sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==} + '@next/swc-darwin-arm64@14.2.30': + resolution: {integrity: sha512-EAqfOTb3bTGh9+ewpO/jC59uACadRHM6TSA9DdxJB/6gxOpyV+zrbqeXiFTDy9uV6bmipFDkfpAskeaDcO+7/g==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.29': - resolution: {integrity: sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==} + '@next/swc-darwin-x64@14.2.30': + resolution: {integrity: sha512-TyO7Wz1IKE2kGv8dwQ0bmPL3s44EKVencOqwIY69myoS3rdpO1NPg5xPM5ymKu7nfX4oYJrpMxv8G9iqLsnL4A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.29': - resolution: {integrity: sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==} + '@next/swc-linux-arm64-gnu@14.2.30': + resolution: {integrity: sha512-I5lg1fgPJ7I5dk6mr3qCH1hJYKJu1FsfKSiTKoYwcuUf53HWTrEkwmMI0t5ojFKeA6Vu+SfT2zVy5NS0QLXV4Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.29': - resolution: {integrity: sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==} + '@next/swc-linux-arm64-musl@14.2.30': + resolution: {integrity: sha512-8GkNA+sLclQyxgzCDs2/2GSwBc92QLMrmYAmoP2xehe5MUKBLB2cgo34Yu242L1siSkwQkiV4YLdCnjwc/Micw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.29': - resolution: {integrity: sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==} + '@next/swc-linux-x64-gnu@14.2.30': + resolution: {integrity: sha512-8Ly7okjssLuBoe8qaRCcjGtcMsv79hwzn/63wNeIkzJVFVX06h5S737XNr7DZwlsbTBDOyI6qbL2BJB5n6TV/w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.29': - resolution: {integrity: sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==} + '@next/swc-linux-x64-musl@14.2.30': + resolution: {integrity: sha512-dBmV1lLNeX4mR7uI7KNVHsGQU+OgTG5RGFPi3tBJpsKPvOPtg9poyav/BYWrB3GPQL4dW5YGGgalwZ79WukbKQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.29': - resolution: {integrity: sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==} + '@next/swc-win32-arm64-msvc@14.2.30': + resolution: {integrity: sha512-6MMHi2Qc1Gkq+4YLXAgbYslE1f9zMGBikKMdmQRHXjkGPot1JY3n5/Qrbg40Uvbi8//wYnydPnyvNhI1DMUW1g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.29': - resolution: {integrity: sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==} + '@next/swc-win32-ia32-msvc@14.2.30': + resolution: {integrity: sha512-pVZMnFok5qEX4RT59mK2hEVtJX+XFfak+/rjHpyFh7juiT52r177bfFKhnlafm0UOSldhXjj32b+LZIOdswGTg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.29': - resolution: {integrity: sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw==} + '@next/swc-win32-x64-msvc@14.2.30': + resolution: {integrity: sha512-4KCo8hMZXMjpTzs3HOqOGYYwAXymXIy7PEPAXNEcEOyKqkjiDlECumrWziy+JEF0Oi4ILHGxzgQ3YiMGG2t/Lg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2410,8 +2452,8 @@ packages: resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + '@noble/curves@1.9.2': + resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.2.0': @@ -2462,80 +2504,83 @@ packages: '@noir-lang/noir_js@1.0.0-beta.3': resolution: {integrity: sha512-Nt/rP7zRMOfNq9urD8+GtRpYqEc0K10FoKXs/v+ZTbGaP6Jkm7+F+UPj2bkWy66k1HNzsN6ortli7c7mnLDHwA==} + '@noir-lang/noir_wasm@1.0.0-beta.3': + resolution: {integrity: sha512-1EZCmaSYISxJIBLZN1tEyu25E7WIWAYpT3JdnVx+YCHk5uPWtXgroZSqypkpi39TVOJZT6DU/bPfrx0N1GSyog==} + '@noir-lang/noirc_abi@1.0.0-beta.3': resolution: {integrity: sha512-L6BI64ennatwTUciHqQ14ahUFsgzL41tzghqUELzO7XojasStcWDaSMjlTxca/2pvpWtEJHDtseKe1VZWIIVXQ==} '@noir-lang/types@1.0.0-beta.3': resolution: {integrity: sha512-BPOmf0qDiTn4wH1Lo7mHa67GTQFueIVaDUcUb+N9+ALiXC5nVU8HrzWmx1yvZB64ZiCEy7yPdNEaNrszSrE2fg==} - '@nomicfoundation/edr-darwin-arm64@0.11.0': - resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} + '@nomicfoundation/edr-darwin-arm64@0.11.2': + resolution: {integrity: sha512-/QU0GHeoLFOJp28qK46kkTG849NN/5Qgq9ifKzhqBas1MCqwcdjrUI3raGkvE9SWJevljWd1HdW16fFpxUrzbA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.0': - resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} + '@nomicfoundation/edr-darwin-x64@0.11.2': + resolution: {integrity: sha512-Dam+k00vyYNXCkM7JZGQBm0McNaL6ilbfY8BuIdHU2mpIVO5hpAFk8IQnMnG3FRuXuPJ0JoSTkn1R495T8AKqw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': - resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.2': + resolution: {integrity: sha512-6Z+hZ61c0v5EPVhCAc/rV36eN20GbPRfcmUeFJ3t+RjdY20EiUQzP85YU0q3AgCuwr410W27pazoBoL73cCPbg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': - resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} + '@nomicfoundation/edr-linux-arm64-musl@0.11.2': + resolution: {integrity: sha512-AqC4AI3pR4vSsEcFyW/6rI1q16wEjIRYIR25IJO/EdBmXdsuVZgxsf/kMUCWQhhTuy89RTgIGTbMAQA0+DfSvA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': - resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} + '@nomicfoundation/edr-linux-x64-gnu@0.11.2': + resolution: {integrity: sha512-vz1uiof1ZIi6RnXfHZiAXRgkloLciuYGD1rNDrqm1Pp7Nf0pbxw+e4TBQLoMYKzZn0MYS4u4Fa0AV2S7NjfptQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': - resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} + '@nomicfoundation/edr-linux-x64-musl@0.11.2': + resolution: {integrity: sha512-ArAbcrWwn+8Ze8JAaA9349N2E7hfs9PYvxDgfhujEH9iVC9XI6L+OhMATPsS3wkOST/+ykxELAF1KT4YjSxcrA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': - resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} + '@nomicfoundation/edr-win32-x64-msvc@0.11.2': + resolution: {integrity: sha512-GDXBhxy5wlmZYQrTXu9Oh9OPTsi4tCdmHy1z8O9XqdH9wsP674Frh6Fb43yjVoS2Ek1F9yX11nexIrFXSuNyJQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.0': - resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} + '@nomicfoundation/edr@0.11.2': + resolution: {integrity: sha512-JEFMTs5Tju+YiCsv6EO+657O/fvPaQ7bkUCkWqHFYFFbCKH1yh0PeRIaqj5h4z4O16ckxbVpAM676ZFTmvFUGQ==} engines: {node: '>= 18'} - '@nomicfoundation/hardhat-chai-matchers@2.0.8': - resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} + '@nomicfoundation/hardhat-chai-matchers@2.0.9': + resolution: {integrity: sha512-AbCoBuTKMlwlf1lesSmi/4VvJHNG9EP13EmkCJ+MJS1SBdtVtU4YrBbdYmnYPEvRFcAIMFB/cwcQGmuBYeCoVg==} peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.9 chai: ^4.2.0 - ethers: ^6.1.0 + ethers: ^6.14.0 hardhat: ^2.9.4 - '@nomicfoundation/hardhat-ethers@3.0.8': - resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} + '@nomicfoundation/hardhat-ethers@3.0.9': + resolution: {integrity: sha512-xBJdRUiCwKpr0OYrOzPwAyNGtsVzoBx32HFPJVv6S+sFA9TmBIBDaqNlFPmBH58ZjgNnGhEr/4oBZvGr4q4TjQ==} peerDependencies: - ethers: ^6.1.0 + ethers: ^6.14.0 hardhat: ^2.0.0 - '@nomicfoundation/hardhat-foundry@1.1.3': - resolution: {integrity: sha512-30Ezc3hlZ4pC5Z/9W9euW5uoPKKQQKaecLETHJH8BPpd30zYOooy6HfjmcTY1/taOQjlwirOdNO7tHlje8Qcgw==} + '@nomicfoundation/hardhat-foundry@1.1.4': + resolution: {integrity: sha512-jpKyOr8bYKJPCuxJIJGOJzzyQPLcLJYq+kLPx135dkgCXyHiFdbSaGA9AEwqsPf97wlwXkskXGn4a21XOkSOPg==} peerDependencies: hardhat: ^2.17.2 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11': - resolution: {integrity: sha512-srXzvf7qCDHLrnvQWtpVA9gWpcbp4BcnsOqJt6ISet9OlUnxk4GgRMbdFq4YpM48bHQTX397jS9yk1AtJCjt/g==} + '@nomicfoundation/hardhat-ignition-ethers@0.15.13': + resolution: {integrity: sha512-fJuImb0KBbsylTL5M1DdlChIO/GZoms2NUVJhU+AvfhlgB0jzRH+9jSXE9izYPktd8//tdVSC4kJloJPrR+BlA==} peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.4 - '@nomicfoundation/hardhat-ignition': ^0.15.11 - '@nomicfoundation/ignition-core': ^0.15.11 - ethers: ^6.7.0 + '@nomicfoundation/hardhat-ethers': ^3.0.9 + '@nomicfoundation/hardhat-ignition': ^0.15.12 + '@nomicfoundation/ignition-core': ^0.15.12 + ethers: ^6.14.0 hardhat: ^2.18.0 - '@nomicfoundation/hardhat-ignition@0.15.11': - resolution: {integrity: sha512-OXebmK9FCMwwbb4mIeHBbVFFicAGgyGKJT2zrONrpixrROxrVs6KEi1gzsiN25qtQhCQePt8BTjjYrgy86Dfxg==} + '@nomicfoundation/hardhat-ignition@0.15.12': + resolution: {integrity: sha512-T03bSjFy8vWeKGvFsR42vzl4PgmW06i1e/84m2oowZzdO3i9ax3XJhRiH4kC08QXzkdAdUPinx68hQea8Wh6Jw==} peerDependencies: '@nomicfoundation/hardhat-verify': ^2.0.1 hardhat: ^2.18.0 - '@nomicfoundation/hardhat-network-helpers@1.0.12': - resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} + '@nomicfoundation/hardhat-network-helpers@1.0.13': + resolution: {integrity: sha512-ptg0+SH8jnfoYHlR3dKWTNTB43HZSxkuy3OeDk+AufEKQvQ7Ru9LQEbJtLuDTQ4HGRBkhl4oJ9RABsEIbn7Taw==} peerDependencies: hardhat: ^2.9.5 @@ -2587,8 +2632,8 @@ packages: peerDependencies: hardhat: ^2.24.1 - '@nomicfoundation/ignition-core@0.15.11': - resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} + '@nomicfoundation/ignition-core@0.15.12': + resolution: {integrity: sha512-JJdyoyfM5RXaUqv4c2V/8xpuui4uqJbMCvVnEhgo6FMOK6bqj8wGP6hM4gNE5TLug6ZUCdjIB8kFpofl21RycQ==} '@nomicfoundation/ignition-ui@0.15.11': resolution: {integrity: sha512-VPOVl5xqCKhYCyPOQlposx+stjCwqXQ+BCs5lnw/f2YUfgII+G5Ye0JfHiJOfCJGmqyS03WertBslcj9zQg50A==} @@ -2709,8 +2754,8 @@ packages: '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} - '@rolldown/pluginutils@1.0.0-beta.9': - resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -2730,8 +2775,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2739,103 +2784,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.41.1': - resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.41.1': - resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.41.1': - resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.41.1': - resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.41.1': - resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.41.1': - resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': - resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.41.1': - resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} + '@rollup/rollup-linux-arm-musleabihf@4.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.41.1': - resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.41.1': - resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': - resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': - resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.41.1': - resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} + '@rollup/rollup-linux-riscv64-gnu@4.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.41.1': - resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.41.1': - resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} + '@rollup/rollup-linux-s390x-gnu@4.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.41.1': - resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} + '@rollup/rollup-linux-x64-gnu@4.44.1': + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.41.1': - resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.41.1': - resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} + '@rollup/rollup-win32-arm64-msvc@4.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.41.1': - resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} + '@rollup/rollup-win32-ia32-msvc@4.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.41.1': - resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} + '@rollup/rollup-win32-x64-msvc@4.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] @@ -2885,30 +2930,41 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@semaphore-protocol/contracts-noir@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/9cd8034957a6f66b787639e224e517d9b2a4c972': + resolution: {tarball: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/9cd8034957a6f66b787639e224e517d9b2a4c972} + version: 1.0.0 + '@semaphore-protocol/contracts@4.11.1': resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} - '@semaphore-protocol/core@4.11.1': - resolution: {integrity: sha512-FYF9k5peTC1dvILBma9kxdBaxl6VHJ3Z87Y74rOryzgSrAZMnwLUg87T5BMf6rtmqd6IP507UbGuMB3G7eTk3g==} + '@semaphore-protocol/core@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/caad5529009ebdeb1613c552c4e188a54b681a43': + resolution: {tarball: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/caad5529009ebdeb1613c552c4e188a54b681a43} + version: 4.9.1 '@semaphore-protocol/data@4.11.1': resolution: {integrity: sha512-vOwZ3ywD6wofUSR1s0tpS8wg1pL0H3rs1S8zHOEJ9zLnnBMFPGgjy6eUI68uoRC9kKDB6/hypDj0ncHyFq6nBA==} - '@semaphore-protocol/group@4.11.1': - resolution: {integrity: sha512-YJwLpAc0sOzlgZwDw62QRj1BJ3PXPQdFYqt0lhNvbhPosFAmjfHW+gr7xYuBku/oQJ4clm+fLQniAd37a+ZXHg==} + '@semaphore-protocol/group@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8': + resolution: {tarball: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8} + version: 4.9.1 - '@semaphore-protocol/identity@4.11.1': - resolution: {integrity: sha512-HVnm8TA7+tz1WiRpLhgiqZspsNfTrtUlArhiYg4GaZz4Xh3Xf8ryjcSVJLIiAmGu0eP46yg8GuRa6vW6I9Oi+g==} + '@semaphore-protocol/identity@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef': + resolution: {tarball: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef} + version: 4.9.1 - '@semaphore-protocol/proof@4.11.1': - resolution: {integrity: sha512-wnSIAUFtcAu/QhBZcq20lJE/7X4fwG6qq/LsDFnLB9GKMYXR2fdBCUPhoER34ojjJqSwrwqW+vk/omb3icqplA==} + '@semaphore-protocol/proof@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/d8989c48201f05245965f992e4fc4f0bddb7725e': + resolution: {tarball: https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/d8989c48201f05245965f992e4fc4f0bddb7725e} + version: 4.9.1 peerDependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 + '@semaphore-protocol/group': 4.9.1 + '@semaphore-protocol/identity': 4.9.1 '@semaphore-protocol/utils@4.11.1': resolution: {integrity: sha512-lTzZo9RV1wUyFXVnDcnSV3cDYfoMfmG17Sl9M1I7L82JX19LBPNJ1olBQbloC6UvyzE6DaqQ783MJnTkWEoDjg==} + '@semaphore-protocol/utils@4.9.1': + resolution: {integrity: sha512-fhiVW/CL+zU/DvKAibBh3thEg2GKTMvNEl2V+fcJYbiyjxjZPfwvVHS/tP2wxBibU8bvtfcuqAk3WFdJXYFG2A==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -3037,68 +3093,68 @@ packages: resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==} engines: {node: '>=14'} - '@swc/core-darwin-arm64@1.11.31': - resolution: {integrity: sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==} + '@swc/core-darwin-arm64@1.12.7': + resolution: {integrity: sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.31': - resolution: {integrity: sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==} + '@swc/core-darwin-x64@1.12.7': + resolution: {integrity: sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.31': - resolution: {integrity: sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==} + '@swc/core-linux-arm-gnueabihf@1.12.7': + resolution: {integrity: sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.31': - resolution: {integrity: sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==} + '@swc/core-linux-arm64-gnu@1.12.7': + resolution: {integrity: sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.31': - resolution: {integrity: sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==} + '@swc/core-linux-arm64-musl@1.12.7': + resolution: {integrity: sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.31': - resolution: {integrity: sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==} + '@swc/core-linux-x64-gnu@1.12.7': + resolution: {integrity: sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.31': - resolution: {integrity: sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==} + '@swc/core-linux-x64-musl@1.12.7': + resolution: {integrity: sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.31': - resolution: {integrity: sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==} + '@swc/core-win32-arm64-msvc@1.12.7': + resolution: {integrity: sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.31': - resolution: {integrity: sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==} + '@swc/core-win32-ia32-msvc@1.12.7': + resolution: {integrity: sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.31': - resolution: {integrity: sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==} + '@swc/core-win32-x64-msvc@1.12.7': + resolution: {integrity: sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.31': - resolution: {integrity: sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==} + '@swc/core@1.12.7': + resolution: {integrity: sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -3112,8 +3168,8 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} '@synthetixio/ethereum-wallet-mock@0.0.12': resolution: {integrity: sha512-n1b59v61cPBRA1ryJIqBZ2VybArkRN+7/Hjl24A51J0nKFUED646/EzHRxl3qvLN7Xv3lcmjcmXX0KOcRozFXg==} @@ -3156,22 +3212,22 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.80.5': - resolution: {integrity: sha512-kFWXdQOUcjL/Ugk3GrI9eMuG3DsKBGaLIgyOLekR2UOrRrJgkLgPUNzZ10i8FCkfi4SgLABhOtQhx1HjoB9EZQ==} + '@tanstack/query-core@5.81.2': + resolution: {integrity: sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw==} - '@tanstack/react-query@5.80.5': - resolution: {integrity: sha512-C0d+pvIahk6fJK5bXxyf36r9Ft6R9O0mwl781CjBrYGRJc76XRJcKhkVpxIo68cjMy3i47gd4O1EGooAke/OCQ==} + '@tanstack/react-query@5.81.2': + resolution: {integrity: sha512-pe8kFlTrL2zFLlcAj2kZk9UaYYHDk9/1hg9EBaoO3cxDhOZf1FRGJeziSXKrVZyxIfs7b3aoOj/bw7Lie0mDUg==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.9': - resolution: {integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==} + '@tanstack/react-virtual@3.13.11': + resolution: {integrity: sha512-u5EaOSJOq08T9NXFuDopMdxZBNDFuEMohIFFU45fBYDXXh9SjYdbpNq1OLFSOpQnDRPjqgmY96ipZTkzom9t9Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.9': - resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} + '@tanstack/virtual-core@3.13.11': + resolution: {integrity: sha512-ORL6UyuZJ0D9X33LDR4TcgcM+K2YiS2j4xbvH1vnhhObwR1Z4dKwPTL/c0kj2Yeb4Yp2lBv1wpyVaqlohk8zpg==} '@theguild/remark-mermaid@0.0.5': resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} @@ -3236,11 +3292,11 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} @@ -3269,14 +3325,14 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@5.0.2': - resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/form-data@0.0.33': resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} @@ -3296,8 +3352,8 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -3335,6 +3391,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node@10.17.60': resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -3344,6 +3403,9 @@ packages: '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + '@types/node@22.15.33': + resolution: {integrity: sha512-wzoocdnnpSxZ+6CjW4ADCK1jVmd1S/J3ArNWfn8FDDQtRm8dkDg7TA+mvek2wNrfCgwuZxqEOiB9B1XCJ6+dbw==} + '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -3359,8 +3421,8 @@ packages: '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -3385,11 +3447,14 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/snarkjs@0.7.9': + resolution: {integrity: sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g==} '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} @@ -3403,6 +3468,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3473,24 +3541,24 @@ packages: '@viem/anvil@0.0.7': resolution: {integrity: sha512-F+3ljCT1bEt8T4Fzm9gWpIgO3Dc7bzG1TtUtkStkJFMuummqZ8kvYc3UFMo5j3F51fSWZZvEkjs3+i7qf0AOqQ==} - '@vitejs/plugin-react@4.5.1': - resolution: {integrity: sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==} + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - '@wagmi/connectors@5.8.4': - resolution: {integrity: sha512-WuDH6GMDc/wbWhCcpLvUFglN/ANXht9wXD8M3rvYPGBYcuvDOOh7eXGHaDqVUpgJLcvvy0WWkTuesNbK8FCayQ==} + '@wagmi/connectors@5.8.5': + resolution: {integrity: sha512-CHh4uYP6MziCMlSVXmuAv7wMoYWdxXliuzwCRAxHNNkgXE7z37ez5XzJu0Sm39NUau3Fl8WSjwKo4a4w9BOYNA==} peerDependencies: - '@wagmi/core': 2.17.2 + '@wagmi/core': 2.17.3 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/core@2.17.2': - resolution: {integrity: sha512-p1z8VU0YuRClx2bdPoFObDF7M2Reitz9AdByrJ+i5zcPCHuJ/UjaWPv6xD7ydhkWVK0hoa8vQ/KtaiEwEQS7Mg==} + '@wagmi/core@2.17.3': + resolution: {integrity: sha512-fgZR9fAiCFtGaosTspkTx5lidccq9Z5xRWOk1HG0VfB6euQGw2//Db7upiP4uQ7DPst2YS9yQN2A1m9+iJLYCw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -3589,8 +3657,10 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@zk-kit/artifacts@1.8.0': - resolution: {integrity: sha512-G2rQ1BxYt9CuVyU4Egc4ceSLLWx9BRrtFGZWS0RWwHhAMfSV/Fq9Qz6OX02leFzTbi7Tr3bTP6DgDSqr28OQnw==} + '@zk-kit/artifacts@https://codeload.github.com/hmzakhalid/snark-artifacts/tar.gz/a8eb62a0e3f1d4917f7895bf4511ee1f7f221dc3': + resolution: {tarball: https://codeload.github.com/hmzakhalid/snark-artifacts/tar.gz/a8eb62a0e3f1d4917f7895bf4511ee1f7f221dc3} + version: 2.0.1 + hasBin: true '@zk-kit/baby-jubjub@1.0.3': resolution: {integrity: sha512-Wl+QfV6XGOMk1yU2JTqHXeKWfJVXp83is0+dtqfj9wx4wsAPpb+qzYvwAxW5PBx5/Nu71Bh7jp/5vM+6QgHSwA==} @@ -3651,8 +3721,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -3833,15 +3903,15 @@ packages: axios@0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + axios@1.6.6: resolution: {integrity: sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==} axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} - b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -3916,6 +3986,9 @@ packages: binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake2b-wasm@2.4.0: resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} @@ -3951,11 +4024,11 @@ packages: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -3993,8 +4066,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4094,8 +4167,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001721: - resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} + caniuse-lite@1.0.30001726: + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4172,6 +4245,9 @@ packages: check-types@11.2.3: resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + child_process@1.0.2: + resolution: {integrity: sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4195,10 +4271,25 @@ packages: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} + circom_runtime@0.1.21: + resolution: {integrity: sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA==} + hasBin: true + circom_runtime@0.1.25: resolution: {integrity: sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA==} hasBin: true + circom_tester@0.0.19: + resolution: {integrity: sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw==} + + circomkit@0.2.1: + resolution: {integrity: sha512-7O8QsOLUq2QvwGMimvWxwdg7OgV33OT7ZBND+81dv3JrVp8ove93yV16jF3TW6XBncSY92/Aka8F4CAi/H9VQw==} + engines: {node: '>=12.0.0'} + hasBin: true + peerDependencies: + '@types/snarkjs': ^0.7.x + snarkjs: ^0.7.x + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4207,6 +4298,14 @@ packages: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} @@ -4215,6 +4314,10 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -4236,6 +4339,10 @@ packages: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -4333,16 +4440,16 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} - concurrently@9.1.2: - resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} engines: {node: '>=18'} hasBin: true config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - connectkit@1.9.0: - resolution: {integrity: sha512-bkqg8zK35pWWG2q8xeo41J1mnBP8D2ffOd/ItB12aad9QZZU20SlEeiQM9iYfRyl0JAH1tqIDlZbXajqZBFfDw==} + connectkit@1.9.1: + resolution: {integrity: sha512-ac9Ki3+HdS3l5NCa6H86y7R+0PqwJ8yzsBQVtWk4/jkFo+JJioetO43A/Q0O7VtxLbfuLLfwDGZ09taePLNzfQ==} engines: {node: '>=12.4'} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -4386,8 +4493,8 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-js-compat@3.42.0: - resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + core-js-compat@3.43.0: + resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4416,6 +4523,9 @@ packages: create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -4674,8 +4784,8 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -4700,6 +4810,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -4809,8 +4922,8 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.0: + resolution: {integrity: sha512-Omf1L8paOy2VJhILjyhrhqwLIdstqm1BvcDPKg4NGAlkwEu9ODyrFbvk8UymUOMCT+HXo31jg1lArIrVAAhuGA==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -4838,8 +4951,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.165: - resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} + electron-to-chromium@1.5.176: + resolution: {integrity: sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -4866,8 +4979,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} engine.io-client@6.6.3: resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} @@ -4884,8 +4997,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} env-paths@2.2.1: @@ -5108,8 +5221,8 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} - ethers@6.14.3: - resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} + ethers@6.14.4: + resolution: {integrity: sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: @@ -5166,8 +5279,8 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - family@0.1.2: - resolution: {integrity: sha512-d+GeTctSPP50aHyNgkIXKXwTrQs7OmBlTaeYWXtPReBCX8iassx4oV6nq9bA1uN4zw0KSATdOdFdGUEH0KF5bA==} + family@0.1.3: + resolution: {integrity: sha512-5jvm4XrcJU/Hl0Bv9wL6VdzsfW8I20ssFcWmYWrUHVQGZlNqqLGoNqyEVWr3uLaPpdAY0Hn0+J9JWrK7MzeDXQ==} engines: {node: '>=12.4'} peerDependencies: react: 17.x || 18.x || 19.x @@ -5219,14 +5332,20 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true + ffjavascript@0.2.56: + resolution: {integrity: sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==} + + ffjavascript@0.2.63: + resolution: {integrity: sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==} + ffjavascript@0.3.0: resolution: {integrity: sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==} @@ -5296,6 +5415,9 @@ packages: fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + fnv-plus@1.3.1: + resolution: {integrity: sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==} + focus-visible@5.2.1: resolution: {integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==} @@ -5324,8 +5446,8 @@ packages: resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} engines: {node: '>= 0.12'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} format@0.2.2: @@ -5571,8 +5693,8 @@ packages: peerDependencies: hardhat: ^2.16.0 - hardhat@2.24.2: - resolution: {integrity: sha512-oYt+tcN2379Z3kqIhvVw6IFgWqTm/ixcrTvyAuQdE2RbD+kknwF7hDfUeggy0akrw6xdgCtXvnw9DFrxAB70hA==} + hardhat@2.25.0: + resolution: {integrity: sha512-yBiA74Yj3VnTRj7lhnn8GalvBdvsMOqTKRrRATSy/2v0VIR2hR0Jcnmfn4aQBLtGAnr3Q2c8CxL0g3LYegUp+g==} hasBin: true peerDependencies: ts-node: '*' @@ -5610,6 +5732,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + hash-base@3.0.5: resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} engines: {node: '>= 0.10'} @@ -5916,6 +6041,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -5984,6 +6113,9 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -6236,6 +6368,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + logplease@1.2.15: resolution: {integrity: sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==} @@ -6707,6 +6843,10 @@ packages: murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -6754,8 +6894,8 @@ packages: react: '*' react-dom: '*' - next@14.2.29: - resolution: {integrity: sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA==} + next@14.2.30: + resolution: {integrity: sha512-+COdu6HQrHHFQ1S/8BBsCag61jZacmvbuL2avHvQFbWa2Ox7bE+d8FyNgxRLjXQ5wtPyQwEmk85js/AuaG2Sbg==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -6816,8 +6956,8 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + node-mock-http@1.0.1: + resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -6845,8 +6985,8 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} engines: {node: '>=14.16'} npm-run-path@2.0.2: @@ -6931,6 +7071,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + ordinal@1.0.3: resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} @@ -6952,8 +7096,8 @@ packages: typescript: optional: true - ox@0.7.1: - resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} + ox@0.8.1: + resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -7094,8 +7238,8 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} engines: {node: '>=0.12'} periscopic@3.1.0: @@ -7230,12 +7374,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.8: - resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} + preact@10.26.9: + resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -7312,8 +7456,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.1: + resolution: {integrity: sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==} engines: {node: '>=14'} hasBin: true @@ -7377,8 +7521,8 @@ packages: public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -7422,6 +7566,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + r1csfile@0.0.41: + resolution: {integrity: sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA==} + r1csfile@0.0.48: resolution: {integrity: sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==} @@ -7673,6 +7820,10 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -7691,6 +7842,9 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -7701,8 +7855,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.41.1: - resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7880,6 +8034,10 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snarkjs@0.5.0: + resolution: {integrity: sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA==} + hasBin: true + snarkjs@0.7.4: resolution: {integrity: sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w==} hasBin: true @@ -7892,8 +8050,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - solady@0.1.19: - resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} + solady@0.1.22: + resolution: {integrity: sha512-FuoNeri7rutbQc0+0MTPA8NQ03z8u4TmVT25cVY7jA8qldwO11fR05wksWuYHFeVWKaDcnPmpTxLn2gZli3Chw==} solady@0.1.4: resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} @@ -7987,6 +8145,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} @@ -8080,14 +8242,14 @@ packages: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} - style-to-js@1.1.16: - resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} style-value-types@5.0.0: resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} @@ -8230,10 +8392,21 @@ packages: resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} engines: {node: '>=0.10.0'} + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -8397,6 +8570,10 @@ packages: peerDependencies: typescript: '>=4.3.0' + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typed-rpc@6.1.1: resolution: {integrity: sha512-PZCwvDWNyXHp5ZuHJqixU59jw+61JIL95jkW71VUXPJagYRJtpmRdFdIF3EL5tEz6XHLaBtrqgJEBysHIu4vOw==} @@ -8444,6 +8621,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -8707,8 +8887,8 @@ packages: typescript: optional: true - viem@2.30.6: - resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} + viem@2.31.4: + resolution: {integrity: sha512-0UZ/asvzl6p44CIBRDbwEcn3HXIQQurBZcMo5qmLhQ8s27Ockk+RYohgTLlpLvkYs8/t4UUEREAbHLuek1kXcw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -8786,8 +8966,8 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - wagmi@2.15.5: - resolution: {integrity: sha512-1l4DvaXXh2bBbKJbeoLsHkWyWA7hYuts2SDSGQU8gT37Sqzh3u8vBAwc0pN4570oGQxYVw2+YiwpR2yGPFyQTg==} + wagmi@2.15.6: + resolution: {integrity: sha512-tR4tm+7eE0UloQe1oi4hUIjIDyjv5ImQlzq/QcvvfJYWF/EquTfGrmht6+nTYGCIeSzeEvbK90KgWyNqa+HD7Q==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -8809,9 +8989,15 @@ packages: wasmbuilder@0.0.16: resolution: {integrity: sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==} + wasmcurves@0.2.0: + resolution: {integrity: sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==} + wasmcurves@0.2.2: resolution: {integrity: sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -9033,6 +9219,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zksync-ethers@5.10.0: resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} engines: {node: '>=16.0.0'} @@ -9042,8 +9232,8 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.25.51: - resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} + zod@3.25.67: + resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} @@ -9081,11 +9271,22 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@aztec/bb.js@0.82.2': + dependencies: + comlink: 4.4.2 + commander: 12.1.0 + debug: 4.4.1(supports-color@8.1.1) + fflate: 0.8.2 + pako: 2.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@aztec/bb.js@0.82.3': dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -9098,22 +9299,22 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.27.7': {} - '@babel/core@7.27.4': + '@babel/core@7.27.7': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 '@babel/generator': 7.27.5 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 + '@babel/parser': 7.27.7 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.6 + '@babel/traverse': 7.27.7 + '@babel/types': 7.27.7 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -9122,56 +9323,56 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.27.7 + '@babel/types': 7.27.7 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.27.7 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -9179,74 +9380,81 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.6 + '@babel/traverse': 7.27.7 + '@babel/types': 7.27.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.7 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.6 + '@babel/traverse': 7.27.7(supports-color@5.5.0) + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/core': 7.27.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.6 + '@babel/traverse': 7.27.7 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@babel/helper-string-parser@7.27.1': {} @@ -9257,561 +9465,567 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) - '@babel/types': 7.27.6 + '@babel/traverse': 7.27.7 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 - '@babel/parser@7.27.5': + '@babel/parser@7.27.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/core': 7.27.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-classes@7.27.7(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) + '@babel/traverse': 7.27.7 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-destructuring@7.27.7(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-object-rest-spread@7.27.7(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.7(@babel/core@7.27.7) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) + '@babel/traverse': 7.27.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + '@babel/preset-env@7.27.2(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 + '@babel/compat-data': 7.27.7 + '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.7) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.7) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.7) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.27.7(@babel/core@7.27.7) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.27.7(@babel/core@7.27.7) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-object-rest-spread': 7.27.7(@babel/core@7.27.7) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.7) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.7) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.7) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.7) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.7) + core-js-compat: 3.43.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 esutils: 2.0.3 - '@babel/preset-react@7.27.1(@babel/core@7.27.4)': + '@babel/preset-react@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color @@ -9820,8 +10034,8 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.27.7 + '@babel/types': 7.27.7 '@babel/traverse@7.23.2': dependencies: @@ -9831,20 +10045,32 @@ snapshots: '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@5.5.0) + '@babel/parser': 7.27.7 + '@babel/types': 7.27.7 + debug: 4.4.1(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.27.7': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.7 + '@babel/template': 7.27.2 + '@babel/types': 7.27.7 + debug: 4.4.1(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.4(supports-color@5.5.0)': + '@babel/traverse@7.27.7(supports-color@5.5.0)': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/parser': 7.27.7 '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -9855,7 +10081,7 @@ snapshots: '@babel/helper-validator-identifier': 7.27.1 to-fast-properties: 2.0.0 - '@babel/types@7.27.6': + '@babel/types@7.27.7': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -9878,7 +10104,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.8': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -9891,15 +10117,15 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.4': + '@changesets/cli@2.29.5': dependencies: '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.12 + '@changesets/get-release-plan': 4.0.13 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -9943,9 +10169,9 @@ snapshots: picocolors: 1.1.1 semver: 7.7.2 - '@changesets/get-release-plan@4.0.12': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.5 @@ -10013,21 +10239,25 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.26.8 + preact: 10.26.9 sha.js: 2.4.11 transitivePeerDependencies: - supports-color - '@coinbase/wallet-sdk@4.3.0': + '@coinbase/wallet-sdk@4.3.3': dependencies: '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.26.8 + preact: 10.26.9 '@colors/colors@1.5.0': optional: true + '@commander-js/extra-typings@12.1.0(commander@13.1.0)': + dependencies: + commander: 13.1.0 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -10038,11 +10268,10 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -10072,7 +10301,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10367,7 +10596,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10686,7 +10915,7 @@ snapshots: '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10694,7 +10923,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10705,6 +10934,11 @@ snapshots: '@iden3/bigarray@0.0.2': {} + '@iden3/binfileutils@0.0.11': + dependencies: + fastfile: 0.0.20 + ffjavascript: 0.2.63 + '@iden3/binfileutils@0.0.12': dependencies: fastfile: 0.0.20 @@ -10791,6 +11025,44 @@ snapshots: '@img/sharp-win32-x64@0.34.2': optional: true + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.12 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.15.33 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.12': {} + + '@inquirer/input@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/select@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.12 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -10947,7 +11219,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -10971,12 +11243,12 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 obj-multiplex: 1.0.0 - pump: 3.0.2 + pump: 3.0.3 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) tslib: 2.8.1 @@ -10994,7 +11266,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -11007,7 +11279,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11021,7 +11293,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11122,33 +11394,33 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.19 '@napi-rs/simple-git-win32-x64-msvc': 0.1.19 - '@next/env@14.2.29': {} + '@next/env@14.2.30': {} - '@next/swc-darwin-arm64@14.2.29': + '@next/swc-darwin-arm64@14.2.30': optional: true - '@next/swc-darwin-x64@14.2.29': + '@next/swc-darwin-x64@14.2.30': optional: true - '@next/swc-linux-arm64-gnu@14.2.29': + '@next/swc-linux-arm64-gnu@14.2.30': optional: true - '@next/swc-linux-arm64-musl@14.2.29': + '@next/swc-linux-arm64-musl@14.2.30': optional: true - '@next/swc-linux-x64-gnu@14.2.29': + '@next/swc-linux-x64-gnu@14.2.30': optional: true - '@next/swc-linux-x64-musl@14.2.29': + '@next/swc-linux-x64-musl@14.2.30': optional: true - '@next/swc-win32-arm64-msvc@14.2.29': + '@next/swc-win32-arm64-msvc@14.2.30': optional: true - '@next/swc-win32-ia32-msvc@14.2.29': + '@next/swc-win32-ia32-msvc@14.2.30': optional: true - '@next/swc-win32-x64-msvc@14.2.29': + '@next/swc-win32-x64-msvc@14.2.30': optional: true '@noble/ciphers@1.2.1': {} @@ -11175,7 +11447,7 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 - '@noble/curves@1.9.1': + '@noble/curves@1.9.2': dependencies: '@noble/hashes': 1.8.0 @@ -11215,98 +11487,100 @@ snapshots: '@noir-lang/noirc_abi': 1.0.0-beta.3 '@noir-lang/types': 1.0.0-beta.3 + '@noir-lang/noir_wasm@1.0.0-beta.3': + dependencies: + '@noir-lang/types': 1.0.0-beta.3 + pako: 2.1.0 + '@noir-lang/noirc_abi@1.0.0-beta.3': dependencies: '@noir-lang/types': 1.0.0-beta.3 '@noir-lang/types@1.0.0-beta.3': {} - '@nomicfoundation/edr-darwin-arm64@0.11.0': {} + '@nomicfoundation/edr-darwin-arm64@0.11.2': {} - '@nomicfoundation/edr-darwin-x64@0.11.0': {} + '@nomicfoundation/edr-darwin-x64@0.11.2': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.2': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.11.2': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.11.2': {} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.11.2': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.11.2': {} - '@nomicfoundation/edr@0.11.0': + '@nomicfoundation/edr@0.11.2': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.0 - '@nomicfoundation/edr-darwin-x64': 0.11.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-x64-musl': 0.11.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 + '@nomicfoundation/edr-darwin-arm64': 0.11.2 + '@nomicfoundation/edr-darwin-x64': 0.11.2 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.2 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.2 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.2 + '@nomicfoundation/edr-linux-x64-musl': 0.11.2 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.2 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.1.3(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.1.4(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/ignition-core': 0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -11314,84 +11588,83 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(8fa82fbb3ce2b604cbb19f7a657031e8)': + '@nomicfoundation/hardhat-toolbox@4.0.0(7701bdab18209f25884c4218d60ddb07)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@4.0.0(f71f0ab2085f15302dd226a52112005a)': + '@nomicfoundation/hardhat-toolbox@4.0.0(f317dad92bdeb5154737798b9f2a79cc)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.10.4 chai: 4.5.0 - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(21c4d7a5429e39aca71bda0cc08815c6)': + '@nomicfoundation/hardhat-toolbox@5.0.0(d1a9b5350250b0c212d224a0066f41ff)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 22.7.5 + '@types/node': 22.15.33 chai: 4.5.0 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -11400,13 +11673,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -11415,13 +11688,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/ignition-core@0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@5.5.0) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@8.1.1) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 lodash: 4.17.21 @@ -11498,9 +11771,9 @@ snapshots: '@popperjs/core@2.11.8': {} - '@prettier/sync@0.3.0(prettier@3.5.3)': + '@prettier/sync@0.3.0(prettier@3.6.1)': dependencies: - prettier: 3.5.3 + prettier: 3.6.1 '@remix-run/router@1.23.0': {} @@ -11508,31 +11781,31 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@reown/appkit-controllers@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11560,12 +11833,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@reown/appkit-pay@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67) lit: 3.3.0 valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) transitivePeerDependencies: @@ -11599,12 +11872,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -11635,10 +11908,10 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@reown/appkit-ui@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 @@ -11669,16 +11942,16 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51)': + '@reown/appkit-utils@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11717,21 +11990,21 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@reown/appkit@1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-pay': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) - '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.51) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1))(zod@3.25.67) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) '@walletconnect/types': 2.21.0 - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11761,91 +12034,91 @@ snapshots: '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} - '@rolldown/pluginutils@1.0.0-beta.9': {} + '@rolldown/pluginutils@1.0.0-beta.19': {} - '@rollup/plugin-inject@5.0.5(rollup@4.41.1)': + '@rollup/plugin-inject@5.0.5(rollup@4.44.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + '@rollup/pluginutils': 5.2.0(rollup@4.44.1) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.41.1 + rollup: 4.44.1 - '@rollup/plugin-virtual@3.0.2(rollup@4.41.1)': + '@rollup/plugin-virtual@3.0.2(rollup@4.44.1)': optionalDependencies: - rollup: 4.41.1 + rollup: 4.44.1 - '@rollup/pluginutils@5.1.4(rollup@4.41.1)': + '@rollup/pluginutils@5.2.0(rollup@4.44.1)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.41.1 + rollup: 4.44.1 - '@rollup/rollup-android-arm-eabi@4.41.1': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.41.1': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.41.1': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.41.1': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.41.1': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.41.1': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.41.1': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.41.1': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.41.1': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.41.1': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.41.1': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.41.1': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.41.1': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.41.1': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.41.1': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.41.1': + '@rollup/rollup-win32-ia32-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.41.1': + '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -11853,10 +12126,10 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - typescript @@ -11889,13 +12162,13 @@ snapshots: '@scure/bip32@1.6.2': dependencies: - '@noble/curves': 1.8.2 - '@noble/hashes': 1.7.2 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@scure/base': 1.2.6 '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -11916,7 +12189,7 @@ snapshots: '@scure/bip39@1.5.4': dependencies: - '@noble/hashes': 1.7.2 + '@noble/hashes': 1.7.1 '@scure/base': 1.2.6 '@scure/bip39@1.6.0': @@ -11924,26 +12197,33 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@semaphore-protocol/contracts-noir@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/9cd8034957a6f66b787639e224e517d9b2a4c972': + dependencies: + '@zk-kit/lean-imt.sol': 2.0.0 + '@semaphore-protocol/contracts@4.11.1': dependencies: '@zk-kit/lean-imt.sol': 2.0.1 - '@semaphore-protocol/core@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/core@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/caad5529009ebdeb1613c552c4e188a54b681a43(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/proof': 4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@semaphore-protocol/group': https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8 + '@semaphore-protocol/identity': https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef + '@semaphore-protocol/proof': https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/d8989c48201f05245965f992e4fc4f0bddb7725e(@semaphore-protocol/group@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8)(@semaphore-protocol/identity@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef)(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: + - '@types/snarkjs' - bufferutil + - commander + - supports-color - utf-8-validate - '@semaphore-protocol/data@4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@semaphore-protocol/data@4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@zk-kit/utils': 1.3.0 axios: 1.6.6 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - viem: 2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - debug @@ -11951,35 +12231,48 @@ snapshots: - utf-8-validate - zod - '@semaphore-protocol/group@4.11.1': + '@semaphore-protocol/group@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8': dependencies: '@zk-kit/lean-imt': 2.2.3 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/identity@4.11.1': + '@semaphore-protocol/identity@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef': dependencies: '@zk-kit/baby-jubjub': 1.0.3 '@zk-kit/eddsa-poseidon': 1.0.4 '@zk-kit/utils': 1.3.0 poseidon-lite: 0.3.0 - '@semaphore-protocol/proof@4.11.1(@semaphore-protocol/group@4.11.1)(@semaphore-protocol/identity@4.11.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@semaphore-protocol/proof@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/d8989c48201f05245965f992e4fc4f0bddb7725e(@semaphore-protocol/group@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8)(@semaphore-protocol/identity@https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef)(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10)': dependencies: - '@semaphore-protocol/group': 4.11.1 - '@semaphore-protocol/identity': 4.11.1 - '@semaphore-protocol/utils': 4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@zk-kit/artifacts': 1.8.0 + '@aztec/bb.js': 0.82.2 + '@noir-lang/noir_js': 1.0.0-beta.3 + '@noir-lang/noir_wasm': 1.0.0-beta.3 + '@semaphore-protocol/group': https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/8c41614a00c121ec96e07d73145dc542739eefa8 + '@semaphore-protocol/identity': https://codeload.github.com/hmzakhalid/semaphore-noir/tar.gz/4137e5d6cf645af3fc8eb720b6c8ee33a125d0ef + '@semaphore-protocol/utils': 4.9.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@zk-kit/artifacts': https://codeload.github.com/hmzakhalid/snark-artifacts/tar.gz/a8eb62a0e3f1d4917f7895bf4511ee1f7f221dc3(@types/snarkjs@0.7.9)(commander@13.1.0) '@zk-kit/utils': 1.3.0 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) snarkjs: 0.7.4 transitivePeerDependencies: + - '@types/snarkjs' - bufferutil + - commander + - supports-color - utf-8-validate '@semaphore-protocol/utils@4.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@semaphore-protocol/utils@4.9.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12051,54 +12344,54 @@ snapshots: '@solidity-parser/parser@0.20.1': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.27.4)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.27.7 - '@svgr/babel-preset@8.1.0(@babel/core@7.27.4)': + '@svgr/babel-preset@8.1.0(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.4) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.27.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.7) '@svgr/core@8.1.0(typescript@5.8.3)': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.7) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@5.8.3) snake-case: 3.0.4 @@ -12108,13 +12401,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': dependencies: - '@babel/core': 7.27.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.27.7) '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 @@ -12130,14 +12423,14 @@ snapshots: transitivePeerDependencies: - typescript - '@svgr/rollup@8.1.0(rollup@4.41.1)(typescript@5.8.3)': + '@svgr/rollup@8.1.0(rollup@4.44.1)(typescript@5.8.3)': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + '@babel/core': 7.27.7 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.7) + '@babel/preset-env': 7.27.2(@babel/core@7.27.7) + '@babel/preset-react': 7.27.1(@babel/core@7.27.7) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) + '@rollup/pluginutils': 5.2.0(rollup@4.44.1) '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) @@ -12146,51 +12439,51 @@ snapshots: - supports-color - typescript - '@swc/core-darwin-arm64@1.11.31': + '@swc/core-darwin-arm64@1.12.7': optional: true - '@swc/core-darwin-x64@1.11.31': + '@swc/core-darwin-x64@1.12.7': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.31': + '@swc/core-linux-arm-gnueabihf@1.12.7': optional: true - '@swc/core-linux-arm64-gnu@1.11.31': + '@swc/core-linux-arm64-gnu@1.12.7': optional: true - '@swc/core-linux-arm64-musl@1.11.31': + '@swc/core-linux-arm64-musl@1.12.7': optional: true - '@swc/core-linux-x64-gnu@1.11.31': + '@swc/core-linux-x64-gnu@1.12.7': optional: true - '@swc/core-linux-x64-musl@1.11.31': + '@swc/core-linux-x64-musl@1.12.7': optional: true - '@swc/core-win32-arm64-msvc@1.11.31': + '@swc/core-win32-arm64-msvc@1.12.7': optional: true - '@swc/core-win32-ia32-msvc@1.11.31': + '@swc/core-win32-ia32-msvc@1.12.7': optional: true - '@swc/core-win32-x64-msvc@1.11.31': + '@swc/core-win32-x64-msvc@1.12.7': optional: true - '@swc/core@1.11.31': + '@swc/core@1.12.7': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.31 - '@swc/core-darwin-x64': 1.11.31 - '@swc/core-linux-arm-gnueabihf': 1.11.31 - '@swc/core-linux-arm64-gnu': 1.11.31 - '@swc/core-linux-arm64-musl': 1.11.31 - '@swc/core-linux-x64-gnu': 1.11.31 - '@swc/core-linux-x64-musl': 1.11.31 - '@swc/core-win32-arm64-msvc': 1.11.31 - '@swc/core-win32-ia32-msvc': 1.11.31 - '@swc/core-win32-x64-msvc': 1.11.31 + '@swc/core-darwin-arm64': 1.12.7 + '@swc/core-darwin-x64': 1.12.7 + '@swc/core-linux-arm-gnueabihf': 1.12.7 + '@swc/core-linux-arm64-gnu': 1.12.7 + '@swc/core-linux-arm64-musl': 1.12.7 + '@swc/core-linux-x64-gnu': 1.12.7 + '@swc/core-linux-x64-musl': 1.12.7 + '@swc/core-win32-arm64-msvc': 1.12.7 + '@swc/core-win32-ia32-msvc': 1.12.7 + '@swc/core-win32-x64-msvc': 1.12.7 '@swc/counter@0.1.3': {} @@ -12199,18 +12492,18 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.8.1 - '@swc/types@0.1.21': + '@swc/types@0.1.23': dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12220,7 +12513,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)': + '@synthetixio/synpress-cache@0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -12231,7 +12524,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.11.31)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + tsup: 8.0.2(@swc/core@1.12.7)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -12248,10 +12541,10 @@ snapshots: dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -12268,10 +12561,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -12288,14 +12581,14 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.11.31)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.11.31)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12316,28 +12609,28 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) - '@tanstack/query-core@5.80.5': {} + '@tanstack/query-core@5.81.2': {} - '@tanstack/react-query@5.80.5(react@18.3.1)': + '@tanstack/react-query@5.81.2(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.80.5 + '@tanstack/query-core': 5.81.2 react: 18.3.1 - '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.13.9 + '@tanstack/virtual-core': 3.13.11 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.13.9': {} + '@tanstack/virtual-core@3.13.11': {} '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: @@ -12352,15 +12645,15 @@ snapshots: npm-to-yarn: 2.2.1 unist-util-visit: 5.0.0 - '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3)': + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.27.5 + '@babel/parser': 7.27.7 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 lodash: 4.17.21 - prettier: 3.5.3 + prettier: 3.6.1 transitivePeerDependencies: - supports-color @@ -12374,68 +12667,59 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - typescript: 5.8.3 - - '@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + '@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.27.7 + '@babel/types': 7.27.7 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.27.7 + '@babel/types': 7.27.7 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.27.7 - '@types/bn.js@5.1.6': + '@types/bn.js@5.2.0': dependencies: '@types/node': 20.10.4 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 '@types/node': 20.10.4 @@ -12468,22 +12752,22 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.0.6': dependencies: '@types/node': 20.10.4 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@5.0.2': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 + '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 + '@types/serve-static': 1.15.8 '@types/form-data@0.0.33': dependencies: @@ -12509,7 +12793,7 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/js-yaml@4.0.9': {} @@ -12543,6 +12827,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.10.4 + '@types/node@10.17.60': {} '@types/node@12.20.55': {} @@ -12551,6 +12839,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.15.33': + dependencies: + undici-types: 6.21.0 + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -12565,7 +12857,7 @@ snapshots: '@types/prettier@2.7.3': {} - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.15': {} '@types/qs@6.14.0': {} @@ -12581,7 +12873,7 @@ snapshots: '@types/react@18.3.23': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 csstype: 3.1.3 '@types/resolve@0.0.8': @@ -12592,16 +12884,18 @@ snapshots: dependencies: '@types/node': 20.10.4 - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 '@types/node': 20.10.4 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 + '@types/http-errors': 2.0.5 '@types/node': 20.10.4 - '@types/send': 0.17.4 + '@types/send': 0.17.5 + + '@types/snarkjs@0.7.9': {} '@types/tinycolor2@1.4.6': {} @@ -12611,6 +12905,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/wrap-ansi@3.0.0': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -12641,7 +12937,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12657,7 +12953,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12671,7 +12967,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12711,28 +13007,28 @@ snapshots: - debug - utf-8-validate - '@vitejs/plugin-react@4.5.1(vite@5.4.19(@types/node@22.7.5))': + '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@22.15.33))': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) - '@rolldown/pluginutils': 1.0.0-beta.9 + '@babel/core': 7.27.7 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.7) + '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.15.33) transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': + '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': dependencies: - '@coinbase/wallet-sdk': 4.3.0 + '@coinbase/wallet-sdk': 4.3.3 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -12762,16 +13058,16 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)': + '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': dependencies: - '@coinbase/wallet-sdk': 4.3.0 + '@coinbase/wallet-sdk': 4.3.3 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -12801,14 +13097,14 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': + '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.80.5 + '@tanstack/query-core': 5.81.2 typescript: 5.8.3 transitivePeerDependencies: - '@types/react' @@ -12816,14 +13112,14 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))': + '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: - '@tanstack/query-core': 5.80.5 + '@tanstack/query-core': 5.81.2 typescript: 5.8.3 transitivePeerDependencies: - '@types/react' @@ -12831,7 +13127,7 @@ snapshots: - react - use-sync-external-store - '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12845,7 +13141,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12874,7 +13170,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -12888,7 +13184,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -12921,18 +13217,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@reown/appkit': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@reown/appkit': 1.7.8(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/types': 2.21.1 - '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13053,16 +13349,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13088,16 +13384,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: - '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13183,7 +13479,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -13192,9 +13488,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/types': 2.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -13222,7 +13518,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -13231,9 +13527,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@walletconnect/types': 2.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -13261,7 +13557,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -13279,7 +13575,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13304,7 +13600,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': + '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -13322,7 +13618,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13356,7 +13652,18 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@zk-kit/artifacts@1.8.0': {} + '@zk-kit/artifacts@https://codeload.github.com/hmzakhalid/snark-artifacts/tar.gz/a8eb62a0e3f1d4917f7895bf4511ee1f7f221dc3(@types/snarkjs@0.7.9)(commander@13.1.0)': + dependencies: + '@commander-js/extra-typings': 12.1.0(commander@13.1.0) + '@inquirer/input': 2.3.0 + '@inquirer/select': 2.5.0 + '@noir-lang/noir_js': 1.0.0-beta.3 + circomkit: 0.2.1(@types/snarkjs@0.7.9)(snarkjs@0.7.4) + ora: 5.4.1 + snarkjs: 0.7.4 + transitivePeerDependencies: + - '@types/snarkjs' + - commander '@zk-kit/baby-jubjub@1.0.3': dependencies: @@ -13391,35 +13698,35 @@ snapshots: abbrev@1.0.9: {} - abitype@1.0.0(typescript@5.8.3)(zod@3.25.51): + abitype@1.0.0(typescript@5.8.3)(zod@3.25.67): optionalDependencies: typescript: 5.8.3 - zod: 3.25.51 + zod: 3.25.67 abitype@1.0.8(typescript@5.8.3)(zod@3.22.4): optionalDependencies: typescript: 5.8.3 zod: 3.22.4 - abitype@1.0.8(typescript@5.8.3)(zod@3.25.51): + abitype@1.0.8(typescript@5.8.3)(zod@3.25.67): optionalDependencies: typescript: 5.8.3 - zod: 3.25.51 + zod: 3.25.67 accepts@2.0.0: dependencies: mime-types: 3.0.1 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} add@2.0.6: {} @@ -13431,7 +13738,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13556,14 +13863,14 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.4): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001721 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001726 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -13582,26 +13889,26 @@ snapshots: transitivePeerDependencies: - debug - axios@1.6.6: + axios@1.10.0: dependencies: follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.6.7: + axios@1.6.6: dependencies: follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.9.0: + axios@1.6.7: dependencies: follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -13614,38 +13921,38 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.7): dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/compat-data': 7.27.7 + '@babel/core': 7.27.7 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.7): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.42.0 + '@babel/core': 7.27.7 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.7) + core-js-compat: 3.43.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.7): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/core': 7.27.7 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): dependencies: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -13697,6 +14004,12 @@ snapshots: buffers: 0.1.1 chainsaw: 0.1.0 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blake2b-wasm@2.4.0: dependencies: b4a: 1.6.7 @@ -13718,7 +14031,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -13743,12 +14056,12 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -13811,12 +14124,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.25.0: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001721 - electron-to-chromium: 1.5.165 + caniuse-lite: 1.0.30001726 + electron-to-chromium: 1.5.176 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs58@4.0.1: dependencies: @@ -13882,7 +14195,7 @@ snapshots: http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.2 responselike: 3.0.0 call-bind-apply-helpers@1.0.2: @@ -13912,7 +14225,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001721: {} + caniuse-lite@1.0.30001726: {} caseless@0.12.0: {} @@ -13988,6 +14301,8 @@ snapshots: check-types@11.2.3: {} + child_process@1.0.2: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -14015,14 +14330,43 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + circom_runtime@0.1.21: + dependencies: + ffjavascript: 0.2.56 + circom_runtime@0.1.25: dependencies: ffjavascript: 0.3.0 + circom_tester@0.0.19: + dependencies: + chai: 4.5.0 + child_process: 1.0.2 + ffjavascript: 0.2.63 + fnv-plus: 1.3.1 + r1csfile: 0.0.41 + snarkjs: 0.5.0 + tmp-promise: 3.0.3 + util: 0.12.5 + + circomkit@0.2.1(@types/snarkjs@0.7.9)(snarkjs@0.7.4): + dependencies: + '@types/snarkjs': 0.7.9 + circom_tester: 0.0.19 + commander: 12.1.0 + loglevel: 1.9.2 + snarkjs: 0.7.4 + clean-stack@2.2.0: {} cli-boxes@2.2.1: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + cli-table3@0.5.1: dependencies: object-assign: 4.1.1 @@ -14036,6 +14380,8 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-width@4.1.0: {} + client-only@0.0.1: {} clipboardy@1.2.2: @@ -14067,6 +14413,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + clone@1.0.4: {} + clsx@1.2.1: {} clsx@2.1.1: {} @@ -14148,7 +14496,7 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 - concurrently@9.1.2: + concurrently@9.2.0: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -14163,12 +14511,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) + '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14176,19 +14524,19 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is - connectkit@1.9.0(@babel/core@7.27.4)(@tanstack/react-query@5.80.5(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) + '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)) + family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14196,9 +14544,9 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is @@ -14225,9 +14573,9 @@ snapshots: cookie@0.7.2: {} - core-js-compat@3.42.0: + core-js-compat@3.43.0: dependencies: - browserslist: 4.25.0 + browserslist: 4.25.1 core-util-is@1.0.3: {} @@ -14259,6 +14607,13 @@ snapshots: bn.js: 4.12.2 elliptic: 6.6.1 + create-hash@1.1.3: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.11 + create-hash@1.2.0: dependencies: cipher-base: 1.0.6 @@ -14322,7 +14677,7 @@ snapshots: diffie-hellman: 5.0.3 hash-base: 3.0.5 inherits: 2.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 @@ -14570,7 +14925,7 @@ snapshots: decamelize@4.0.0: {} - decode-named-character-reference@1.1.0: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -14590,6 +14945,10 @@ snapshots: deepmerge@4.3.1: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -14692,7 +15051,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - dotenv@16.5.0: {} + dotenv@16.6.0: {} dunder-proto@1.0.1: dependencies: @@ -14706,7 +15065,7 @@ snapshots: duplexify@4.1.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 @@ -14717,7 +15076,7 @@ snapshots: dependencies: '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 ee-first@1.1.1: {} @@ -14726,7 +15085,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.165: {} + electron-to-chromium@1.5.176: {} elkjs@0.9.3: {} @@ -14752,7 +15111,7 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -14777,7 +15136,7 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: {} + entities@6.0.1: {} env-paths@2.2.1: {} @@ -14940,7 +15299,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14972,8 +15331,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@1.2.2: {} @@ -14998,7 +15357,7 @@ snapshots: estree-util-attach-comments@2.1.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx@2.2.2: dependencies: @@ -15018,7 +15377,7 @@ snapshots: estree-util-value-to-estree@3.4.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-visit@1.2.1: dependencies: @@ -15029,7 +15388,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -15048,7 +15407,7 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.9.0 + axios: 1.10.0 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -15097,7 +15456,7 @@ snapshots: create-hmac: 1.1.7 hash.js: 1.1.7 keccak: 3.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 randombytes: 2.1.0 safe-buffer: 5.2.1 scrypt-js: 3.0.1 @@ -15120,7 +15479,7 @@ snapshots: ethereumjs-util@7.1.5: dependencies: - '@types/bn.js': 5.1.6 + '@types/bn.js': 5.2.0 bn.js: 5.2.2 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -15175,7 +15534,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -15248,7 +15607,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15266,7 +15625,7 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: @@ -15291,19 +15650,19 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) - family@0.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51)): + family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - wagmi: 2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) fast-deep-equal@3.1.3: {} @@ -15337,10 +15696,22 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 + ffjavascript@0.2.56: + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.0 + web-worker: 1.5.0 + + ffjavascript@0.2.63: + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.2 + web-worker: 1.2.0 + ffjavascript@0.3.0: dependencies: wasmbuilder: 0.0.16 @@ -15373,12 +15744,12 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -15420,11 +15791,13 @@ snapshots: dependencies: imul: 1.0.1 + fnv-plus@1.3.1: {} + focus-visible@5.2.1: {} follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -15445,11 +15818,12 @@ snapshots: mime-types: 2.1.35 safe-buffer: 5.2.1 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 format@0.2.2: {} @@ -15737,7 +16111,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 + node-mock-http: 1.0.1 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -15768,10 +16142,10 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - form-data: 4.0.2 + form-data: 4.0.3 fs-extra: 10.1.0 match-all: 1.2.7 murmur-128: 0.2.1 @@ -15782,11 +16156,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15794,11 +16168,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -15806,24 +16180,24 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 '@ethersproject/units': 5.8.0 '@solidity-parser/parser': 0.20.1 - axios: 1.9.0 + axios: 1.10.0 brotli-wasm: 2.0.1 chalk: 4.1.2 cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.4.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - debug @@ -15831,14 +16205,14 @@ snapshots: - utf-8-validate - zod - hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/edr': 0.11.2 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 + '@types/bn.js': 5.2.0 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 @@ -15846,7 +16220,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15875,21 +16249,21 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/edr': 0.11.2 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 + '@types/bn.js': 5.2.0 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 @@ -15897,7 +16271,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15926,7 +16300,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil @@ -15951,6 +16325,10 @@ snapshots: dependencies: has-symbols: 1.1.0 + hash-base@2.0.2: + dependencies: + inherits: 2.0.4 + hash-base@3.0.5: dependencies: inherits: 2.0.4 @@ -16038,7 +16416,7 @@ snapshots: hast-util-to-estree@2.3.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 '@types/unist': 2.0.11 @@ -16058,7 +16436,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -16070,7 +16448,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.16 + style-to-js: 1.1.17 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -16180,7 +16558,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16316,6 +16694,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@1.0.0: {} + is-nan@1.3.2: dependencies: call-bind: 1.0.8 @@ -16335,7 +16715,7 @@ snapshots: is-reference@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -16368,6 +16748,8 @@ snapshots: isarray@1.0.0: {} + isarray@2.0.5: {} + isexe@2.0.0: {} isomorphic-timers-promises@1.0.1: {} @@ -16593,6 +16975,8 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + loglevel@1.9.2: {} + logplease@1.2.15: {} longest-streak@3.1.0: {} @@ -16681,7 +17065,7 @@ snapshots: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.11 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 mdast-util-to-string: 3.2.0 micromark: 3.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 @@ -16698,7 +17082,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -16964,7 +17348,7 @@ snapshots: micromark-core-commonmark@1.1.0: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-factory-destination: 1.1.0 micromark-factory-label: 1.1.0 micromark-factory-space: 1.1.0 @@ -16983,7 +17367,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -17070,7 +17454,7 @@ snapshots: micromark-extension-mdx-expression@1.0.8: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -17082,7 +17466,7 @@ snapshots: micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 @@ -17098,7 +17482,7 @@ snapshots: micromark-extension-mdxjs-esm@1.0.5: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 micromark-core-commonmark: 1.1.0 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 @@ -17110,8 +17494,8 @@ snapshots: micromark-extension-mdxjs@1.0.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -17147,7 +17531,7 @@ snapshots: micromark-factory-mdx-expression@1.0.9: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 micromark-util-symbol: 1.1.0 @@ -17244,14 +17628,14 @@ snapshots: micromark-util-decode-string@1.1.0: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -17263,7 +17647,7 @@ snapshots: micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/unist': 2.0.11 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 @@ -17328,8 +17712,8 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) - decode-named-character-reference: 1.1.0 + debug: 4.4.1(supports-color@8.1.1) + decode-named-character-reference: 1.2.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -17350,8 +17734,8 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) - decode-named-character-reference: 1.1.0 + debug: 4.4.1(supports-color@8.1.1) + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -17405,15 +17789,15 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -17479,6 +17863,8 @@ snapshots: fmix: 0.1.0 imul: 1.0.1 + mute-stream@1.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -17514,45 +17900,45 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-seo@6.8.0(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.29 + '@next/env': 14.2.30 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001721 + caniuse-lite: 1.0.30001726 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.29 - '@next/swc-darwin-x64': 14.2.29 - '@next/swc-linux-arm64-gnu': 14.2.29 - '@next/swc-linux-arm64-musl': 14.2.29 - '@next/swc-linux-x64-gnu': 14.2.29 - '@next/swc-linux-x64-musl': 14.2.29 - '@next/swc-win32-arm64-msvc': 14.2.29 - '@next/swc-win32-ia32-msvc': 14.2.29 - '@next/swc-win32-x64-msvc': 14.2.29 + '@next/swc-darwin-arm64': 14.2.30 + '@next/swc-darwin-x64': 14.2.30 + '@next/swc-linux-arm64-gnu': 14.2.30 + '@next/swc-linux-arm64-musl': 14.2.30 + '@next/swc-linux-x64-gnu': 14.2.30 + '@next/swc-linux-x64-musl': 14.2.30 + '@next/swc-win32-arm64-msvc': 14.2.30 + '@next/swc-win32-ia32-msvc': 14.2.30 + '@next/swc-win32-x64-msvc': 14.2.30 '@playwright/test': 1.52.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -17563,16 +17949,16 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.8.0(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.8.0(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 - zod: 3.25.51 + zod: 3.25.67 - nextra@2.13.4(next@14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra@2.13.4(next@14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 @@ -17586,7 +17972,7 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.22 lodash.get: 4.4.2 - next: 14.2.29(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.30(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 @@ -17602,7 +17988,7 @@ snapshots: title: 3.5.3 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 - zod: 3.25.51 + zod: 3.25.67 transitivePeerDependencies: - supports-color @@ -17627,7 +18013,7 @@ snapshots: node-gyp-build@4.8.4: {} - node-mock-http@1.0.0: {} + node-mock-http@1.0.1: {} node-releases@2.0.19: {} @@ -17673,7 +18059,7 @@ snapshots: normalize-range@0.1.2: {} - normalize-url@8.0.1: {} + normalize-url@8.0.2: {} npm-run-path@2.0.2: dependencies: @@ -17700,7 +18086,7 @@ snapshots: obj-multiplex@1.0.0: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 readable-stream: 2.3.8 @@ -17770,6 +18156,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + ordinal@1.0.3: {} os-browserify@0.3.0: {} @@ -17778,25 +18176,25 @@ snapshots: outdent@0.5.0: {} - ox@0.6.7(typescript@5.8.3)(zod@3.25.51): + ox@0.6.7(typescript@5.8.3)(zod@3.25.67): dependencies: '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.3)(zod@3.22.4): + ox@0.8.1(typescript@5.8.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 @@ -17807,15 +18205,15 @@ snapshots: transitivePeerDependencies: - zod - ox@0.7.1(typescript@5.8.3)(zod@3.25.51): + ox@0.8.1(typescript@5.8.3)(zod@3.25.67): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -17881,7 +18279,7 @@ snapshots: browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 hash-base: 3.0.5 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 safe-buffer: 5.2.1 parse-cache-control@1.0.1: {} @@ -17900,7 +18298,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -17924,7 +18322,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 parseurl@1.3.3: {} @@ -17953,17 +18351,18 @@ snapshots: pathval@1.1.1: {} - pbkdf2@3.1.2: + pbkdf2@3.1.3: dependencies: - create-hash: 1.2.0 + create-hash: 1.1.3 create-hmac: 1.1.7 - ripemd160: 2.0.2 + ripemd160: 2.0.1 safe-buffer: 5.2.1 sha.js: 2.4.11 + to-buffer: 1.2.1 periscopic@3.1.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 3.0.3 is-reference: 3.0.3 @@ -18039,29 +18438,29 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.4): + postcss-import@15.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.4): + postcss-js@4.0.1(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.4 + postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.0 optionalDependencies: - postcss: 8.5.4 - ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3) + postcss: 8.5.6 + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) - postcss-nested@6.2.0(postcss@8.5.4): + postcss-nested@6.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -18082,13 +18481,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.4: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.8: {} + preact@10.26.9: {} prelude-ls@1.1.2: {} @@ -18098,21 +18497,21 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.4.3(prettier@3.5.3): + prettier-plugin-solidity@1.4.3(prettier@3.6.1): dependencies: '@solidity-parser/parser': 0.20.1 - prettier: 3.5.3 + prettier: 3.6.1 semver: 7.7.2 - prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.3))(prettier@3.5.3): + prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1))(prettier@3.6.1): dependencies: - prettier: 3.5.3 + prettier: 3.6.1 optionalDependencies: - '@trivago/prettier-plugin-sort-imports': 4.3.0(prettier@3.5.3) + '@trivago/prettier-plugin-sort-imports': 4.3.0(prettier@3.6.1) prettier@2.8.8: {} - prettier@3.5.3: {} + prettier@3.6.1: {} prismjs@1.27.0: {} @@ -18167,9 +18566,9 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@1.4.1: {} @@ -18210,6 +18609,13 @@ snapshots: quick-lru@5.1.1: {} + r1csfile@0.0.41: + dependencies: + '@iden3/bigarray': 0.0.2 + '@iden3/binfileutils': 0.0.11 + fastfile: 0.0.20 + ffjavascript: 0.2.56 + r1csfile@0.0.48: dependencies: '@iden3/bigarray': 0.0.2 @@ -18529,6 +18935,11 @@ snapshots: dependencies: lowercase-keys: 3.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + reusify@1.1.0: {} rimraf@2.7.1: @@ -18543,6 +18954,11 @@ snapshots: dependencies: glob: 10.4.5 + ripemd160@2.0.1: + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 @@ -18554,35 +18970,35 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.41.1: + rollup@4.44.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.41.1 - '@rollup/rollup-android-arm64': 4.41.1 - '@rollup/rollup-darwin-arm64': 4.41.1 - '@rollup/rollup-darwin-x64': 4.41.1 - '@rollup/rollup-freebsd-arm64': 4.41.1 - '@rollup/rollup-freebsd-x64': 4.41.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 - '@rollup/rollup-linux-arm-musleabihf': 4.41.1 - '@rollup/rollup-linux-arm64-gnu': 4.41.1 - '@rollup/rollup-linux-arm64-musl': 4.41.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 - '@rollup/rollup-linux-riscv64-gnu': 4.41.1 - '@rollup/rollup-linux-riscv64-musl': 4.41.1 - '@rollup/rollup-linux-s390x-gnu': 4.41.1 - '@rollup/rollup-linux-x64-gnu': 4.41.1 - '@rollup/rollup-linux-x64-musl': 4.41.1 - '@rollup/rollup-win32-arm64-msvc': 4.41.1 - '@rollup/rollup-win32-ia32-msvc': 4.41.1 - '@rollup/rollup-win32-x64-msvc': 4.41.1 + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 router@2.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -18664,7 +19080,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -18674,7 +19090,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -18824,6 +19240,19 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + snarkjs@0.5.0: + dependencies: + '@iden3/binfileutils': 0.0.11 + bfj: 7.1.0 + blake2b-wasm: 2.4.0 + circom_runtime: 0.1.21 + ejs: 3.1.10 + fastfile: 0.0.20 + ffjavascript: 0.2.56 + js-sha3: 0.8.0 + logplease: 1.2.15 + r1csfile: 0.0.41 + snarkjs@0.7.4: dependencies: '@iden3/binfileutils': 0.0.12 @@ -18855,7 +19284,7 @@ snapshots: transitivePeerDependencies: - supports-color - solady@0.1.19: {} + solady@0.1.22: {} solady@0.1.4: {} @@ -18871,12 +19300,12 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.5.3))(prettier@3.5.3): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.6.1))(prettier@3.6.1): dependencies: - '@prettier/sync': 0.3.0(prettier@3.5.3) - prettier: 3.5.3 + '@prettier/sync': 0.3.0(prettier@3.6.1) + prettier: 3.6.1 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.3(prettier@3.5.3) + prettier-plugin-solidity: 1.4.3(prettier@3.6.1) solhint@5.1.0(typescript@5.8.3): dependencies: @@ -18903,7 +19332,7 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -18914,7 +19343,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -18926,7 +19355,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -18937,7 +19366,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -19008,6 +19437,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + stream-browserify@3.0.0: dependencies: inherits: 2.0.4 @@ -19098,15 +19529,15 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - style-to-js@1.1.16: + style-to-js@1.1.17: dependencies: - style-to-object: 1.0.8 + style-to-object: 1.0.9 style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - style-to-object@1.0.8: + style-to-object@1.0.9: dependencies: inline-style-parser: 0.2.4 @@ -19115,14 +19546,14 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.7(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.27.4)(styled-components@5.3.11(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -19213,7 +19644,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19229,11 +19660,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.4 - postcss-import: 15.1.0(postcss@8.5.4) - postcss-js: 4.0.1(postcss@8.5.4) - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) - postcss-nested: 6.2.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -19291,7 +19722,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 tinygradient@1.1.5: @@ -19308,10 +19739,22 @@ snapshots: titleize@1.0.0: {} + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.3: {} + + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -19373,7 +19816,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -19381,7 +19824,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.10.4 - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -19391,17 +19834,17 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.31 + '@swc/core': 1.12.7 - ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 - acorn: 8.14.1 + '@types/node': 22.15.33 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -19411,7 +19854,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.31 + '@swc/core': 1.12.7 tsconfck@3.1.6(typescript@5.8.3): optionalDependencies: @@ -19425,25 +19868,25 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.11.31)(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3): + tsup@8.0.2(@swc/core@1.12.7)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3): dependencies: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.4)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) resolve-from: 5.0.0 - rollup: 4.41.1 + rollup: 4.44.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.11.31 - postcss: 8.5.4 + '@swc/core': 1.12.7 + postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -19478,7 +19921,7 @@ snapshots: typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19491,6 +19934,12 @@ snapshots: transitivePeerDependencies: - supports-color + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-rpc@6.1.1: {} typedarray@0.0.6: {} @@ -19520,6 +19969,8 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.21.0: {} + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -19677,9 +20128,9 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -19775,15 +20226,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.3)(zod@3.25.51) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.67) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -19792,15 +20243,15 @@ snapshots: - utf-8-validate - zod - viem@2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + viem@2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.3)(zod@3.25.51) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.67) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -19809,15 +20260,15 @@ snapshots: - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.3)(zod@3.22.4) + ox: 0.8.1(typescript@5.8.3)(zod@3.22.4) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -19826,15 +20277,15 @@ snapshots: - utf-8-validate - zod - viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.51) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.3)(zod@3.25.51) + ox: 0.8.1(typescript@5.8.3)(zod@3.25.67) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -19843,14 +20294,14 @@ snapshots: - utf-8-validate - zod - viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.3)(zod@3.25.51) + abitype: 1.0.0(typescript@5.8.3)(zod@3.25.67) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: @@ -19860,46 +20311,46 @@ snapshots: - utf-8-validate - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-node-polyfills@0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.41.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.44.1) node-stdlib-browser: 1.3.1 - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.15.33) transitivePeerDependencies: - rollup - vite-plugin-top-level-await@1.5.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-top-level-await@1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.41.1) - '@swc/core': 1.11.31 + '@rollup/plugin-virtual': 3.0.2(rollup@4.44.1) + '@swc/core': 1.12.7 uuid: 10.0.0 - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.15.33) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.7.5)): + vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.15.33)): dependencies: - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.15.33) - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 5.4.19(@types/node@22.7.5) + vite: 5.4.19(@types/node@22.15.33) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@22.7.5): + vite@5.4.19(@types/node@22.15.33): dependencies: esbuild: 0.21.5 - postcss: 8.5.4 - rollup: 4.41.1 + postcss: 8.5.6 + rollup: 4.44.1 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 22.15.33 fsevents: 2.3.3 vm-browserify@1.1.2: {} @@ -19908,14 +20359,14 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): + wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) - '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@tanstack/react-query': 5.81.2(react@18.3.1) + '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -19946,14 +20397,14 @@ snapshots: - utf-8-validate - zod - wagmi@2.15.5(@tanstack/query-core@5.80.5)(@tanstack/react-query@5.80.5(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51): + wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): dependencies: - '@tanstack/react-query': 5.80.5(react@18.3.1) - '@wagmi/connectors': 5.8.4(@types/react@18.3.23)(@wagmi/core@2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51))(zod@3.25.51) - '@wagmi/core': 2.17.2(@tanstack/query-core@5.80.5)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)) + '@tanstack/react-query': 5.81.2(react@18.3.1) + '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -19986,7 +20437,7 @@ snapshots: wait-on@8.0.3: dependencies: - axios: 1.9.0 + axios: 1.10.0 joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -20002,10 +20453,18 @@ snapshots: wasmbuilder@0.0.16: {} + wasmcurves@0.2.0: + dependencies: + wasmbuilder: 0.0.16 + wasmcurves@0.2.2: dependencies: wasmbuilder: 0.0.16 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} web-worker@1.2.0: {} @@ -20211,13 +20670,15 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.2: {} + zksync-ethers@5.10.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod@3.22.4: {} - zod@3.25.51: {} + zod@3.25.67: {} zustand@5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): optionalDependencies: From c3d9d34e4e3858d3e4eac73c300132af6f332cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 30 Jun 2025 13:15:40 +0000 Subject: [PATCH 100/106] Integration test and cleanup (#558) * Build sdk package so that hardhat uses a separate tsconfig * Linting * Linting * Update moduleResolution * Update packages * Ensure that LSP can respect the correct tsconfig * Tidy up eslint * Tidy up eslint * Add package to Dockerfile * Fix up issues with docker build for ciphernodes * Update Dockerfile * Fix up warnings * Linting * Fix warnings * Update viem dependency * Get test to pass * Add rust to workflow * Add compiling sdk and lwasm to be part of the build process * Add wasm-pack * Install with wasm * Rename * Fix pnpm version * Test template integration * update names * Lowercase * Actually fail when failing * Use lines * Build sdk before testing * linting * linting * Add submodules to template * Add submodules recursive to template * Add permissions to folders * Ensure ImageID.sol is writable * Attempt to open up permissions on ImageID.sol * Attempt to open up permissions on ImageID.sol --- .github/workflows/ci.yml | 11 + ...rt-docker.yml => template-and-support.yml} | 42 +- Cargo.lock | 13 + Cargo.toml | 1 + crates/Dockerfile | 20 +- crates/bfv-helpers/Cargo.toml | 3 +- crates/bfv-helpers/src/client.rs | 31 + crates/bfv-helpers/src/lib.rs | 3 + crates/cli/src/cli.rs | 2 +- crates/config/src/app_config.rs | 6 - .../entrypoint/src/start/aggregator_start.rs | 1 - crates/entrypoint/src/start/start.rs | 1 - crates/events/src/eventbus.rs | 2 +- crates/evm-helpers/src/contracts.rs | 5 +- crates/evm-helpers/src/listener.rs | 2 +- crates/indexer/src/traits.rs | 4 +- crates/init/src/package_json.rs | 2 + crates/init/src/pkgman.rs | 2 + crates/net/src/bin/p2p_test.rs | 7 +- crates/net/src/dialer.rs | 3 +- crates/net/src/network_manager.rs | 3 +- crates/net/src/network_peer.rs | 37 +- crates/sortition/src/index.rs | 2 +- crates/support/app/src/main.rs | 11 +- crates/wasm/.gitignore | 1 + crates/wasm/Cargo.toml | 18 + crates/wasm/package.json | 33 + crates/wasm/scripts/build.sh | 4 + crates/wasm/src/lib.rs | 10 + examples/CRISP/Dockerfile | 2 + examples/CRISP/apps/client/package.json | 4 +- examples/CRISP/apps/server/Dockerfile | 1 + package.json | 10 +- packages/enclave-react/package.json | 2 +- packages/evm/.eslintrc.yml | 4 +- packages/evm/hardhat.config.ts | 2 +- packages/evm/package.json | 25 +- packages/evm/src/sdk/enclave-sdk.ts | 17 + packages/evm/src/sdk/event-listener.ts | 2 - packages/evm/src/sdk/index.ts | 2 + packages/evm/src/sdk/types.ts | 3 +- packages/evm/src/sdk/wasm.ts | 8 + packages/evm/src/tsconfig.json | 22 + packages/evm/test/fixtures/pubkey.bin | Bin 0 -> 27676 bytes packages/evm/test/sdk.spec.ts | 17 + packages/evm/tsconfig.json | 6 +- pnpm-lock.yaml | 594 ++++++------------ pnpm-workspace.yaml | 1 + rust-toolchain.toml | 1 + templates/default/client/package.json | 2 +- templates/default/contracts/ImageID.sol | 0 templates/default/package.json | 43 +- templates/default/scripts/test_integration.sh | 33 + templates/default/server/index.ts | 43 ++ templates/default/tests/integration.spec.ts | 273 ++++++++ templates/default/tsconfig.json | 7 +- 56 files changed, 896 insertions(+), 508 deletions(-) rename .github/workflows/{support-docker.yml => template-and-support.yml} (64%) create mode 100644 crates/bfv-helpers/src/client.rs create mode 100644 crates/wasm/.gitignore create mode 100644 crates/wasm/Cargo.toml create mode 100644 crates/wasm/package.json create mode 100755 crates/wasm/scripts/build.sh create mode 100644 crates/wasm/src/lib.rs create mode 100644 packages/evm/src/sdk/wasm.ts create mode 100644 packages/evm/src/tsconfig.json create mode 100644 packages/evm/test/fixtures/pubkey.bin create mode 100644 packages/evm/test/sdk.spec.ts mode change 100644 => 100755 templates/default/contracts/ImageID.sol create mode 100755 templates/default/scripts/test_integration.sh create mode 100644 templates/default/tests/integration.spec.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c71f3de08d..68df0f7523 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,17 @@ jobs: - name: "Check out the repo" uses: "actions/checkout@v4" + - name: Install Rust 1.85.0 + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.85.0 + target: wasm32-unknown-unknown + + # required so that we can compile wasm within the sdk + - uses: jetli/wasm-pack-action@v0.4.0 + with: + version: "latest" + - name: "Setup node" uses: actions/setup-node@v3 with: diff --git a/.github/workflows/support-docker.yml b/.github/workflows/template-and-support.yml similarity index 64% rename from .github/workflows/support-docker.yml rename to .github/workflows/template-and-support.yml index c78a6081a7..3c4aca0498 100644 --- a/.github/workflows/support-docker.yml +++ b/.github/workflows/template-and-support.yml @@ -1,4 +1,4 @@ -name: Build Support Dockerfile +name: TEMPLATE on: workflow_dispatch: pull_request: @@ -17,7 +17,7 @@ permissions: packages: write jobs: build: - name: Build & Push Image + name: Compile and push Support Dockerfile runs-on: ubuntu-latest outputs: image_tag: ${{ steps.version.outputs.version }} @@ -63,3 +63,41 @@ jobs: type=gha,mode=max,scope=cargo-git type=gha,mode=max,scope=cargo-target type=gha,mode=max,scope=buildcache + + template_integration: + name: Template Integration + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + targets: wasm32-unknown-unknown + + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + + - name: Install enclave CLI + run: cargo install --path crates/cli --bin enclave + + - name: Install node dependencies + run: pnpm install + + - name: Build the sdk + run: pnpm build + + - name: Test Template + run: cd templates/default && chmod 777 contracts && chmod 777 tests && chmod 777 contracts/ImageID.sol && pnpm test:integration diff --git a/Cargo.lock b/Cargo.lock index 4481c3f791..a8c42bcc7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2535,6 +2535,7 @@ dependencies = [ "fhe", "fhe-traits", "hex", + "rand 0.8.5", ] [[package]] @@ -2940,6 +2941,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "e3-wasm" +version = "0.1.0" +dependencies = [ + "e3-bfv-helpers", + "fhe", + "fhe-traits", + "getrandom 0.2.16", + "rand 0.8.5", + "wasm-bindgen", +] + [[package]] name = "ecdsa" version = "0.16.9" diff --git a/Cargo.toml b/Cargo.toml index a2421ad8f9..0e5191be41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ members = [ "crates/support-scripts", "crates/test-helpers", "crates/tests", + "crates/wasm", ] exclude = [ "examples/CRISP/apps/server", diff --git a/crates/Dockerfile b/crates/Dockerfile index ecc0ee263a..edce6ffb1d 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -1,15 +1,20 @@ FROM node:22 AS evm-builder -WORKDIR /build/packages/evm -COPY ./packages/evm ./ +WORKDIR /build +COPY crates/wasm/package.json ./crates/wasm/package.json +COPY packages/enclave-react ./packages/enclave-react +COPY packages/evm ./packages/evm +COPY pnpm-workspace.yaml . +COPY pnpm-lock.yaml . RUN npm install -g corepack RUN corepack enable -RUN pnpm install && pnpm compile +# We just need the contracts to be compiled here +RUN cd packages/evm && pnpm install && pnpm compile:contracts # Build stage -FROM rust:1.81 AS ciphernode-builder +FROM rust:1.85 AS ciphernode-builder # Force incremental ENV CARGO_INCREMENTAL=1 @@ -33,14 +38,14 @@ COPY crates/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY crates/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml COPY crates/cli/Cargo.toml ./cli/Cargo.toml COPY crates/compute-provider/Cargo.toml ./compute-provider/Cargo.toml -COPY crates/enclaveup/Cargo.toml ./enclaveup/Cargo.toml COPY crates/config/Cargo.toml ./config/Cargo.toml COPY crates/crypto/Cargo.toml ./crypto/Cargo.toml COPY crates/data/Cargo.toml ./data/Cargo.toml +COPY crates/enclaveup/Cargo.toml ./enclaveup/Cargo.toml COPY crates/entrypoint/Cargo.toml ./entrypoint/Cargo.toml COPY crates/events/Cargo.toml ./events/Cargo.toml -COPY crates/evm/Cargo.toml ./evm/Cargo.toml COPY crates/evm-helpers/Cargo.toml ./evm-helpers/Cargo.toml +COPY crates/evm/Cargo.toml ./evm/Cargo.toml COPY crates/fhe/Cargo.toml ./fhe/Cargo.toml COPY crates/fs/Cargo.toml ./fs/Cargo.toml COPY crates/indexer/Cargo.toml ./indexer/Cargo.toml @@ -54,9 +59,8 @@ COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml COPY crates/support-scripts/Cargo.toml ./support-scripts/Cargo.toml COPY crates/test-helpers/Cargo.toml ./test-helpers/Cargo.toml COPY crates/tests/Cargo.toml ./tests/Cargo.toml +COPY crates/wasm/Cargo.toml ./wasm/Cargo.toml - -# COPY ./crates/entrypoint/build.rs ./entrypoint/build.rs RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./entrypoint/build.rs RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./cli/build.rs RUN for d in ./*/ ; do \ diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index 618ee03cf1..1e1bf9ded3 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -11,7 +11,8 @@ alloy-dyn-abi = { workspace = true } alloy-primitives = { workspace = true } fhe-traits.workspace = true fhe_rs.workspace = true +rand.workspace = true +anyhow.workspace = true [dev-dependencies] hex.workspace = true -anyhow.workspace = true diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs new file mode 100644 index 0000000000..cc51c99d0d --- /dev/null +++ b/crates/bfv-helpers/src/client.rs @@ -0,0 +1,31 @@ +use crate::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use anyhow::anyhow; +use anyhow::Result; +use fhe_rs::bfv::Encoding; +use fhe_rs::bfv::Plaintext; +use fhe_rs::bfv::PublicKey; +use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; +use rand::CryptoRng; +use rand::RngCore; + +pub fn bfv_encrypt_u64(data: u64, public_key: Vec, mut rng: R) -> Result> +where + R: RngCore + CryptoRng, +{ + let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + + let pk = PublicKey::from_bytes(&public_key, ¶ms) + .map_err(|e| anyhow!("Error deserializing public key:{e}"))?; + + let input = vec![data]; + let pt = Plaintext::try_encode(&input, Encoding::poly(), ¶ms) + .map_err(|e| anyhow!("Error encoding plaintext: {e}"))?; + + let ct = pk + .try_encrypt(&pt, &mut rng) + .map_err(|e| anyhow!("Error encrypting data: {e}"))?; + + let encrypted_data = ct.to_bytes(); + Ok(encrypted_data) +} diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index df277fa092..3b57a8d4a5 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -1,7 +1,10 @@ +pub mod client; + use alloy_dyn_abi::{DynSolType, DynSolValue}; use alloy_primitives::U256; use fhe_rs::bfv::{BfvParameters, BfvParametersBuilder}; use std::sync::Arc; + /// Predefined BFV parameters for common use cases pub mod params { /// Standard BFV parameters sets diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index efda4b88d2..f7cda6c2ee 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -6,7 +6,7 @@ use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::program::{self, ProgramCommands}; use crate::wallet::WalletCommands; -use crate::{config_set, init, net, nodes_purge, password, purge_all, rev, wallet}; +use crate::{config_set, init, net, password, purge_all, rev, wallet}; use crate::{print_env, start}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; diff --git a/crates/config/src/app_config.rs b/crates/config/src/app_config.rs index 1e7d94dd9a..fd5e93e43f 100644 --- a/crates/config/src/app_config.rs +++ b/crates/config/src/app_config.rs @@ -241,12 +241,6 @@ impl AppConfig { self.node_def().quic_port } - /// Depricated - #[deprecated] - pub fn enable_mdns(&self) -> bool { - false - } - /// Get the config file path pub fn config_file(&self) -> PathBuf { self.paths.config_file() diff --git a/crates/entrypoint/src/start/aggregator_start.rs b/crates/entrypoint/src/start/aggregator_start.rs index 809d827c0b..89ef6707c7 100644 --- a/crates/entrypoint/src/start/aggregator_start.rs +++ b/crates/entrypoint/src/start/aggregator_start.rs @@ -88,7 +88,6 @@ pub async fn execute( config.peers(), &cipher, config.quic_port(), - config.enable_mdns(), repositories.libp2p_keypair(), ) .await?; diff --git a/crates/entrypoint/src/start/start.rs b/crates/entrypoint/src/start/start.rs index 730a8030aa..ca8ac82545 100644 --- a/crates/entrypoint/src/start/start.rs +++ b/crates/entrypoint/src/start/start.rs @@ -86,7 +86,6 @@ pub async fn execute( config.peers(), &cipher, config.quic_port(), - config.enable_mdns(), repositories.libp2p_keypair(), ) .await?; diff --git a/crates/events/src/eventbus.rs b/crates/events/src/eventbus.rs index 89aaedbdc5..62b0d0826f 100644 --- a/crates/events/src/eventbus.rs +++ b/crates/events/src/eventbus.rs @@ -242,7 +242,7 @@ impl Actor for HistoryCollector { impl Handler for HistoryCollector { type Result = E::Result; - fn handle(&mut self, msg: E, ctx: &mut Self::Context) -> Self::Result { + fn handle(&mut self, msg: E, _ctx: &mut Self::Context) -> Self::Result { self.history.push(msg); } } diff --git a/crates/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs index 3541924400..6d40b76d71 100644 --- a/crates/evm-helpers/src/contracts.rs +++ b/crates/evm-helpers/src/contracts.rs @@ -5,11 +5,10 @@ use alloy::{ providers::fillers::{ ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller, }, - providers::{Identity, Provider, ProviderBuilder, RootProvider, WalletProvider}, - rpc::types::{BlockNumberOrTag, TransactionReceipt}, + providers::{Identity, Provider, ProviderBuilder, RootProvider}, + rpc::types::TransactionReceipt, signers::local::PrivateKeySigner, sol, - transports::BoxTransport, }; use async_trait::async_trait; use eyre::Result; diff --git a/crates/evm-helpers/src/listener.rs b/crates/evm-helpers/src/listener.rs index 593529c70c..eb47ae8a59 100644 --- a/crates/evm-helpers/src/listener.rs +++ b/crates/evm-helpers/src/listener.rs @@ -89,7 +89,7 @@ impl EventListener { } pub async fn create_contract_listener(ws_url: &str, contract_address: &str) -> Result { - let provider = Arc::new(ProviderBuilder::new().on_builtin(ws_url).await?); + let provider = Arc::new(ProviderBuilder::new().connect(ws_url).await?); let address = contract_address.parse::
()?; let filter = Filter::new() .address(address) diff --git a/crates/indexer/src/traits.rs b/crates/indexer/src/traits.rs index 0802134ac3..5d107d21f1 100644 --- a/crates/indexer/src/traits.rs +++ b/crates/indexer/src/traits.rs @@ -1,8 +1,6 @@ -use std::fmt::Display; - use async_trait::async_trait; use serde::{de::DeserializeOwned, Serialize}; -use tokio::task::JoinHandle; +use std::fmt::Display; /// Trait for injectable DataStore. Note the implementor must manage interior mutability #[async_trait] diff --git a/crates/init/src/package_json.rs b/crates/init/src/package_json.rs index e493564ecd..350354cd46 100644 --- a/crates/init/src/package_json.rs +++ b/crates/init/src/package_json.rs @@ -4,6 +4,7 @@ use anyhow::Result; use serde_json::{Map, Value}; use tokio::fs; +#[allow(dead_code)] #[derive(Debug, Clone)] pub enum DependencyType { Dependencies, @@ -32,6 +33,7 @@ pub async fn get_version_from_package_json(file_path: &PathBuf) -> Result Result<()> { match dep_type { "dependencies" | "devDependencies" | "peerDependencies" => Ok(()), diff --git a/crates/init/src/pkgman.rs b/crates/init/src/pkgman.rs index 067cef7828..3d106afe9f 100644 --- a/crates/init/src/pkgman.rs +++ b/crates/init/src/pkgman.rs @@ -63,6 +63,7 @@ pub struct PkgMan { cwd: PathBuf, } +#[allow(dead_code)] pub enum PkgManKind { NPM, PNPM, @@ -87,6 +88,7 @@ impl PkgMan { self } + #[allow(dead_code)] pub async fn available(&self) -> bool { self.strategy.available().await } diff --git a/crates/net/src/bin/p2p_test.rs b/crates/net/src/bin/p2p_test.rs index c9a2b1072b..252f9e2393 100644 --- a/crates/net/src/bin/p2p_test.rs +++ b/crates/net/src/bin/p2p_test.rs @@ -32,15 +32,10 @@ async fn main() -> Result<()> { .ok() .and_then(|p| p.parse::().ok()); - let enable_mdns = env::var("ENABLE_MDNS") - .unwrap_or("false".to_string()) - .parse::() - .unwrap(); - let peers: Vec = dial_to.iter().cloned().collect(); let id = libp2p::identity::Keypair::generate_ed25519(); - let mut peer = NetworkPeer::new(&id, peers, udp_port, "test-topic", enable_mdns)?; + let mut peer = NetworkPeer::new(&id, peers, udp_port, "test-topic")?; // Extract input and outputs let tx = peer.tx(); diff --git a/crates/net/src/dialer.rs b/crates/net/src/dialer.rs index bd5274132d..e0539688c9 100644 --- a/crates/net/src/dialer.rs +++ b/crates/net/src/dialer.rs @@ -203,7 +203,8 @@ fn resolve_ipv4(domain: &str) -> Result { Ok(addr.ip().to_string()) } -fn resolve_ipv6(domain: &str) -> Result { +// For if we wish to resolve ipv6 as well (currently disabled) +fn _resolve_ipv6(domain: &str) -> Result { let addr = format!("{}:0", domain) .to_socket_addrs()? .find(|addr| addr.ip().is_ipv6()) diff --git a/crates/net/src/network_manager.rs b/crates/net/src/network_manager.rs index 5fb4bc228e..5f13c1cbda 100644 --- a/crates/net/src/network_manager.rs +++ b/crates/net/src/network_manager.rs @@ -85,7 +85,6 @@ impl NetworkManager { peers: Vec, cipher: &Arc, quic_port: u16, - enable_mdns: bool, repository: Repository>, ) -> Result<(Addr, tokio::task::JoinHandle>, String)> { let topic = "tmp-enclave-gossip-topic"; @@ -101,7 +100,7 @@ impl NetworkManager { // Create peer from keypair let keypair: libp2p::identity::Keypair = ed25519::Keypair::try_from_bytes(&mut bytes)?.try_into()?; - let mut peer = NetworkPeer::new(&keypair, peers, Some(quic_port), topic, enable_mdns)?; + let mut peer = NetworkPeer::new(&keypair, peers, Some(quic_port), topic)?; // Setup and start network manager let rx = peer.rx(); diff --git a/crates/net/src/network_peer.rs b/crates/net/src/network_peer.rs index d801182bca..b8bbf2f88d 100644 --- a/crates/net/src/network_peer.rs +++ b/crates/net/src/network_peer.rs @@ -6,8 +6,7 @@ use libp2p::{ identify::{self, Behaviour as IdentifyBehaviour}, identity::Keypair, kad::{store::MemoryStore, Behaviour as KademliaBehaviour}, - mdns, - swarm::{behaviour::toggle::Toggle, NetworkBehaviour, SwarmEvent}, + swarm::{NetworkBehaviour, SwarmEvent}, Swarm, }; use std::hash::{Hash, Hasher}; @@ -25,7 +24,6 @@ pub struct NodeBehaviour { gossipsub: gossipsub::Behaviour, kademlia: KademliaBehaviour, connection_limits: connection_limits::Behaviour, - mdns: Toggle, identify: IdentifyBehaviour, } @@ -54,7 +52,6 @@ impl NetworkPeer { peers: Vec, udp_port: Option, topic: &str, - enable_mdns: bool, ) -> Result { let (event_tx, _) = broadcast::channel(100); // TODO : tune this param let (cmd_tx, cmd_rx) = mpsc::channel(100); // TODO : tune this param @@ -62,7 +59,7 @@ impl NetworkPeer { let swarm = libp2p::SwarmBuilder::with_existing_identity(id.clone()) .with_tokio() .with_quic() - .with_behaviour(|key| create_mdns_kad_behaviour(enable_mdns, key))? + .with_behaviour(|key| create_kad_behaviour(key))? .build(); // TODO: Use topics to manage network traffic instead of just using a single topic @@ -158,8 +155,7 @@ impl NetworkPeer { } /// Create the libp2p behaviour -fn create_mdns_kad_behaviour( - enable_mdns: bool, +fn create_kad_behaviour( key: &Keypair, ) -> std::result::Result> { let connection_limits = connection_limits::Behaviour::new(ConnectionLimits::default()); @@ -186,22 +182,12 @@ fn create_mdns_kad_behaviour( gossipsub_config, )?; - let mdns = if enable_mdns { - Toggle::from(Some(mdns::tokio::Behaviour::new( - mdns::Config::default(), - key.public().to_peer_id(), - )?)) - } else { - Toggle::from(None) - }; - Ok(NodeBehaviour { gossipsub, kademlia: KademliaBehaviour::new( key.public().to_peer_id(), MemoryStore::new(key.public().to_peer_id()), ), - mdns, connection_limits, identify: identify_config, }) @@ -253,23 +239,6 @@ async fn process_swarm_event( debug!("Kademlia event: {:?}", e); } - SwarmEvent::Behaviour(NodeBehaviourEvent::Mdns(mdns::Event::Discovered(list))) => { - for (peer_id, _multiaddr) in list { - trace!("mDNS discovered a new peer: {peer_id}"); - swarm.behaviour_mut().gossipsub.add_explicit_peer(&peer_id); - } - } - - SwarmEvent::Behaviour(NodeBehaviourEvent::Mdns(mdns::Event::Expired(list))) => { - for (peer_id, _multiaddr) in list { - trace!("mDNS discover peer has expired: {peer_id}"); - swarm - .behaviour_mut() - .gossipsub - .remove_explicit_peer(&peer_id); - } - } - SwarmEvent::Behaviour(NodeBehaviourEvent::Gossipsub(gossipsub::Event::Message { propagation_source: peer_id, message_id: id, diff --git a/crates/sortition/src/index.rs b/crates/sortition/src/index.rs index 3c2bcf0e20..b2fd3657dc 100644 --- a/crates/sortition/src/index.rs +++ b/crates/sortition/src/index.rs @@ -15,7 +15,7 @@ impl IndexSortition { } } - fn get_committee(&mut self) -> Vec { + fn _get_committee(&mut self) -> Vec { // Initialize a vector with indices of nodes as elements let mut leaf_indices: Vec = (0..self.num_nodes).collect(); // Initialize an empty vector to store the committee diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index c7521b9c50..da35901ed0 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,12 +1,7 @@ -use actix_web::{ - http::Method, middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult, -}; -use anyhow::bail; +use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; use e3_compute_provider::FHEInputs; -#[cfg(feature = "risc0")] -use e3_support_host::Risc0Output; -use e3_support_types::{ComputeRequest, ComputeResponse, WebhookPayload}; -use serde::{Deserialize, Deserializer, Serialize}; +use e3_support_types::{ComputeRequest, WebhookPayload}; +use serde::Serialize; #[derive(Serialize, Debug)] struct ProcessingResponse { diff --git a/crates/wasm/.gitignore b/crates/wasm/.gitignore new file mode 100644 index 0000000000..9b1c8b133c --- /dev/null +++ b/crates/wasm/.gitignore @@ -0,0 +1 @@ +/dist diff --git a/crates/wasm/Cargo.toml b/crates/wasm/Cargo.toml new file mode 100644 index 0000000000..39cf7306b3 --- /dev/null +++ b/crates/wasm/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "e3-wasm" +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true + +[lib] +crate-type = ["cdylib"] + +[dependencies] +wasm-bindgen = "0.2.99" +e3-bfv-helpers.workspace = true +rand.workspace = true +getrandom = { version = "0.2", features = ["js"] } +fhe_rs.workspace = true +fhe-traits.workspace = true diff --git a/crates/wasm/package.json b/crates/wasm/package.json new file mode 100644 index 0000000000..b6bacd0a37 --- /dev/null +++ b/crates/wasm/package.json @@ -0,0 +1,33 @@ +{ + "name": "@gnosis-guild/e3-wasm", + "version": "0.0.5-test.22", + "description": "Wasm modules for enclave.", + "main": "index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "./scripts/build.sh" + }, + "exports": { + "node": { + "types": "./dist/nodejs/e3_wasm.d.ts", + "default": "./dist/nodejs/e3_wasm.js" + }, + "browser": { + "types": "./dist/web/e3_wasm.d.ts", + "default": "./dist/web/e3_wasm.js" + }, + "default": { + "types": "./dist/web/e3_wasm.d.ts", + "default": "./dist/web/e3_wasm.js" + } + }, + "keywords": [], + "author": { + "name": "gnosisguild", + "url": "https://github.com/gnosisguild" + }, + "license": "LGPL-3.0-only", + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" +} diff --git a/crates/wasm/scripts/build.sh b/crates/wasm/scripts/build.sh new file mode 100755 index 0000000000..a1ab3209d1 --- /dev/null +++ b/crates/wasm/scripts/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +pnpm wasm-pack build --target web --out-dir dist/web +pnpm wasm-pack build --target nodejs --out-dir dist/nodejs diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs new file mode 100644 index 0000000000..0c4ae6fd6b --- /dev/null +++ b/crates/wasm/src/lib.rs @@ -0,0 +1,10 @@ +use e3_bfv_helpers::client::bfv_encrypt_u64; +use rand::thread_rng; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn encrypt_number(data: u64, public_key: Vec) -> Result, JsValue> { + let encrypted_data = bfv_encrypt_u64(data, public_key, thread_rng()) + .map_err(|e| JsValue::from_str(&format!("{}", e)))?; + Ok(encrypted_data) +} diff --git a/examples/CRISP/Dockerfile b/examples/CRISP/Dockerfile index 493eceeaed..a5d6ed7287 100644 --- a/examples/CRISP/Dockerfile +++ b/examples/CRISP/Dockerfile @@ -49,6 +49,8 @@ ENV PATH="/home/${USERNAME}/.cargo/bin:${PATH}" RUN rustup component add rustfmt clippy ENV RUSTFLAGS="-C debuginfo=0 -C strip=symbols" \ CARGO_TERM_COLOR=always +RUN cargo install wasm-pack + # ──────────────────────────────────────────────────────────────────────────────── # Foundry # ──────────────────────────────────────────────────────────────────────────────── diff --git a/examples/CRISP/apps/client/package.json b/examples/CRISP/apps/client/package.json index cf3b9ff4d8..b829c20d3e 100644 --- a/examples/CRISP/apps/client/package.json +++ b/examples/CRISP/apps/client/package.json @@ -36,7 +36,7 @@ "react-markdown": "^9.0.1", "react-router-dom": "^6.22.3", "react-syntax-highlighter": "^15.5.0", - "viem": "^2.30.6", + "viem": "2.30.6", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-top-level-await": "^1.4.1", "vite-tsconfig-paths": "^4.3.2", @@ -64,4 +64,4 @@ "vite-plugin-wasm": "^3.3.0" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" -} \ No newline at end of file +} diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 00705b77d5..62f6d893c3 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -82,6 +82,7 @@ COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml COPY crates/support-scripts/Cargo.toml crates/support-scripts/Cargo.toml COPY crates/test-helpers/Cargo.toml crates/test-helpers/Cargo.toml COPY crates/tests/Cargo.toml crates/tests/Cargo.toml +COPY crates/wasm/Cargo.toml crates/wasm/Cargo.toml RUN set -eux; \ diff --git a/package.json b/package.json index a88520d9d2..bb8cd7a324 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "scripts": { "clean": "cd packages/evm && pnpm clean", - "compile": "pnpm evm:build && pnpm react:build && pnpm ciphernode:build", + "compile": "pnpm wasm:build && pnpm evm:build && pnpm react:build && pnpm ciphernode:build", "lint": "pnpm evm:lint && pnpm ciphernode:lint", "typechain": "pnpm evm:typechain", "test": "pnpm evm:test && pnpm ciphernode:test", @@ -41,9 +41,10 @@ "react:release": "cd packages/enclave-react && pnpm release", "npm:release": "pnpm build && pnpm evm:release && pnpm react:release", "support:build": "cd crates/support && ./scripts/build.sh", - "build": "pnpm -r build", + "build": "pnpm compile", "changeset": "changeset", "version": "changeset version", + "wasm:build": "cd ./crates/wasm && pnpm build", "release": "pnpm build && changeset publish" }, "workspaces": [ @@ -56,5 +57,10 @@ "devDependencies": { "husky": "^9.1.7", "@changesets/cli": "^2.27.1" + }, + "pnpm": { + "overrides": { + "viem": "2.30.6" + } } } diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index a3d36c7900..e4f782eed9 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -32,7 +32,7 @@ "peerDependencies": { "react": "^18.2.0", "wagmi": "^2.14.16", - "viem": "^2.30.6" + "viem": "2.30.6" }, "publishConfig": { "access": "public", diff --git a/packages/evm/.eslintrc.yml b/packages/evm/.eslintrc.yml index 27672a35fb..4f191fd36d 100644 --- a/packages/evm/.eslintrc.yml +++ b/packages/evm/.eslintrc.yml @@ -5,7 +5,9 @@ extends: - "prettier" parser: "@typescript-eslint/parser" parserOptions: - project: "tsconfig.json" + project: + - "tsconfig.json" + - "src/tsconfig.json" plugins: - "@typescript-eslint" root: true diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index f1e0661f5d..33c08d1ac5 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -56,7 +56,7 @@ function getChainConfig(chain: keyof typeof chainIds): NetworkUserConfig { jsonRpcUrl = "https://" + chain + ".infura.io/v3/" + infuraApiKey; } - let accounts; + let accounts: [string] | { mnemonic: string }; if (PRIVATE_KEY) { accounts = [PRIVATE_KEY]; } else { diff --git a/packages/evm/package.json b/packages/evm/package.json index 766e055e12..86cb65dd0e 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -20,8 +20,16 @@ }, "./contracts/*": "./contracts/*", "./artifacts/*": "./artifacts/*", - "./sdk": "./dist/src/sdk/index.js", - "./sdk/*": "./dist/src/sdk/*" + "./sdk": { + "types": "./dist/src/sdk/index.d.ts", + "import": "./dist/src/sdk/index.js", + "require": "./dist/src/sdk/index.js" + }, + "./sdk/*": { + "types": "./dist/src/sdk/*.d.ts", + "import": "./dist/src/sdk/*", + "require": "./dist/src/sdk/*" + } }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", @@ -88,10 +96,14 @@ "git-checks": false }, "scripts": { - "clean": "rimraf ./artifacts ./cache ./coverage ./types ./coverage.json && pnpm typechain", + "clean": "rimraf ./artifacts ./cache ./coverage ./types ./dist ./coverage.json && pnpm typechain", "build": "pnpm compile", - "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile && pnpm compile:scripts", - "compile:scripts": "tsc --noEmitOnError false --noCheck", + "compile": "pnpm compile:contracts && pnpm compile:scripts && pnpm compile:sdk", + "compile:contracts": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", + "compile:scripts": "tsc -p tsconfig.json --noEmitOnError false --noCheck", + "precompile:sdk": "cd ../../crates/wasm && pnpm build", + "compile:sdk": "tsc -p ./src/tsconfig.json --noEmitOnError false --noCheck", + "precoverage": "pnpm compile:sdk", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && pnpm typechain", "deploy": "hardhat deploy --tags enclave", "deploy:mocks": "hardhat deploy --tags enclave,mocks", @@ -113,8 +125,9 @@ }, "dependencies": { "@excubiae/contracts": "^0.4.0", + "@gnosis-guild/e3-wasm": "workspace:*", "solady": "^0.1.13", - "viem": "^2.30.6" + "viem": "2.30.6" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" } diff --git a/packages/evm/src/sdk/enclave-sdk.ts b/packages/evm/src/sdk/enclave-sdk.ts index f017776cf2..0b558746fd 100644 --- a/packages/evm/src/sdk/enclave-sdk.ts +++ b/packages/evm/src/sdk/enclave-sdk.ts @@ -209,6 +209,23 @@ export class EnclaveSDK { this.eventListener.off(eventType, callback); } + /** + * Handle an event only once + */ + public once( + type: T, + callback: EventCallback, + ): void { + const handler: EventCallback = (event) => { + this.off(type, handler); + const prom = callback(event); + if (prom) { + prom.catch((e) => console.log(e)); + } + }; + this.onEnclaveEvent(type, handler); + } + /** * Get historical events */ diff --git a/packages/evm/src/sdk/event-listener.ts b/packages/evm/src/sdk/event-listener.ts index 68df1c9678..11275f382a 100644 --- a/packages/evm/src/sdk/event-listener.ts +++ b/packages/evm/src/sdk/event-listener.ts @@ -56,10 +56,8 @@ export class EventListener implements SDKEventEmitter { eventName: eventType as string, fromBlock: this.config.fromBlock, onLogs(logs: Log[]) { - console.log(`Log received for ${watcherKey}`, logs); for (let i = 0; i < logs.length; i++) { const log = logs[i]; - console.log("Got log!"); const event: EnclaveEvent = { type: eventType, data: (log as unknown as { args: unknown }) diff --git a/packages/evm/src/sdk/index.ts b/packages/evm/src/sdk/index.ts index 082676e890..e51ffab0c1 100644 --- a/packages/evm/src/sdk/index.ts +++ b/packages/evm/src/sdk/index.ts @@ -54,3 +54,5 @@ export { decodePlaintextOutput, type ComputeProviderParams, } from "./utils"; + +export { encryptNumber } from "./wasm"; diff --git a/packages/evm/src/sdk/types.ts b/packages/evm/src/sdk/types.ts index e196ab394a..21e343646b 100644 --- a/packages/evm/src/sdk/types.ts +++ b/packages/evm/src/sdk/types.ts @@ -1,5 +1,4 @@ -import { type Log } from "viem"; -import { type PublicClient, type WalletClient } from "viem"; +import { type Log, type PublicClient, type WalletClient } from "viem"; import { type CiphernodeRegistryOwnable, diff --git a/packages/evm/src/sdk/wasm.ts b/packages/evm/src/sdk/wasm.ts new file mode 100644 index 0000000000..33416645da --- /dev/null +++ b/packages/evm/src/sdk/wasm.ts @@ -0,0 +1,8 @@ +import { encrypt_number } from "@gnosis-guild/e3-wasm"; + +export function encryptNumber( + data: bigint, + public_key: Uint8Array, +): Uint8Array { + return encrypt_number(data, public_key); +} diff --git a/packages/evm/src/tsconfig.json b/packages/evm/src/tsconfig.json new file mode 100644 index 0000000000..231a4bbf09 --- /dev/null +++ b/packages/evm/src/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es2020"], + "module": "nodenext", + "moduleResolution": "nodenext", + "noImplicitAny": true, + "outDir": "../dist", + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "es2020" + }, + "exclude": ["node_modules"], + "include": ["sdk/**/*"] +} diff --git a/packages/evm/test/fixtures/pubkey.bin b/packages/evm/test/fixtures/pubkey.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecc1d2934151137ed56581bc7224a9df26d27513 GIT binary patch literal 27676 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 bco9C3!%!1_PAAwSh10P literal 0 HcmV?d00001 diff --git a/packages/evm/test/sdk.spec.ts b/packages/evm/test/sdk.spec.ts new file mode 100644 index 0000000000..a47057d0fe --- /dev/null +++ b/packages/evm/test/sdk.spec.ts @@ -0,0 +1,17 @@ +import { expect } from "chai"; +import fs from "fs/promises"; +import path from "path"; + +import { encryptNumber } from "../src/sdk"; + +describe("encryptNumber", () => { + it("should encrypt a number without crashing in a node environent", async () => { + const buffer = await fs.readFile( + path.resolve(__dirname, "./fixtures/pubkey.bin"), + ); + const value = encryptNumber(10n, Uint8Array.from(buffer)); + expect(value).to.be.an.instanceof(Uint8Array); + expect(value.length).to.equal(27_674); + // TODO: test the encryption is correct + }); +}); diff --git a/packages/evm/tsconfig.json b/packages/evm/tsconfig.json index bf2c2ef0ca..2a5d6a23f3 100644 --- a/packages/evm/tsconfig.json +++ b/packages/evm/tsconfig.json @@ -9,8 +9,8 @@ "lib": ["es2020"], "module": "commonjs", "moduleResolution": "node", - "noImplicitAny": true, "outDir": "dist", + "noImplicitAny": true, "removeComments": true, "resolveJsonModule": true, "sourceMap": true, @@ -18,6 +18,6 @@ "target": "es2020" }, "exclude": ["node_modules"], - "files": ["./hardhat.config.ts"], - "include": ["src/**/*", "tasks/**/*", "test/**/*", "deploy/**/*", "types/"] + "files": ["hardhat.config.ts"], + "include": ["tasks/**/*", "test/**/*", "deploy/**/*", "types/"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0debef66cf..e1cf8cdd13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + viem: 2.30.6 + importers: .: @@ -15,6 +18,8 @@ importers: specifier: ^9.1.7 version: 9.1.7 + crates/wasm: {} + docs: dependencies: next: @@ -75,10 +80,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.2 version: 1.1.4(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -87,13 +92,13 @@ importers: version: 0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(d1a9b5350250b0c212d224a0066f41ff) + version: 5.0.0(62dbc94741f8fd6a7d8599a31638421d) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -105,16 +110,16 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) '@synthetixio/synpress-cache': specifier: ^0.0.12 version: 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -192,7 +197,7 @@ importers: version: 1.10.0 connectkit: specifier: ^1.9.0 - version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) ethers: specifier: ^6.12.0 version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -212,8 +217,8 @@ importers: specifier: ^15.5.0 version: 15.6.1(react@18.3.1) viem: - specifier: ^2.30.6 - version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) vite-plugin-node-polyfills: specifier: ^0.22.0 version: 0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) @@ -225,7 +230,7 @@ importers: version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)) wagmi: specifier: ^2.14.16 - version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -294,11 +299,11 @@ importers: specifier: ^18.2.0 version: 18.3.1 viem: - specifier: ^2.30.6 - version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: specifier: ^2.14.16 - version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@types/react': specifier: ^18.2.0 @@ -312,12 +317,15 @@ importers: '@excubiae/contracts': specifier: ^0.4.0 version: 0.4.0 + '@gnosis-guild/e3-wasm': + specifier: workspace:* + version: link:../../crates/wasm solady: specifier: ^0.1.13 version: 0.1.22 viem: - specifier: ^2.30.6 - version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 @@ -454,6 +462,9 @@ importers: '@types/yargs': specifier: ^17.0.33 version: 17.0.33 + viem: + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) yargs: specifier: ^18.0.0 version: 18.0.0 @@ -478,7 +489,7 @@ importers: version: 5.3.0 '@risc0/ethereum': specifier: file:lib/risc0-ethereum - version: file:templates/default/lib/risc0-ethereum + version: risc0-ethereum@file:templates/default/lib/risc0-ethereum '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) @@ -542,9 +553,6 @@ importers: typescript: specifier: '>=4.5.0' version: 5.8.3 - viem: - specifier: ^2.30.6 - version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wait-on: specifier: ^8.0.3 version: 8.0.3 @@ -565,10 +573,10 @@ importers: version: 5.81.2(react@18.3.1) '@wagmi/core': specifier: ^2.14.16 - version: 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + version: 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) connectkit: specifier: ^1.9.0 - version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) react: specifier: ^18.2.0 version: 18.3.1 @@ -576,11 +584,11 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) viem: - specifier: ^2.30.6 - version: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: specifier: ^2.14.16 - version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -642,9 +650,6 @@ importers: packages: - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} @@ -2452,6 +2457,10 @@ packages: resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.2': resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} @@ -2751,9 +2760,6 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': - resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} - '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} @@ -2903,30 +2909,18 @@ packages: '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - '@scure/bip32@1.6.2': - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - '@scure/bip39@1.5.4': - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} @@ -3552,7 +3546,7 @@ packages: peerDependencies: '@wagmi/core': 2.17.3 typescript: '>=5.0.4' - viem: 2.x + viem: 2.30.6 peerDependenciesMeta: typescript: optional: true @@ -3562,7 +3556,7 @@ packages: peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' - viem: 2.x + viem: 2.30.6 peerDependenciesMeta: '@tanstack/query-core': optional: true @@ -3686,17 +3680,6 @@ packages: abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - abitype@1.0.8: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: @@ -4455,7 +4438,7 @@ packages: '@tanstack/react-query': '>=5.0.0' react: 17.x || 18.x react-dom: 17.x || 18.x - viem: 2.x + viem: 2.30.6 wagmi: 2.x console-browserify@1.2.0: @@ -5285,7 +5268,7 @@ packages: peerDependencies: react: 17.x || 18.x || 19.x react-dom: 17.x || 18.x || 19.x - viem: 2.x + viem: 2.30.6 wagmi: 2.x peerDependenciesMeta: react: @@ -6123,16 +6106,6 @@ packages: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} - isows@1.0.3: - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' - - isows@1.0.6: - resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} - peerDependencies: - ws: '*' - isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: @@ -7088,16 +7061,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - ox@0.6.7: - resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - ox@0.8.1: - resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==} + ox@0.7.1: + resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -7848,6 +7813,9 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + risc0-ethereum@file:templates/default/lib/risc0-ethereum: + resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} + rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -8871,32 +8839,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - viem@2.23.2: - resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - viem@2.23.7: - resolution: {integrity: sha512-Gbyz0uE3biWDPxECrEyzILWPsnIgDREgfRMuLSWHSSnM6ktefSC/lqQNImnxESdDEixa8/6EWXjmf2H6L9VV0A==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - viem@2.31.4: - resolution: {integrity: sha512-0UZ/asvzl6p44CIBRDbwEcn3HXIQQurBZcMo5qmLhQ8s27Ockk+RYohgTLlpLvkYs8/t4UUEREAbHLuek1kXcw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - viem@2.9.9: - resolution: {integrity: sha512-SUIHBL6M5IIlqDCMEQwAAvHzeglaM4FEqM6bCI+srLXtFYmrpV4tWhnpobQRNwh4f7HIksmKLLZ+cytv8FfnJQ==} + viem@2.30.6: + resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -8972,7 +8916,7 @@ packages: '@tanstack/react-query': '>=5.0.0' react: '>=18' typescript: '>=5.0.4' - viem: 2.x + viem: 2.30.6 peerDependenciesMeta: typescript: optional: true @@ -9091,18 +9035,6 @@ packages: utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -9258,8 +9190,6 @@ packages: snapshots: - '@adraffy/ens-normalize@1.10.0': {} - '@adraffy/ens-normalize@1.10.1': {} '@adraffy/ens-normalize@1.11.0': {} @@ -9275,7 +9205,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -9286,7 +9216,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -9311,10 +9241,10 @@ snapshots: '@babel/helpers': 7.27.6 '@babel/parser': 7.27.7 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) '@babel/types': 7.27.7 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -9355,7 +9285,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9372,7 +9302,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -9393,14 +9323,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color @@ -9415,9 +9338,9 @@ snapshots: '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9432,7 +9355,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9441,13 +9364,13 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color @@ -9465,7 +9388,7 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color @@ -9483,7 +9406,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9510,7 +9433,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9554,14 +9477,14 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: @@ -9600,7 +9523,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9615,7 +9538,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9664,7 +9587,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9710,7 +9633,7 @@ snapshots: '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9750,7 +9673,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-destructuring': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.27.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9833,7 +9756,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) '@babel/types': 7.27.7 @@ -10047,19 +9970,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.27.7 '@babel/types': 7.27.7 - debug: 4.4.1(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.27.7': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.7 - '@babel/template': 7.27.2 - '@babel/types': 7.27.7 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10268,10 +10179,11 @@ snapshots: '@depay/web3-blockchains@9.8.6': {} - '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)': + '@depay/web3-client@10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@depay/solana-web3.js': 1.98.2 '@depay/web3-blockchains': 9.8.6 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm@14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -10301,7 +10213,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10596,7 +10508,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10923,7 +10835,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11219,7 +11131,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -11243,7 +11155,7 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -11266,7 +11178,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -11279,7 +11191,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11293,7 +11205,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11447,6 +11359,10 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/curves@1.9.2': dependencies: '@noble/hashes': 1.8.0 @@ -11522,40 +11438,42 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.2 '@nomicfoundation/edr-win32-x64-msvc': 0.11.2 - '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@8.1.1) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + debug: 4.4.1(supports-color@5.5.0) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -11565,11 +11483,12 @@ snapshots: hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': 0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': @@ -11578,7 +11497,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -11638,19 +11557,20 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@5.0.0(d1a9b5350250b0c212d224a0066f41ff)': + '@nomicfoundation/hardhat-toolbox@5.0.0(62dbc94741f8fd6a7d8599a31638421d)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.13(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.12(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.12(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 22.15.33 chai: 4.5.0 + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -11663,7 +11583,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11678,7 +11598,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11693,7 +11613,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -11781,7 +11701,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -11792,7 +11712,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - typescript @@ -11805,7 +11725,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11951,7 +11871,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12004,7 +11924,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.23)(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12032,8 +11952,6 @@ snapshots: - utf-8-validate - zod - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} - '@rolldown/pluginutils@1.0.0-beta.19': {} '@rollup/plugin-inject@5.0.5(rollup@4.44.1)': @@ -12129,7 +12047,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - typescript @@ -12148,24 +12066,12 @@ snapshots: '@noble/secp256k1': 1.7.1 '@scure/base': 1.1.9 - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.9 - '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 - '@scure/bip32@1.6.2': - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.6 - '@scure/bip32@1.7.0': dependencies: '@noble/curves': 1.9.2 @@ -12177,21 +12083,11 @@ snapshots: '@noble/hashes': 1.2.0 '@scure/base': 1.1.9 - '@scure/bip39@1.2.1': - dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.9 - '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 - '@scure/bip39@1.5.4': - dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.6 - '@scure/bip39@1.6.0': dependencies: '@noble/hashes': 1.8.0 @@ -12223,7 +12119,7 @@ snapshots: '@zk-kit/utils': 1.3.0 axios: 1.6.6 ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - viem: 2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - debug @@ -12496,14 +12392,14 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@synthetixio/ethereum-wallet-mock@0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6) + '@depay/web3-client': 10.18.6(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@depay/web3-mock': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12581,10 +12477,10 @@ snapshots: - typescript - utf-8-validate - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -12667,6 +12563,14 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + dependencies: + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + '@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -12675,19 +12579,20 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': @@ -12937,7 +12842,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12953,7 +12858,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12967,7 +12872,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13019,16 +12924,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': + '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': dependencies: '@coinbase/wallet-sdk': 4.3.3 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -13058,16 +12963,16 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': + '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': dependencies: '@coinbase/wallet-sdk': 4.3.3 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -13097,11 +13002,11 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': + '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.81.2 @@ -13112,11 +13017,11 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': + '@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.8.3) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) zustand: 5.0.0(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.81.2 @@ -13575,7 +13480,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13618,7 +13523,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13698,11 +13603,6 @@ snapshots: abbrev@1.0.9: {} - abitype@1.0.0(typescript@5.8.3)(zod@3.25.67): - optionalDependencies: - typescript: 5.8.3 - zod: 3.25.67 - abitype@1.0.8(typescript@5.8.3)(zod@3.22.4): optionalDependencies: typescript: 5.8.3 @@ -13738,7 +13638,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14031,7 +13931,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -14511,12 +14411,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14525,18 +14425,18 @@ snapshots: react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is - connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + family: 0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -14545,8 +14445,8 @@ snapshots: react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is @@ -15299,7 +15199,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15607,7 +15507,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15650,19 +15550,19 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) - family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + family@0.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) fast-deep-equal@3.1.3: {} @@ -15744,7 +15644,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -15797,7 +15697,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) for-each@0.3.5: dependencies: @@ -16142,7 +16042,7 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.3 @@ -16197,7 +16097,7 @@ snapshots: lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - bufferutil - debug @@ -16220,7 +16120,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -16271,7 +16171,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -16558,7 +16458,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16754,14 +16654,6 @@ snapshots: isomorphic-timers-promises@1.0.1: {} - isows@1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - isows@1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -17712,7 +17604,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.2.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -17734,7 +17626,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -18176,21 +18068,7 @@ snapshots: outdent@0.5.0: {} - ox@0.6.7(typescript@5.8.3)(zod@3.25.67): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - - ox@0.8.1(typescript@5.8.3)(zod@3.22.4): + ox@0.7.1(typescript@5.8.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -18205,7 +18083,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.8.1(typescript@5.8.3)(zod@3.25.67): + ox@0.7.1(typescript@5.8.3)(zod@3.25.67): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -18964,6 +18842,8 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + risc0-ethereum@file:templates/default/lib/risc0-ethereum: {} + rlp@2.2.7: dependencies: bn.js: 5.2.2 @@ -18998,7 +18878,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -19080,7 +18960,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -19873,7 +19753,7 @@ snapshots: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 @@ -19921,7 +19801,7 @@ snapshots: typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -20226,49 +20106,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.23.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) - isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.3)(zod@3.25.67) - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.23.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) - isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.7(typescript@5.8.3)(zod@3.25.67) - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.22.4) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.1(typescript@5.8.3)(zod@3.22.4) + ox: 0.7.1(typescript@5.8.3)(zod@3.22.4) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -20277,15 +20123,15 @@ snapshots: - utf-8-validate - zod - viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.1(typescript@5.8.3)(zod@3.25.67) + ox: 0.7.1(typescript@5.8.3)(zod@3.25.67) ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 @@ -20294,23 +20140,6 @@ snapshots: - utf-8-validate - zod - viem@2.9.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.8.3)(zod@3.25.67) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.44.1) @@ -20335,7 +20164,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)): dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: @@ -20359,14 +20188,14 @@ snapshots: vscode-textmate@8.0.0: {} - wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): + wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) - '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) - '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -20397,14 +20226,14 @@ snapshots: - utf-8-validate - zod - wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): + wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) - '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) - '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) + '@wagmi/connectors': 5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) + '@wagmi/core': 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.31.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -20565,11 +20394,6 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c791c3207b..a207d025b6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,5 +4,6 @@ packages: - examples/CRISP/apps/client - packages/enclave-react - packages/evm + - crates/wasm - templates/default - templates/default/client diff --git a/rust-toolchain.toml b/rust-toolchain.toml index c68e3d8ae1..d0efd2d0a4 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,4 @@ [toolchain] channel = "1.85" components = ["rustfmt"] +targets = ["wasm32-unknown-unknown"] diff --git a/templates/default/client/package.json b/templates/default/client/package.json index 2e8fc7e7f8..fb4bde30e5 100644 --- a/templates/default/client/package.json +++ b/templates/default/client/package.json @@ -24,7 +24,7 @@ "connectkit": "^1.9.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "viem": "^2.30.6", + "viem": "2.30.6", "wagmi": "^2.14.16" }, "devDependencies": { diff --git a/templates/default/contracts/ImageID.sol b/templates/default/contracts/ImageID.sol old mode 100644 new mode 100755 diff --git a/templates/default/package.json b/templates/default/package.json index 3a3b5d7cad..b64748fd8d 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -1,4 +1,26 @@ { + "name": "enclave-example", + "scripts": { + "ciphernode:add": "hardhat run scripts/ciphernode-add.ts -- ", + "compile": "hardhat compile", + "deploy": "hardhat run scripts/deploy-local.ts --network localhost", + "deploy:dev": "hardhat run scripts/deploy-local.ts", + "dev:all": "./scripts/dev_all.sh", + "dev:ciphernodes": "./scripts/dev_ciphernodes.sh", + "dev:evm": "hardhat node", + "dev:frontend": "./scripts/dev_frontend.sh", + "dev:program": "./scripts/dev_program.sh", + "dev:server": "./scripts/dev_server.sh", + "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile || true", + "test": "hardhat test", + "test:integration": "./scripts/test_integration.sh" + }, + "dependencies": { + "@gnosis-guild/enclave": "workspace:*", + "@types/yargs": "^17.0.33", + "yargs": "^18.0.0", + "viem": "2.30.6" + }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.5", @@ -28,27 +50,6 @@ "typechain": "^8.3.0", "typed-rpc": "^6.1.1", "typescript": ">=4.5.0", - "viem": "^2.30.6", "wait-on": "^8.0.3" - }, - "dependencies": { - "@gnosis-guild/enclave": "workspace:*", - "@types/yargs": "^17.0.33", - "yargs": "^18.0.0" - }, - "name": "enclave-example", - "scripts": { - "ciphernode:add": "hardhat run scripts/ciphernode-add.ts -- ", - "compile": "hardhat compile", - "deploy": "hardhat run scripts/deploy-local.ts --network localhost", - "deploy:dev": "hardhat run scripts/deploy-local.ts", - "dev:evm": "hardhat node", - "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile || true", - "dev:ciphernodes": "./scripts/dev_ciphernodes.sh", - "dev:all": "./scripts/dev_all.sh", - "dev:frontend": "./scripts/dev_frontend.sh", - "dev:program": "./scripts/dev_program.sh", - "dev:server": "./scripts/dev_server.sh", - "test": "hardhat test" } } diff --git a/templates/default/scripts/test_integration.sh b/templates/default/scripts/test_integration.sh new file mode 100755 index 0000000000..2ea98e18b3 --- /dev/null +++ b/templates/default/scripts/test_integration.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -euo pipefail + +passed_message() { + echo "" + echo "------------------------" + echo " ✅ Test has passed! " + echo "------------------------" + echo "" +} + +failed_message() { + echo "" + echo "------------------------" + echo " ❌ Test failed " + echo "------------------------" + echo "" + exit 1 +} + +export $(enclave print-env --chain hardhat) + +(pnpm concurrently \ + --names "TEST,EVM,CIPHER,SERVER,PROGRAM" \ + --prefix-colors "blue,cyan,magenta,yellow,green" \ + --kill-others \ + --success first \ + "wait-on http://localhost:13151/health && pnpm ts-node ./tests/integration.spec.ts" \ + "pnpm dev:evm" \ + "pnpm dev:ciphernodes" \ + "TEST_MODE=1 pnpm dev:server" \ + "enclave program start" && passed_message) || failed_message diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 160a92ea2c..772b4ed7d8 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -95,17 +95,55 @@ async function runProgram(e3Id: bigint): Promise { } } +function defer() { + let resolve: () => void = () => {}; + let reject: (e?: any) => void = () => {}; + + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + + return { + promise, + resolve, + reject, + }; +} + +type Defer = ReturnType; + +const currentlyActivating = new Map(); + +function getActivationDefer(e3Id: bigint): Defer { + let d = currentlyActivating.get(e3Id); + if (!d) { + const def = defer(); + currentlyActivating.set(e3Id, def); + return def; + } + return d; +} + async function handleE3ActivatedEvent(event: any) { const data = event.data as E3ActivatedData; const e3Id = data.e3Id; const expiration = data.expiration; + // This allows us to wait until the session has been activated avoiding race conditions + const def = getActivationDefer(e3Id); + console.log(`🎯 E3 Activated: ${e3Id}, expiration: ${expiration}`); const sessionKey = e3Id.toString(); + if (!e3Sessions.has(sessionKey)) { const sdk = await createPrivateSDK(); + console.log("📡 Fetching E3 data from contract..."); + const e3 = await sdk.getE3(e3Id); + console.log("✅ Reveived E3 data from contract."); + e3Sessions.set(sessionKey, { e3Id, e3ProgramParams: e3.e3ProgramParams, @@ -114,6 +152,7 @@ async function handleE3ActivatedEvent(event: any) { isProcessing: false, isCompleted: false, }); + def.resolve(); } const currentTime = BigInt(Math.floor(Date.now() / 1000)); @@ -140,6 +179,10 @@ async function handleInputPublishedEvent(event: any) { console.log(`📝 Input Published for E3 ${e3Id}: index ${data.index}`); const sessionKey = e3Id.toString(); + + // Ensure the session is available + await getActivationDefer(e3Id).promise; + const session = e3Sessions.get(sessionKey); if (session) { diff --git a/templates/default/tests/integration.spec.ts b/templates/default/tests/integration.spec.ts new file mode 100644 index 0000000000..b29bf3d01e --- /dev/null +++ b/templates/default/tests/integration.spec.ts @@ -0,0 +1,273 @@ +import { + calculateStartWindow, + DEFAULT_COMPUTE_PROVIDER_PARAMS, + DEFAULT_E3_CONFIG, + EnclaveEventType, + EnclaveSDK, + encodeBfvParams, + encodeComputeProviderParams, + RegistryEventType, + AllEventTypes, + EnclaveEvent, + encryptNumber, +} from "@gnosis-guild/enclave/sdk"; +import { hexToBytes } from "viem"; +import { E3 } from "@gnosis-guild/enclave/sdk/types.js"; +import assert from "assert"; + +export function getContractAddresses() { + return { + enclave: process.env.ENCLAVE_ADDRESS as `0x${string}`, + ciphernodeRegistry: process.env.REGISTRY_ADDRESS as `0x${string}`, + filterRegistry: process.env.FILTER_REGISTRY_ADDRESS as `0x${string}`, + e3Program: process.env.E3_PROGRAM_ADDRESS as `0x${string}`, + }; +} + +type E3Shared = { + e3Id: bigint; + e3Program: string; + e3: E3; + filter: string; +}; + +type E3StateRequested = E3Shared & { + type: "requested"; +}; + +type E3StatePublished = E3Shared & { + type: "committee_published"; + publicKey: `0x${string}`; +}; + +type E3StateActivated = E3Shared & { + type: "activated"; + publicKey: `0x${string}`; + expiration: bigint; +}; + +type E3StateOutputPublished = E3Shared & { + type: "output_published"; + plaintextOutput: string; +}; + +type E3State = + | E3StateRequested + | E3StatePublished + | E3StateActivated + | E3StateOutputPublished; + +async function setupEventListeners( + sdk: EnclaveSDK, + store: Map, +) { + async function waitForEvent( + type: T, + trigger?: () => Promise, + ): Promise> { + return new Promise((resolve) => { + sdk.once(type, resolve); + trigger && trigger(); + }); + } + + sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, (event) => { + const id = event.data.e3Id; + + if (store.has(id)) { + throw new Error("E3 has already been requested "); + } + + store.set(event.data.e3Id, { + type: "requested", + ...event.data, + }); + }); + + sdk.onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, (event) => { + const id = event.data.e3Id; + + const state = store.get(id); + + if (!state) { + throw new Error(`State for ID '${id}'not found.`); + } + + if (state.type !== "requested") { + throw new Error(`State must be in the ${state.type} state`); + } + + store.set(id, { + publicKey: event.data.publicKey as `0x${string}`, + ...state, + type: "committee_published", + }); + }); + + sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, (event) => { + const id = event.data.e3Id; + const state = store.get(id); + + if (!state) { + throw new Error(`State for ID '${id}' not found.`); + } + + if (state.type !== "committee_published") { + throw new Error(`State must be in the ${state.type} state`); + } + + store.set(id, { + ...state, + expiration: event.data.expiration, + publicKey: event.data.committeePublicKey as `0x${string}`, + type: "activated", + }); + }); + + sdk.onEnclaveEvent(EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, (event) => { + const id = event.data.e3Id; + const state = store.get(id); + + if (!state) { + throw new Error(`State for ID '${id}' not found.`); + } + + if (state.type !== "activated") { + throw new Error(`State must be in the ${state.type} state`); + } + + store.set(id, { + ...state, + plaintextOutput: event.data.plaintextOutput, + type: "output_published", + }); + }); + + return { waitForEvent }; +} + +async function main() { + console.log("Testing..."); + + const contracts = getContractAddresses(); + + const store = new Map(); + const sdk = EnclaveSDK.create({ + chainId: 31337, + contracts: { + enclave: contracts.enclave, + ciphernodeRegistry: contracts.ciphernodeRegistry, + }, + rpcUrl: "ws://localhost:8545", + privateKey: + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + }); + + const { waitForEvent } = await setupEventListeners(sdk, store); + + const threshold: [number, number] = [ + DEFAULT_E3_CONFIG.threshold_min, + DEFAULT_E3_CONFIG.threshold_max, + ]; + const startWindow = calculateStartWindow(60); + const duration = BigInt(10); + const e3ProgramParams = encodeBfvParams(); + const computeProviderParams = encodeComputeProviderParams( + DEFAULT_COMPUTE_PROVIDER_PARAMS, + ); + + let state; + let event; + + // REQUEST phase + await waitForEvent(EnclaveEventType.E3_REQUESTED, async () => { + await sdk.requestE3({ + filter: contracts.filterRegistry, + threshold, + startWindow, + duration, + e3Program: contracts.e3Program, + e3ProgramParams, + computeProviderParams, + value: BigInt("1000000000000000"), // 0.001 ETH + }); + }); + + state = store.get(0n); + assert(state); + assert.strictEqual(state.e3Id, 0n); + assert.strictEqual(state.filter, contracts.filterRegistry); + assert.strictEqual(state.type, "requested"); + + // Ciphernodes will publish a public key within the COMMITTEE_PUBLISHED event + event = await waitForEvent(RegistryEventType.COMMITTEE_PUBLISHED); + + state = store.get(0n); + assert(state); + assert.strictEqual(state.type, "committee_published"); + assert.strictEqual(state.publicKey, event.data.publicKey); + + let { e3Id, publicKey } = state; + + // ACTIVATION phase + event = await waitForEvent(EnclaveEventType.E3_ACTIVATED, async () => { + await sdk.activateE3(e3Id, publicKey); + }); + + state = store.get(0n); + assert(state); + assert.strictEqual(state.type, "activated"); + + // INPUT PUBLISHING phase + const num1 = 12n; + const num2 = 21n; + const publicKeyBytes = hexToBytes(state.publicKey); + const enc1 = encryptNumber(num1, publicKeyBytes); + const enc2 = encryptNumber(num2, publicKeyBytes); + + await waitForEvent(EnclaveEventType.INPUT_PUBLISHED, async () => { + await sdk.publishInput( + e3Id, + `0x${Array.from(enc1, (b) => b.toString(16).padStart(2, "0")).join("")}` as `0x${string}`, + ); + }); + await waitForEvent(EnclaveEventType.INPUT_PUBLISHED, async () => { + const hash2 = await sdk.publishInput( + e3Id, + `0x${Array.from(enc2, (b) => b.toString(16).padStart(2, "0")).join("")}` as `0x${string}`, + ); + }); + + const plaintextEvent = await waitForEvent( + EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED, + ); + + const parsed = hexToUint8Array(plaintextEvent.data.plaintextOutput); + + assert.strictEqual(BigInt(parsed[0]), num1 + num2); + + console.log(""); + console.log("*****************************************"); + console.log(" TEST WAS SUCCESSFUL!"); + console.log(" SHUTTING DOWN SERVICES"); + console.log("*****************************************"); + console.log(""); + + process.exit(0); +} + +main() + .then(() => console.log("Test successful")) + .catch((err) => { + console.log(""); + console.log(" ❌ Test failed "); + console.log(""); + console.log(err); + process.exit(1); + }); + +function hexToUint8Array(hexString: string) { + const hex = hexString.startsWith("0x") ? hexString.slice(2) : hexString; + const m = hex.match(/.{2}/g)?.map((byte) => parseInt(byte, 16)) ?? []; + return new Uint8Array(m); +} diff --git a/templates/default/tsconfig.json b/templates/default/tsconfig.json index a2a3e02585..d17b82c638 100644 --- a/templates/default/tsconfig.json +++ b/templates/default/tsconfig.json @@ -10,5 +10,10 @@ "skipLibCheck": true, "resolveJsonModule": true }, - "include": ["./deploy/**/*", "./server/**/*", "hardhat.config.ts"] + "include": [ + "./tests/**/*", + "./deploy/**/*", + "./server/**/*", + "hardhat.config.ts" + ] } From b57542eb6e3056bd72b27fc1e8e2d85cb50f7f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Tue, 1 Jul 2025 13:42:48 +0000 Subject: [PATCH 101/106] Ensure enclave program is compiled before test is run (#564) --- templates/default/scripts/test_integration.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/default/scripts/test_integration.sh b/templates/default/scripts/test_integration.sh index 2ea98e18b3..c76d07d4e9 100755 --- a/templates/default/scripts/test_integration.sh +++ b/templates/default/scripts/test_integration.sh @@ -21,7 +21,7 @@ failed_message() { export $(enclave print-env --chain hardhat) -(pnpm concurrently \ +enclave program compile && (pnpm concurrently \ --names "TEST,EVM,CIPHER,SERVER,PROGRAM" \ --prefix-colors "blue,cyan,magenta,yellow,green" \ --kill-others \ From 9b6029564f3c86f31e86dadcc02bf233aaef63dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 10 Jul 2025 22:57:33 +0400 Subject: [PATCH 102/106] Remove Risc0 from tests (#569) * Add e3-program-server * Add package to Dockerfiles * Provide strategy * Tidy up support code * Create cargo project * Fix bad cargo toml * Update * Use json feature * Update ref * Update ref * update to rev * Update script * udpate dependency * update script * Fix script * Fix script * Update all commits * Update e3 program server * Update e3 program server * Update rev pin * Dont need scriptdir * Get init to copy dev folder * Update scripts * Update config * update rev * Fix test * Fix config parsing * Fix up script * Remove redundant CI steps * Add signal file to get correct script ordering * Update scripts * Ensure no callback_url_rewrite * Add debugging * Update support rev * Remove logging * Update revs * Update actions * Update actions * add target to cache * Disable all actions * Attempt at paralellization * Remove compilation from test * Tidy up caching * Use 1.85.1 * Use installed enclave for integration test * Refactor to include integration * Ensure folders are downloaded * Use whole target folder * Update fns * Add target folder * Update caches * Fix waitons * Incorporate other tests into ci yaml * use ci name so it is rquired --- .github/workflows/ci.yml | 440 ++- .github/workflows/integration.yml | 141 - .github/workflows/rust-ci.yml | 55 - .github/workflows/template-and-support.yml | 103 - Cargo.lock | 15 + Cargo.toml | 8 +- crates/Dockerfile | 1 + crates/cli/src/cli.rs | 10 +- crates/cli/src/program.rs | 21 +- crates/config/src/app_config.rs | 24 +- crates/init/src/lib.rs | 7 + crates/program-server/Cargo.toml | 17 + crates/program-server/src/lib.rs | 232 ++ crates/program-server/src/types.rs | 154 + crates/scripts/update_revs.sh | 37 + crates/support-scripts/Cargo.toml | 1 + crates/support-scripts/dev/Cargo.lock | 2729 +++++++++++++++++ crates/support-scripts/dev/Cargo.toml | 15 + crates/support-scripts/dev/compile | 3 + crates/support-scripts/dev/src/main.rs | 17 + crates/support-scripts/dev/start | 3 + crates/support-scripts/src/lib.rs | 84 +- crates/support-scripts/src/program.rs | 45 + crates/support-scripts/src/program_dev.rs | 29 + crates/support-scripts/src/program_risc0.rs | 43 + crates/support-scripts/src/traits.rs | 8 + crates/support-scripts/src/utils.rs | 41 + crates/support/Cargo.toml | 2 +- crates/support/host/Cargo.toml | 2 +- crates/support/methods/guest/Cargo.toml | 2 +- crates/support/program/Cargo.toml | 4 +- examples/CRISP/apps/program/Cargo.lock | 2 + examples/CRISP/apps/server/Dockerfile | 1 + package.json | 2 +- templates/default/.enclave/support/dev | 1 + templates/default/Cargo.lock | 1021 +++--- templates/default/Cargo.toml | 3 +- templates/default/client/wasm/Cargo.toml | 2 +- templates/default/enclave.config.yaml | 9 +- templates/default/flake.nix | 2 + templates/default/program/Cargo.toml | 4 +- templates/default/scripts/dev_all_tmux.sh | 2 +- templates/default/scripts/dev_ciphernodes.sh | 6 + templates/default/scripts/dev_program.sh | 7 +- templates/default/scripts/test_integration.sh | 5 +- templates/default/server/index.ts | 5 +- tests/integration/base.sh | 2 +- tests/integration/fns.sh | 10 +- tests/integration/lib/prebuild.sh | 2 +- tests/integration/persist.sh | 2 +- 50 files changed, 4410 insertions(+), 971 deletions(-) delete mode 100644 .github/workflows/integration.yml delete mode 100644 .github/workflows/rust-ci.yml delete mode 100644 .github/workflows/template-and-support.yml create mode 100644 crates/program-server/Cargo.toml create mode 100644 crates/program-server/src/lib.rs create mode 100644 crates/program-server/src/types.rs create mode 100755 crates/scripts/update_revs.sh create mode 100644 crates/support-scripts/dev/Cargo.lock create mode 100644 crates/support-scripts/dev/Cargo.toml create mode 100755 crates/support-scripts/dev/compile create mode 100644 crates/support-scripts/dev/src/main.rs create mode 100755 crates/support-scripts/dev/start create mode 100644 crates/support-scripts/src/program.rs create mode 100644 crates/support-scripts/src/program_dev.rs create mode 100644 crates/support-scripts/src/program_risc0.rs create mode 100644 crates/support-scripts/src/traits.rs create mode 100644 crates/support-scripts/src/utils.rs create mode 120000 templates/default/.enclave/support/dev diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68df0f7523..322e193136 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,38 +1,129 @@ -name: "EVM" -env: - HARDHAT_VAR_MNEMONIC: "test test test test test test test test test test test junk" - HARDHAT_VAR_INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" - # Uncomment the following lines to set your configuration variables using - # GitHub secrets (https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions) - # - # HARDHAT_VAR_MNEMONIC: ${{ secrets.Mnemonic }} - # HARDHAT_VAR_INFURA_API_KEY: ${{ secrets.InfuraApiKey }} - # HARDHAT_VAR_ARBISCAN_API_KEY: ${{ secrets.ArbiscanApiKey }} - # HARDHAT_VAR_BSCSCAN_API_KEY: ${{ secrets.BscscanApiKey }} - # HARDHAT_VAR_ETHERSCAN_API_KEY: ${{ secrets.EtherscanApiKey }} - # HARDHAT_VAR_OPTIMISM_API_KEY: ${{ secrets.OptimismApiKey }} - # HARDHAT_VAR_POLYGONSCAN_API_KEY: ${{ secrets.PolygonscanApiKey }} - # HARDHAT_VAR_SNOWTRACE_API_KEY: ${{ secrets.SnowtraceApiKey }} - +name: ci on: workflow_dispatch: pull_request: + branches: + - main + - hacknet push: branches: - main - hacknet +env: + DOCKERFILE_PATH: crates/support/Dockerfile + IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/e3-support + HARDHAT_VAR_MNEMONIC: "test test test test test test test test test test test junk" + HARDHAT_VAR_INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" + PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + +permissions: + contents: read + packages: write jobs: - ci: + rust_unit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust 1.85.1 + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.85.1 + + # We must install foundry in order to be able to test anvil + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Install solc + run: | + sudo add-apt-repository ppa:ethereum/ethereum \ + && sudo apt-get update -y \ + && sudo apt-get install -y solc + + # We need to setup node in order to compile the hardhat contracts to get the artifacts + - name: "Setup node" + uses: actions/setup-node@v3 + with: + node-version: 22 + + - name: pnpm-setup + uses: pnpm/action-setup@v4 + + - name: Cache node modules + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} + - name: "Install the dependencies" + run: "pnpm install" + + - name: "Compile the contracts and generate the TypeChain bindings" + run: "pnpm typechain" + + - name: Checking code format ciphernode + run: pnpm ciphernode:lint + + - name: Run tests + run: "pnpm ciphernode:test" + build: + name: Compile and push Support Dockerfile + runs-on: ubuntu-latest + outputs: + image_tag: ${{ steps.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + - name: Generate version tag + id: version + run: | + echo "version=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT + - name: Generate tags + id: tags + run: | + VERSION=$(git rev-parse --short=9 HEAD) + TAGS="${{ env.IMAGE_NAME }}:$VERSION" + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" + elif [ "${{ github.ref }}" = "refs/heads/hacknet" ]; then + TAGS="$TAGS,${{ env.IMAGE_NAME }}:hacknet" + fi + echo "tags=$TAGS" >> $GITHUB_OUTPUT + - name: Set up BuildKit + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build image + uses: docker/build-push-action@v5 + with: + context: ./crates/support + file: ${{ env.DOCKERFILE_PATH }} + push: true + tags: ${{ steps.tags.outputs.tags }} + cache-from: | + type=gha,scope=cargo-registry + type=gha,scope=cargo-git + type=gha,scope=cargo-target + type=gha,scope=buildcache + cache-to: | + type=gha,mode=max,scope=cargo-registry + type=gha,mode=max,scope=cargo-git + type=gha,mode=max,scope=cargo-target + type=gha,mode=max,scope=buildcache + + test_contracts: runs-on: "ubuntu-latest" steps: - name: "Check out the repo" uses: "actions/checkout@v4" - - name: Install Rust 1.85.0 + - name: Install Rust 1.85.1 uses: actions-rs/toolchain@v1 with: - toolchain: 1.85.0 + toolchain: 1.85.1 target: wasm32-unknown-unknown # required so that we can compile wasm within the sdk @@ -43,7 +134,7 @@ jobs: - name: "Setup node" uses: actions/setup-node@v3 with: - node-version: 20 + node-version: 22 - name: pnpm-setup uses: pnpm/action-setup@v4 @@ -75,3 +166,312 @@ jobs: run: | echo "## Test results" >> $GITHUB_STEP_SUMMARY echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + test-net: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + - name: "Setup node" + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: pnpm-setup + uses: pnpm/action-setup@v4 + - name: "Run network tests" + run: "pnpm test:integration net --no-prebuild" + - name: "Add test summary" + run: | + echo "## Network test results" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + integration_prebuild: + name: Prebuild Integration Tools + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + - name: "Setup node" + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: pnpm-setup + uses: pnpm/action-setup@v4 + - name: Install Rust 1.85.1 + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Cache node modules + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} + - name: "Install the dependencies" + run: "pnpm install" + - name: "Lint the code" + run: "pnpm lint" + - name: "Add lint summary" + run: | + echo "## Lint results" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + - name: "Compile the contracts and generate the TypeChain bindings" + run: "pnpm typechain" + - name: "Run prebuild" + run: "pnpm test:integration prebuild" + - name: "Verify build artifacts exist" + run: | + echo "Checking for build artifacts:" + ls -la target/debug/fake_encrypt || echo "fake_encrypt not found" + ls -la target/debug/pack_e3_params || echo "pack_e3_params not found" + - name: "Upload build artifacts" + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: | + target/debug/fake_encrypt + target/debug/pack_e3_params + if-no-files-found: error + ciphernode_integration_test: + name: Ciphernode Integration Test + needs: [integration_prebuild, build_enclave_cli, build_sdk] + runs-on: "ubuntu-latest" + strategy: + matrix: + test-suite: [base, persist] + fail-fast: false + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + - name: "Setup node" + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: pnpm-setup + uses: pnpm/action-setup@v4 + - name: Install Rust 1.85.1 + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Cache node modules + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} + - name: "Install the dependencies" + run: "pnpm install" + - name: "Download build artifacts" + uses: actions/download-artifact@v4 + with: + name: build-artifacts + path: target/debug/ + - name: "Download enclave binary" + uses: actions/download-artifact@v4 + with: + name: enclave-binary + path: ~/.cargo/bin/ + - name: "Download SDK artifacts" + uses: actions/download-artifact@v4 + with: + name: sdk-artifacts + path: ./ + - name: "Verify downloaded artifacts" + run: | + echo "Checking for required artifacts:" + ls -la target/debug/fake_encrypt || echo "fake_encrypt not found" + ls -la target/debug/pack_e3_params || echo "pack_e3_params not found" + ls -la ~/.cargo/bin/enclave || echo "enclave binary not found" + ls -la packages/evm/dist || echo "SDK dist not found" + ls -la crates/wasm/dist || echo "WASM dist not found" + - name: "Set executable permissions" + run: | + chmod +x target/debug/fake_encrypt + chmod +x target/debug/pack_e3_params + chmod +x ~/.cargo/bin/enclave + - name: "Run ${{ matrix.test-suite }} tests" + run: "pnpm test:integration ${{ matrix.test-suite }} --no-prebuild" + - name: "Add test summary" + run: | + echo "## Test results for ${{ matrix.test-suite }}" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + build_enclave_cli: + name: Build Enclave CLI + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + templates/default/target/ + key: rust-deps-${{ hashFiles('**/Cargo.lock') }} + restore-keys: rust-deps- + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target/ + key: rust-deps-${{ hashFiles('**/Cargo.lock') }} + restore-keys: rust-deps- + - name: Build enclave CLI + run: cargo install --path crates/cli --bin enclave + - name: Upload enclave binary + uses: actions/upload-artifact@v4 + with: + name: enclave-binary + path: ~/.cargo/bin/enclave + retention-days: 1 + build_support_scripts: + name: Build Support Scripts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + templates/default/target/ + key: rust-deps-${{ hashFiles('**/Cargo.lock') }} + restore-keys: rust-deps- + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Build support scripts + run: cd templates/default && cargo build --bin e3-support-scripts-dev + - name: Verify build artifacts + run: | + echo "Checking for support scripts binary:" + find templates/default/target/ -name "e3-support-scripts-dev" -type f -ls || echo "Binary not found" + - name: Upload support scripts artifacts + uses: actions/upload-artifact@v4 + with: + name: support-scripts-artifacts + path: templates/default/target/ + retention-days: 1 + if-no-files-found: error + build_sdk: + name: Build SDK + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Cache Node dependencies + uses: actions/cache@v4 + with: + path: | + ~/.pnpm-store + node_modules + key: node-deps-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: node-deps- + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target/ + key: rust-deps-${{ hashFiles('**/Cargo.lock') }} + restore-keys: rust-deps- + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + targets: wasm32-unknown-unknown + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + - name: Install node dependencies + run: pnpm install + - name: Build the sdk + run: pnpm evm:build + - name: List built artifacts for debugging + run: | + echo "Checking for built artifacts:" + ls -la packages/evm/ || echo "packages/evm/ not found" + ls -la crates/wasm/ || echo "crates/wasm/ not found" + find . -name "dist" -type d || echo "No dist directories found" + - name: Upload SDK artifacts + uses: actions/upload-artifact@v4 + with: + name: sdk-artifacts + path: | + packages/evm/dist + packages/evm/artifacts + packages/evm/cache + packages/evm/typechain-types + crates/wasm/dist + retention-days: 1 + if-no-files-found: warn + template_integration: + name: Template Integration + runs-on: ubuntu-latest + needs: [build_enclave_cli, build_support_scripts, build_sdk] + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Install node dependencies + run: pnpm install + - name: Download enclave binary + uses: actions/download-artifact@v4 + with: + name: enclave-binary + path: ~/.cargo/bin/ + - name: Download support scripts artifacts + uses: actions/download-artifact@v4 + with: + name: support-scripts-artifacts + path: templates/default/target/ + - name: Download SDK artifacts + uses: actions/download-artifact@v4 + with: + name: sdk-artifacts + path: ./ + - name: Make binaries executable + run: | + chmod +x ~/.cargo/bin/enclave + chmod +x templates/default/target/debug/e3-support-scripts-dev + - name: Verify downloaded artifacts + run: | + echo "Checking downloaded artifacts:" + ls -la ~/.cargo/bin/enclave || echo "enclave binary not found" + ls -la templates/default/target/debug/e3-support-scripts-dev || echo "support scripts not found" + ls -la packages/evm/dist || echo "SDK dist not found" + ls -la crates/wasm/dist || echo "WASM dist not found" + echo "Support scripts permissions:" + ls -la templates/default/target/debug/e3-support-scripts-dev + - name: Test Template + run: | + cd templates/default + chmod 755 contracts tests + chmod 644 contracts/ImageID.sol + pnpm test:integration diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml deleted file mode 100644 index dfecac7809..0000000000 --- a/.github/workflows/integration.yml +++ /dev/null @@ -1,141 +0,0 @@ -name: "INTEGRATION" -env: - HARDHAT_VAR_MNEMONIC: "test test test test test test test test test test test junk" - HARDHAT_VAR_INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" - PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - - hacknet - -jobs: - test-net: - runs-on: "ubuntu-latest" - steps: - - name: "Check out the repo" - uses: "actions/checkout@v4" - - - name: "Setup node" - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: pnpm-setup - uses: pnpm/action-setup@v4 - - - name: "Run network tests" - run: "pnpm test:integration net --no-prebuild" - - - name: "Add test summary" - run: | - echo "## Network test results" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY - - prebuild: - runs-on: "ubuntu-latest" - steps: - - name: "Check out the repo" - uses: "actions/checkout@v4" - - - name: "Setup node" - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: pnpm-setup - uses: pnpm/action-setup@v4 - - - name: Install Rust 1.85.0 - uses: actions-rs/toolchain@v1 - with: - toolchain: 1.85.0 - - - name: Cache node modules - uses: actions/cache@v4 - with: - path: "**/node_modules" - key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm.lock') }} - - - name: "Install the dependencies" - run: "pnpm install" - - - name: "Lint the code" - run: "pnpm lint" - - - name: "Add lint summary" - run: | - echo "## Lint results" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY - - - name: "Compile the contracts and generate the TypeChain bindings" - run: "pnpm typechain" - - - name: "Run prebuild" - run: "pnpm test:integration prebuild" - - - name: "Upload build artifacts" - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: | - target/debug/enclave - target/debug/fake_encrypt - target/debug/pack_e3_params - - test: - needs: prebuild - runs-on: "ubuntu-latest" - strategy: - matrix: - test-suite: [base, persist] - fail-fast: false - - steps: - - name: "Check out the repo" - uses: "actions/checkout@v4" - - - name: "Setup node" - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: pnpm-setup - uses: pnpm/action-setup@v4 - - - name: Install Rust 1.85.0 - uses: actions-rs/toolchain@v1 - with: - toolchain: 1.85.0 - - - name: Cache node modules - uses: actions/cache@v4 - with: - path: "**/node_modules" - key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} - - - name: "Install the dependencies" - run: "pnpm install" - - - name: "Download build artifacts" - uses: actions/download-artifact@v4 - with: - name: build-artifacts - path: target/debug/ - - - name: "Set executable permissions" - run: | - chmod +x target/debug/enclave - chmod +x target/debug/fake_encrypt - chmod +x target/debug/pack_e3_params - - - name: "Run ${{ matrix.test-suite }} tests" - run: "pnpm test:integration ${{ matrix.test-suite }} --no-prebuild" - - - name: "Add test summary" - run: | - echo "## Test results for ${{ matrix.test-suite }}" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml deleted file mode 100644 index 163b1af791..0000000000 --- a/.github/workflows/rust-ci.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Rust -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - - hacknet - -jobs: - ci: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Rust 1.85.0 - uses: actions-rs/toolchain@v1 - with: - toolchain: 1.85.0 - - # We must install foundry in order to be able to test anvil - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - - - name: Install solc - run: | - sudo add-apt-repository ppa:ethereum/ethereum \ - && sudo apt-get update -y \ - && sudo apt-get install -y solc - - # We need to setup node in order to compile the hardhat contracts to get the artifacts - - name: "Setup node" - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: pnpm-setup - uses: pnpm/action-setup@v4 - - - name: Cache node modules - uses: actions/cache@v4 - with: - path: "**/node_modules" - key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} - - name: "Install the dependencies" - run: "pnpm install" - - - name: "Compile the contracts and generate the TypeChain bindings" - run: "pnpm typechain" - - - name: Checking code format ciphernode - run: pnpm ciphernode:lint - - - name: Run tests - run: "pnpm ciphernode:test" diff --git a/.github/workflows/template-and-support.yml b/.github/workflows/template-and-support.yml deleted file mode 100644 index 3c4aca0498..0000000000 --- a/.github/workflows/template-and-support.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: TEMPLATE -on: - workflow_dispatch: - pull_request: - branches: - - main - - hacknet - push: - branches: - - main - - hacknet -env: - DOCKERFILE_PATH: crates/support/Dockerfile - IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/e3-support -permissions: - contents: read - packages: write -jobs: - build: - name: Compile and push Support Dockerfile - runs-on: ubuntu-latest - outputs: - image_tag: ${{ steps.version.outputs.version }} - steps: - - uses: actions/checkout@v4 - - name: Generate version tag - id: version - run: | - echo "version=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - - name: Generate tags - id: tags - run: | - VERSION=$(git rev-parse --short=9 HEAD) - TAGS="${{ env.IMAGE_NAME }}:$VERSION" - if [ "${{ github.ref }}" = "refs/heads/main" ]; then - TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" - elif [ "${{ github.ref }}" = "refs/heads/hacknet" ]; then - TAGS="$TAGS,${{ env.IMAGE_NAME }}:hacknet" - fi - echo "tags=$TAGS" >> $GITHUB_OUTPUT - - name: Set up BuildKit - uses: docker/setup-buildx-action@v3 - - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build image - uses: docker/build-push-action@v5 - with: - context: ./crates/support - file: ${{ env.DOCKERFILE_PATH }} - push: true - tags: ${{ steps.tags.outputs.tags }} - cache-from: | - type=gha,scope=cargo-registry - type=gha,scope=cargo-git - type=gha,scope=cargo-target - type=gha,scope=buildcache - cache-to: | - type=gha,mode=max,scope=cargo-registry - type=gha,mode=max,scope=cargo-git - type=gha,mode=max,scope=cargo-target - type=gha,mode=max,scope=buildcache - - template_integration: - name: Template Integration - runs-on: ubuntu-latest - needs: build - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "22" - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - targets: wasm32-unknown-unknown - - - name: Install wasm-pack - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - - name: Install enclave CLI - run: cargo install --path crates/cli --bin enclave - - - name: Install node dependencies - run: pnpm install - - - name: Build the sdk - run: pnpm build - - - name: Test Template - run: cd templates/default && chmod 777 contracts && chmod 777 tests && chmod 777 contracts/ImageID.sol && pnpm test:integration diff --git a/Cargo.lock b/Cargo.lock index a8c42bcc7b..9bed39b1ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2840,6 +2840,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "e3-program-server" +version = "0.1.0" +dependencies = [ + "actix-web", + "anyhow", + "e3-compute-provider", + "hex", + "reqwest", + "serde", + "serde_json", + "tokio", +] + [[package]] name = "e3-request" version = "0.1.0" @@ -2886,6 +2900,7 @@ name = "e3-support-scripts" version = "0.1.0" dependencies = [ "anyhow", + "async-trait", "duct", "e3-config", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 0e5191be41..9d9c09c222 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ members = [ "crates/keyshare", "crates/logger", "crates/net", + "crates/program-server", "crates/request", "crates/sdk", "crates/sortition", @@ -33,7 +34,9 @@ exclude = [ "examples/CRISP/apps/wasm-crypto", "examples/default/client/wasm", "examples/default", - "crates/support" # client needs to be able to build this independently + # client needs to be able to build crates/support independently + "crates/support", + "crates/support-scripts/dev" ] resolver = "2" shared-version = true @@ -76,6 +79,7 @@ e3-logger = { version = "0.1.0", path = "./crates/logger" } e3-net = { version = "0.1.0", path = "./crates/net" } e3-compute-provider = { version = "0.1.0", path = "./crates/compute-provider" } e3-sortition = { version = "0.1.0", path = "./crates/sortition" } +e3-program-server = { version = "0.1.0", path = "./crates/program-server" } e3-support-scripts = { version = "0.1.0", path = "./crates/support-scripts" } e3-test-helpers = { version = "0.1.0", path = "./crates/test-helpers" } e3-tests = { version = "0.1.0", path = "./crates/tests" } @@ -132,7 +136,7 @@ phf = { version = "0.11", features = ["macros"] } rand_chacha = "0.3.1" rand = "0.8.5" regex = "1.11.1" -reqwest = "0.12.15" +reqwest = { version = "0.12.15", features = ["json"] } serde = { version = "1.0.208", features = ["derive"] } serde_json = "1.0.133" sled = "0.34.7" diff --git a/crates/Dockerfile b/crates/Dockerfile index edce6ffb1d..242070981b 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -53,6 +53,7 @@ COPY crates/init/Cargo.toml ./init/Cargo.toml COPY crates/keyshare/Cargo.toml ./keyshare/Cargo.toml COPY crates/logger/Cargo.toml ./logger/Cargo.toml COPY crates/net/Cargo.toml ./net/Cargo.toml +COPY crates/program-server/Cargo.toml ./program-server/Cargo.toml COPY crates/request/Cargo.toml ./request/Cargo.toml COPY crates/sdk/Cargo.toml ./sdk/Cargo.toml COPY crates/sortition/Cargo.toml ./sortition/Cargo.toml diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index f7cda6c2ee..4a3697ff08 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -151,7 +151,9 @@ impl Cli { Commands::Init { .. } => { bail!("Cannot run `enclave init` when a configuration exists."); } - Commands::Compile => e3_support_scripts::program_compile().await?, + Commands::Compile { dev } => { + e3_support_scripts::program_compile(config.program().clone(), dev).await? + } Commands::PrintEnv { vite, chain } => print_env::execute(&config, &chain, vite).await?, Commands::Program { command } => program::execute(command, &config).await?, Commands::PurgeAll => { @@ -236,7 +238,11 @@ pub enum Commands { }, /// Compile an Enclave project - Compile, + Compile { + /// Compile the program in Dev Mode. + #[arg(long)] + dev: Option, + }, /// Return the git_sha rev that the cli was compiled against Rev, diff --git a/crates/cli/src/program.rs b/crates/cli/src/program.rs index cfcda11e90..1c0f4d1611 100644 --- a/crates/cli/src/program.rs +++ b/crates/cli/src/program.rs @@ -5,10 +5,19 @@ use e3_config::AppConfig; #[derive(Subcommand, Debug)] pub enum ProgramCommands { /// Start the program - Start, + Start { + /// Run the program in Dev Mode. Dev Mode is when the program will run without any proving + /// backend at all. Your program will simply execute without being verified. + #[arg(long)] + dev: Option, + }, /// Compile the program code - Compile, + Compile { + /// Compile the program in Dev Mode. + #[arg(long)] + dev: Option, + }, /// Get a shell into the docker environment that the program runs in Shell, @@ -28,8 +37,12 @@ pub enum ProgramCacheCommands { pub async fn execute(command: ProgramCommands, config: &AppConfig) -> Result<()> { match command { - ProgramCommands::Start => e3_support_scripts::program_start(config.program()).await?, - ProgramCommands::Compile => e3_support_scripts::program_compile().await?, + ProgramCommands::Start { dev } => { + e3_support_scripts::program_start(config.program().clone(), dev).await? + } + ProgramCommands::Compile { dev } => { + e3_support_scripts::program_compile(config.program().clone(), dev).await? + } ProgramCommands::Shell => e3_support_scripts::program_shell().await?, ProgramCommands::Cache { command } => match command { ProgramCacheCommands::Purge => e3_support_scripts::program_cache_purge().await?, diff --git a/crates/config/src/app_config.rs b/crates/config/src/app_config.rs index fd5e93e43f..3b84811b29 100644 --- a/crates/config/src/app_config.rs +++ b/crates/config/src/app_config.rs @@ -84,7 +84,7 @@ impl Default for NodeDefinition { } } -#[derive(Debug, Deserialize, Serialize, PartialEq)] +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] pub struct Risc0Config { #[serde(default)] pub bonsai_api_key: Option, @@ -105,14 +105,22 @@ impl Default for Risc0Config { } /// Configuration for the program runner -#[derive(Debug, Default, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct ProgramConfig { - risc0: Risc0Config, + risc0: Option, + dev: Option, } impl ProgramConfig { - pub fn risc0(&self) -> &Risc0Config { - &self.risc0 + pub fn risc0(&self) -> Option<&Risc0Config> { + self.risc0.as_ref() + } + + pub fn dev(&self) -> bool { + if let Some(dev) = self.dev { + return dev; + } + false } } @@ -446,8 +454,6 @@ pub fn combine_unique(a: &[T], b: &[T]) - #[cfg(test)] mod tests { - use std::io; - use super::*; use crate::rpc::RpcAuth; use figment::Jail; @@ -517,11 +523,11 @@ nodes: assert_eq!(config.quic_port(), 1234); assert_eq!( config.program().risc0(), - &Risc0Config { + Some(&Risc0Config { bonsai_api_key: Some("12345678".to_string()), bonsai_api_url: Some("http://my.api.com".to_string()), risc0_dev_mode: 0, - } + }) ); assert!(config.peers().is_empty()); }; diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 1e34466392..02ed4df561 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -74,6 +74,13 @@ async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> ) .await?; + copy::copy_with_filters( + &PathBuf::from(TEMP_DIR).join("crates/support-scripts/dev"), + &cwd.join(".enclave/support/dev"), + &vec![], + ) + .await?; + println!("Removing template ignore files..."); delete_path(&cwd.join(".gitignore")).await?; diff --git a/crates/program-server/Cargo.toml b/crates/program-server/Cargo.toml new file mode 100644 index 0000000000..acbaab552c --- /dev/null +++ b/crates/program-server/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "e3-program-server" +version = "0.1.0" +edition.workspace = true +license.workspace = true +description = "E3 - Enclave Program Server" +repository = "https://github.com/gnosisguild/enclave/crates/program-server" + +[dependencies] +actix-web.workspace = true +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +e3-compute-provider.workspace = true +reqwest.workspace = true +anyhow.workspace = true +hex.workspace = true diff --git a/crates/program-server/src/lib.rs b/crates/program-server/src/lib.rs new file mode 100644 index 0000000000..46b0079506 --- /dev/null +++ b/crates/program-server/src/lib.rs @@ -0,0 +1,232 @@ +mod types; + +use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; +use anyhow::Result; +use e3_compute_provider::FHEInputs; +use serde::Serialize; +use std::{future::Future, pin::Pin, sync::Arc}; +use types::{ComputeRequest, WebhookPayload}; + +#[derive(Serialize, Debug)] +struct ProcessingResponse { + status: String, + e3_id: u64, +} + +type RunnerResult = Result<(Vec, Vec)>; +type Runner = dyn Fn(FHEInputs) -> Pin + Send>> + Send + Sync; + +#[derive(Clone)] +pub struct E3ProgramServerBuilder { + runner: Arc, + port: Option, + host: Option, + localhost_rewrite: Option, +} + +impl E3ProgramServerBuilder { + /// Create a new builder with a computation callback + pub fn new(callback: F) -> Self + where + F: Fn(FHEInputs) -> Fut + Send + Sync + 'static, + Fut: Future + Send + 'static, + { + Self { + runner: Arc::new(move |inputs| Box::pin(callback(inputs))), + port: None, + host: None, + localhost_rewrite: None, + } + } + + /// Set the port number (default: 13151) + pub fn with_port(mut self, port: u16) -> Self { + self.port = Some(port); + self + } + + /// Set the host address (default: "0.0.0.0") + pub fn with_host>(mut self, host: S) -> Self { + self.host = Some(host.into()); + self + } + + /// Server will rewrite localhost callbacks to whatever is provided as an argument eg. "host.local". This is usefull when running in a Docker container which does not have direct access to the host + pub fn with_localhost_rewrite(mut self, rewrite: &str) -> Self { + self.localhost_rewrite = Some(rewrite.to_string()); + self + } + + /// Build the E3ProgramServer + pub fn build(self) -> E3ProgramServer { + E3ProgramServer { + runner: self.runner, + port: self.port.unwrap_or(13151), + host: self.host.unwrap_or_else(|| "0.0.0.0".to_string()), + localhost_rewrite: self.localhost_rewrite, + } + } +} + +#[derive(Clone)] +pub struct E3ProgramServer { + runner: Arc, + port: u16, + host: String, + localhost_rewrite: Option, +} + +impl E3ProgramServer { + /// Create a new builder for E3ProgramServer with a computation callback + pub fn builder(callback: F) -> E3ProgramServerBuilder + where + F: Fn(FHEInputs) -> Fut + Send + Sync + 'static, + Fut: Future + Send + 'static, + { + E3ProgramServerBuilder::new(callback) + } + + /// Get the configured port + pub fn port(&self) -> u16 { + self.port + } + + /// Get the configured host + pub fn host(&self) -> &str { + &self.host + } + + /// Get the bind address as a string + pub fn bind_address(&self) -> String { + format!("{}:{}", self.host, self.port) + } + + /// Run the HTTP server + pub async fn run(&self) -> Result<()> { + let bind_addr = self.bind_address(); + let config = AppConfig { + runner: Arc::clone(&self.runner), + localhost_rewrite: self.localhost_rewrite.clone(), + }; + let server = HttpServer::new(move || { + App::new() + .app_data(web::Data::new(config.clone())) + .wrap(Logger::default()) + .route("/run_compute", web::post().to(handle_compute)) + .route("/health", web::get().to(handle_health_check)) + .route("/health", web::head().to(handle_health_check)) + }) + .bind(&bind_addr)?; + + println!("🚀 E3 Program Server listening on http://{}", bind_addr); + server.run().await.map_err(Into::into) + } +} + +#[derive(Clone)] +pub struct AppConfig { + pub runner: Arc, + pub localhost_rewrite: Option, +} + +async fn call_webhook( + callback_url: &str, + e3_id: u64, + proof: Vec, + ciphertext: Vec, +) -> Result<()> { + println!("call_webhook()"); + let payload = WebhookPayload { + e3_id, + ciphertext, + proof, + }; + println!("callback_url: {}", callback_url); + println!("payload: {:?}", payload); + + reqwest::Client::new() + .post(callback_url) + .json(&payload) + .send() + .await? + .error_for_status()?; + + println!("✓ Webhook called successfully for E3 {}", e3_id); + Ok(()) +} + +async fn handle_webhook_delivery( + e3_id: u64, + callback_url: &str, + proof: Vec, + ciphertext: Vec, +) -> Result<()> { + println!("handle_webhook_delivery()"); + call_webhook(callback_url, e3_id, proof, ciphertext).await?; + println!("✓ Webhook sent successfully for E3 {}", e3_id); + Ok(()) +} + +async fn process_computation_background( + runner: Arc, + e3_id: u64, + callback_url: &str, + fhe_inputs: FHEInputs, +) -> Result<()> { + let (proof, ciphertext) = runner(fhe_inputs).await?; + println!("computation finished!"); + println!("handling webhook delivery..."); + handle_webhook_delivery(e3_id, callback_url, proof, ciphertext).await?; + println!("✓ Computation completed for E3 {}", e3_id); + Ok(()) +} + +async fn handle_compute( + config: web::Data, + req: web::Json, +) -> ActixResult { + println!("Processing computation..."); + let e3_id = req + .e3_id + .ok_or_else(|| actix_web::error::ErrorBadRequest("e3_id is required"))?; + + let callback_url = req + .callback_url + .clone() + .ok_or_else(|| actix_web::error::ErrorBadRequest("callback_url is required"))?; + + let fhe_inputs = FHEInputs { + params: req.params.clone(), + ciphertexts: req.ciphertext_inputs.clone(), + }; + + println!("fhe_inputs.params = {:?}", fhe_inputs.params); + let callback_url = if let Some(new_host) = config.localhost_rewrite.clone() { + callback_url + .replace("localhost", &new_host) + .replace("127.0.0.1", &new_host) + } else { + callback_url + }; + println!("callback_url:{}", callback_url); + let runner = config.runner.clone(); + tokio::spawn(async move { + if let Err(e) = + process_computation_background(runner, e3_id, &callback_url, fhe_inputs).await + { + eprintln!("✗ Background computation failed for E3 {}: {:?}", e3_id, e); + } + }); + + Ok(HttpResponse::Ok().json(ProcessingResponse { + status: "processing".to_string(), + e3_id, + })) +} + +async fn handle_health_check() -> ActixResult { + Ok(HttpResponse::Ok().json(ProcessingResponse { + status: "healthy".to_string(), + e3_id: 0, + })) +} diff --git a/crates/program-server/src/types.rs b/crates/program-server/src/types.rs new file mode 100644 index 0000000000..1d83ba9b9c --- /dev/null +++ b/crates/program-server/src/types.rs @@ -0,0 +1,154 @@ +use anyhow::Result; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct ComputeResponse { + pub ciphertext: Vec, + pub proof: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct ComputeRequest { + pub e3_id: Option, + #[serde(deserialize_with = "deserialize_hex_string")] + pub params: Vec, + #[serde(deserialize_with = "deserialize_hex_tuple")] + pub ciphertext_inputs: Vec<(Vec, u64)>, + pub callback_url: Option, +} + +#[derive(Serialize, Debug)] +pub struct WebhookPayload { + pub e3_id: u64, + #[serde(serialize_with = "serialize_as_hex")] + pub ciphertext: Vec, + #[serde(serialize_with = "serialize_as_hex")] + pub proof: Vec, +} + +fn serialize_as_hex(bytes: &Vec, serializer: S) -> Result +where + S: Serializer, +{ + let hex_string = format!("0x{}", hex::encode(bytes)); + serializer.serialize_str(&hex_string) +} + +pub fn deserialize_hex_string<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s: String = Deserialize::deserialize(deserializer)?; + let hex_str = s.strip_prefix("0x").unwrap_or(&s); + hex::decode(hex_str).map_err(serde::de::Error::custom) +} + +pub fn deserialize_hex_tuple<'de, D>(deserializer: D) -> Result, u64)>, D::Error> +where + D: Deserializer<'de>, +{ + let tuples: Vec<(String, u64)> = Deserialize::deserialize(deserializer)?; + tuples + .into_iter() + .map(|(hex_str, num)| { + let stripped = hex_str.strip_prefix("0x").unwrap_or(&hex_str); + hex::decode(stripped) + .map(|bytes| (bytes, num)) + .map_err(serde::de::Error::custom) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use crate::{ComputeRequest, WebhookPayload}; + + #[test] + fn test_deserialize_compute_request() { + let json = r#" + { + "e3_id": 12345, + "params": "0x12345ffa", + "ciphertext_inputs": [ + ["0xffabc123", 100], + ["0xaa6de432", 200] + ], + "callback_url": "https://example.com/callback" + } + "#; + + let payload: ComputeRequest = serde_json::from_str(json).unwrap(); + + assert_eq!(payload.e3_id, Some(12345)); + assert_eq!(payload.params, hex::decode("12345ffa").unwrap()); + assert_eq!(payload.ciphertext_inputs.len(), 2); + assert_eq!( + payload.ciphertext_inputs[0], + (hex::decode("ffabc123").unwrap(), 100) + ); + assert_eq!( + payload.ciphertext_inputs[1], + (hex::decode("aa6de432").unwrap(), 200) + ); + assert_eq!( + payload.callback_url, + Some("https://example.com/callback".to_string()) + ); + } + + #[test] + fn test_deserialize_compute_request_no_prefix() { + let json = r#" + { + "e3_id": 12345, + "params": "12345ffa", + "ciphertext_inputs": [ + ["ffabc123", 100], + ["aa6de432", 200] + ], + "callback_url": "https://example.com/callback" + } + "#; + + let payload: ComputeRequest = serde_json::from_str(json).unwrap(); + + assert_eq!(payload.e3_id, Some(12345)); + assert_eq!(payload.params, hex::decode("12345ffa").unwrap()); + assert_eq!(payload.ciphertext_inputs.len(), 2); + assert_eq!( + payload.ciphertext_inputs[0], + (hex::decode("ffabc123").unwrap(), 100) + ); + assert_eq!( + payload.ciphertext_inputs[1], + (hex::decode("aa6de432").unwrap(), 200) + ); + assert_eq!( + payload.callback_url, + Some("https://example.com/callback".to_string()) + ); + } + + #[test] + fn test_webhook_payload_serialization() { + let payload = WebhookPayload { + e3_id: 12345, + ciphertext: vec![0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + proof: vec![0xde, 0xad, 0xbe, 0xef], + }; + + let json = serde_json::to_string(&payload).expect("Failed to serialize"); + let expected = r#"{"e3_id":12345,"ciphertext":"0x0123456789abcdef","proof":"0xdeadbeef"}"#; + + assert_eq!(json, expected); + } + + #[test] + fn test_deserialize_compute_large_payload() { + let json = r#"{"e3_id":0,"params":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001","ciphertext_inputs":[["0x0a8a6c08021080101a806ca049c3e165dd0d724db8e7ff91bd3cbdcaa21b19e3f5d254b350b328207a2d854f4b244107b674477d101f50daafd23feca3771c0923bfc2a19a419e095aa967a0d7ed0c7b59665acbe2fe8ea7a99874546e2092f93f37be13879d8dd6364d06b18f3fdf4a678d31b7456222e772f9c6c49ba9e4d7541fd859905f357acc380e3bc259eb987a800d20feb5fc4ec89a5d6ba519ffcd7d75e6ceb448852592db96bf1ba3e29054b4aad860a6f433eda762cce5960a23f19ca5f6dff895bf5bb78a15e3808a608b9ed38603481edaa9208f0887841ac4af289cf6b6486042dbf5e2ac1b53199beeef6129a45df4c6521664f304b955108539dd14596065a14d3f339936b421dd47bb66b2a49b367e40c8f9dd09697bc04aef671d1db930b0855326a8eb31975415d500b0040e6e56f40b6574e5ff2cb154d6168015522e504de9b25ecdcf3837d854017be5c80bb847f368958cc1ae157e82475ee52c9dc7b5e5ef334201c370af95a3af1c790ea9e27a538e44e3d82a6b0181b7ad883e4f7def4d2706c208b3e7441d9afcca4dce9247fab7762a6ce2d1624b3e18672610f219bc9755c8314265185fdcaa3dc203bd79ec6e6ed4a7b0b3ad5db383cbf290acb4ae9eaa8904d3216df99b68acd1efaa78207b89aa7814d05835b501680dfbf8d8079dc01312ca147f54234f010370df9ffbcfedc737c87bded7a901cea5a3077ee7fc4af96f8e6386245abf707a6b68f1fabc4b6b0d1704c45852aba599db14fb1cb62d6a1740d5813d6bacda9107fb6b0a1e26c2d5388fbafd9d53b6c0e26298742d3c20ec17cde0720805295ccc8d5fc930bf683b83ab644c8c59b55d4a0418938f44f597cdec69c97c8a1baef1f674cc18afaab16a3138ec1ac664c200659b55f18fabb7db1b17251e63b05a556f129659504f6a2a0207cbf2ffe353aa816ef078ad4f6ec2a6a2e5a7bac9b3104b1b6c234811e1bbd415594151b73a334b4c3f28dd865348568b3a4fa406e56dd7b1b0562859c8cc1d0dbd2b72d34c5e4c9a7625024b6e3918e1346aa9c82280787c4de8842620ff78483eebe5349de09703afe32eb938e68c2030e9c0a8e4ec730279a1eb63291801d391cc89b6d13febfaf85c82c832af74681c0483efb6ca8a384b33775720246832bbcaec495efd92f72602e682a75c9d9f6d0ad35e73d1a4017a3868adb52ebe5a080ff6c1b8c7355eb39730b59c3c6e9a24c483bc997eabbdfa778eebe9d3f44e2e195b8740ed960bb27dc1fe08edd8bac12b264cecbe548dfd8264ed7669d7534a24f098aee146d46fc5efb6ada42af40899b0de9ffe27fdfbdbc6f914d6be23d9bc15691876a7d64c7aaa0fd58132f514fd3e772ae6b8dfc76e939576efec7bec78214a7aa2675402cbfd1c44f39af967004ac409b6743ca4f3a7acd50ad4af945c4d2abe0397079eb39735cc7ee1418026bc6822b8e42d0dc46b1e2c7db2862fa057c312c3c76e82d2e0987d27b7225e4b40eb67edcc2b35e671884937f2992c25c00fd8cd24e987ffb0674627dd613b2393040a70d5f7caa12010651d0d7ebddf17acff6b156562e61086e68971955c03fe0a7355038ea108302df3f47a91dbcd4fdc24a5e37920923f61c3a8cb665dc41687c3f6108f4dfd4536e305fa394a92e554f5fe3cbcb7f6c1a2b6799ef2690315ba07964fdafc64944d6c54a600362cdc6e4e00d1747cfcf9c433422607d51ce54dff2d7c09dcbf9fc282d4621c8d881e6643eabb28ed20188d6cf67ab7ba7f45fab1aca01d26b4a0076a6b6f029427ad2cc7babda3fb75cc044d70cf4aa9b6da079d318b5b4d8379a1913e80c5268ca4151db34da60343ecfd5fbc4fa5749cbdc8d432180dff3a480c8acfa6197c400c42e3f8eacebbd769e4ddd2374de9c750f84063a827715457272559035fdcb6e39fdaac699d7285be86d3aa64486085d3ad9c43344c9b3736c2469b9c7eb00cf98f0466f07f738cd3c96e12ef0728f20116ad462fa9cba27b7b7b0f6b18e94050c19fd674e43a2127bff51045ba975540790ef36fe3bfc2db738475b36f6abf5e9140bcddc95b1ef31992c38e9c96553d662f5f9b352b33237cc46efdf5f2e35980f07342678ade5ac5258463973f4d05f63edd0479723ae6a701989433c7d0dd4534d82e73acf22e4486d1c61e890e0246020b4b21563a4290ec4361b91517cf8c63847d48b36d8fb36c0dddc454f80671bf2d9d71f35307bc789948e27d9f23b079fe2ee1ba9e0504de1ca324c24bd915e049394bbf7c28fd327ab906a18abb6f33b40cf01a1217961948e8417adb55d54b7ad18e04c8da27f881bd554cfa46636e11d0a60ae5dd7f2e7ad27800ce53e0ac3dcb2e8556485b874b16f49486f9d26acd1d6afbcb06e1da93717fb6e94f8f0cd80840ad3f1ead39dd3faa2fc7818228963b1db2400984f94513ddb427176a63e4af53da9c31f9d279439a53b07e19ab68085f5ebd9091b2cdf4fd85d19ea757cdaf462b13871ed5a918b48aace7c5ac1287bcca734c65c5e330de3c96ea6eda9ab1450afb830e5afc88b2b925955097c4ad1609465368fda745843da614a97f7411d79268b4f2361e9bd83c83528dbf1a87fc6f89a7e2abd6bfa27c1be2270d28b6963142a07e6ee8608806f34247e2848e7a5befc8bc87b221fca7bce629d1c72e242f40e44edf71f062501947d68b2fcc6e038ce8a43dac30e7eff4e74f3c9d8f642ae90b57a6ab886bfb60d3ba42840270b15830a75538cc33fcc2bb149217530754ff370719d125f2b41096cfa4c745de9089e69dbd086a06a704abf108331a20a5ca1a72b723ffa157c6c1cc7b8a97bbbf3928f014748c9fa89542eaa6016c664eebd6cb01db4839c2083d5a4cc38a871cffeb3a52667c593ef5bf65c11b4ea4732bd3a6fbeb8ac389de161c565a6653499ffab5a71b09ace40dd79b6d7ee919db59541ed7ab694d817e37e467dc8429bd58b8ebdaa6c1380b0269a87e6fbea6edcaac0b42f5798cf0cde4a3d5cf5ddb724858b63fae88826b115d00c00bf0a909c1d364ba5766c890eb4fb865b2edb3d6726c61d449406a438c7f1c853329a62cc791f928ff449c4f289aef8a72da06b772aedb21113c27e79fdff81550f7f5269ead35348116eaf8401459efd3da0ee6918429ba16335d535f0af3d33d8a4c146bbe390b0ae6228aa41b37ba9177f5fdec944ff8156cb4ba786145caa47e4c3513be0fb8e9cbb220aa647f9c87cec202b8d625c639c8324e6233a10d0d74dcbe6d391cb7f5bd3e9ce30299cb4e01e569bfdc0324d503737e9c28c58e3269deb1688bc70c0db4c6e4c088c5d1aaf31c598c010a5590fc03d9262601741dbf0662aa71f14fc4cb3643fd6559b3407f2f3469ca208187e22f6bcca28df708aa93e8dc85a64489565cd69966cbad6a0ed805bff40c1c9ab84ccc6c4fc5ba8aa71720274301702df3c874813977ce2f2026213924a66557b88fb526e12b943bf9bdbc496c2e35c4193457650797b599b6362bb6869939c0fbb51486112a8ec38ce49d3b3a3990895f0aefba7bfb928357551589346830eb3882cc840965eb55b8860a2594e613cde2613663327c062feaa3bfbe192c5c53a29166add212d7ace1bc858fc65725163dd5fcce9e12f1102e320ecc623904339e370514e0ebc4a3ec8ab11bd099ff8805695436548433fad5a69d7e08b3b8e1569a0eb79a77e2252442434393008bc2bdb003b2175b79f47593d99146d041c6df7abf8bbed6a957e7deca154d53d597625849050c453ac2b8bccbf3b49989d8d0276223dcb97e9d3f209640fa2d455538fffff1502987953d5a34e27088515bd08cabce3d9ff2e35ed40f3b464a1797896eb05f79714a855b013d864714e16a553ecf79f71ee935871bccaa30c408e188a48f4538413ae13fd2091fa1a36acc981753e937ddb90a20af6f9eb2679ba5ba50a77d69b5ee62f11d1bad3d3efe31bdf108f1620417933170bc9062c739b3848ac61f68cc02b01987b74d33a6ef2025dc512e412153ef6a69fbd767516582dd090ad42b4e74c726cf49fa79f7ee18fa003420f5559f345c5b7deaaafdf33dd1664926ec339da5e08cec6a207f264323d70f90109a3621fb5bf2ce0672aa9c4bb52f66a0b661866c9792328bcf9b39c0073bab28757a006c9c3d862d6e208a16f35714f4e562fc10881f503277e035b9bdb9b2851204f5fe78347c6cb34fe3094fc5b41433fd509bbddb549840ded7aea3e13e3226893852e037c12f1ddff92ae671db83e64f24245e2148194b006448bfc6a3ca1b961c49f6850f8115f3c17c7452cef01aa260a2f648bcc4551ed00ae3b124f0bb37a2b50a206483cdd72673bc366c88396b76ecd789bc32c52a59cfb322a1758d7be23599e2f41a9d50aa3ca12739f0ea9fa82840dbb113fffd6e9e1fed7af23938c81d1801b1551216180f6a891b50a4336f67d4bcec74d8748ca2289da14cdb975c22a00f746183fb2407c38f006a246e9b1f562ad6a0ddc95f820c9768975310558044df1c44c6abc099753272ec06650a4a1117cdc10662bd19f66d9c2d8596ca2eab7137fc731f53a93154f37dc24b254d1c03d1d85244dfda7fb8ffe8711f6bdab0da62f7bc77f172c4d485f878aeb1ba4fc9ef1883bac943982341a39753ec2ef9b5c305d706a8b48c69a119986e4a35ba87036ccf1a2f3306f07b5776a25659b7256581a9bc471dd86c4f07b348dda7bd4f9f902e41b0155b0307209d5d61c400c1347b4de54caf3161ccb3d7f0b28661d57e737dc625ae60c587d3c55fe039dfc5afde9d4c159e1945f42586617501ad8b1aa0d8cd2449ab7f6df7aed7cb73b90c06753456b929039012451957670d1ac9370f28e5b6581965f8b143ddf2e2e5fbb6d8e43f7de75ee7358749047e97169899285e85b6fcfd4e4bf3238e8ac109e6b399c9209469b7804390970b9d0bfdae2ddb5a9e3bec72bbf458e1a23faca596cd1a432ba9e294503a97870e42ecabd3b5e372b9021d96951e98b85e4899f18d818189e64497f89d9e3ea93fafdb6ab31d88322e6f82341535ca39520827b8af3966c16ef6bcebabe58546f206b63745214c8d2b2d31ab1a54638402ac48ce253e8de8226f3640f989ff5968a1809dc010feb1a8693782aba839563c8c18d2d23a7969878f1585019a0c4475f3413479eee743f29d26a1bdde1922bf9fc61bbdd0ab390fe7cf74cc7ced8242c2c024e097fd17a96dc1e6cf5974d8b9469aade07334da346f589890a1d98fdbeb3a268c165ed4caf2655a2133095aa1e4574f260d79355123feff27cad8b5c51cc1e8bfba3af0834e90875e34129253e9d4659ef75ff71cfc49fe82b1c57b3f1deb3e9a37daf35e37f52cfe98a56ed9d3633ab21d39376a4c6e55771983ee57693b2dc28e6a935f84071d2729d308b8ad192568800ada82ae9ee44269189951f120939fc73f2318f75ed4d89cc135ddf2a5d648dfc530d55c63ca4283ffb7153fe86a37a549878995e4fd48dbc816e3a7eb705f8373ca1d1c3cc07de5cbb5dd5b0ff68a8e6f64f76c60e3362a10851321383a7f98aac1e0006c0fbe193c2a7827a298fd7d5e30cbc661b93172e4e6144f6bf2d23abcb7b8740b6f8459f3bce6177f6d0a92a26e9683c76f0e6b615cb09d251896d30c23e0ec1ce88433b8f8ba00014382bc87e0769588b5b5b970046dc9274e56d466ee4ef59d4287185aa4e6b9dc241145421443ab0c631b579462513a87468a7ea08c4f76d2d4d788017a4892a4efe60207f7c884bcd6a72ed45ceb6e99246f18b0b94d854a27a1084224299ea2669029ed01957952ce10075804bdff3d4ae0e58115319fc146481902fad05923e1bdf3a1511bdbeda1ae9d587edaa02acf0ac613889c4ab7e8b5bdd28e85427921e15c0b4f1c8404bc76d40d138e5deb02d632d7aa4d2fe8460ab8136928b456ddd4f642dc24ac0e0c21946392b8ec5f74f4ee9ff0f66d1042333396d4cf14f0cd6c8d76746af2440d70b22810e34f5d34d679a82118320fdb397e65fe2279337a226161197e72a3146d006f24fa88647293d959d8956a480cee9c298d734ace59297f0e51506da0ae462fa966d869bcb7923278b4e74926384ff9ef102a71d74dac0290e670d1123440484aeec7c77ea1388214422c27994239017c1b2473540b662bc30222affca45b054fc1903991bcff310321fa37af7af15f2051d11d8b12a44f20ed4dabc8f4be5c2ed91c35e9ba597db04fa8c1169c1765fca0e7884446c4787cae17ea7970d566ce218de3c76a7e65cdce6eade69e8aab807093057f4489606ba4ef49e70fc78974ac2d7305cabf142f3d0277dd995b13eef79b0fc397b60bce1827bb75e7cecaec8ee33ef0e0fc01600c8d6e4961801639aeb287159f7e7ca0aa151772a66952ba9c91a803c59d15c81e2431faa3274aac8bb2feafb490f46acc508d4d018b39a140f69ae252f798abf2d3671fd6ab08995b4a4ed85be958b7f44b837453b6596b610b7abe2d06842fb4e95142367e80d2dabe6b8c17c27316747328bc93d665dca6280654557bd14caa9ed1c808bf12bc2cc47ef2f4773f7fe596dd6ebde449ca20bd3946e67074229a69ac1f08dee5d9ace9c3d9ab7dfdfd9771fc6c7c2366116ebd7417dec676d1ee48de0a4a498c2eb031c89a82ba8f6916989ccf32c3c029af45a08d0d30199897d05b29a120c299812e7c8f992383992324861d57f27a553cb6b50a39003b567a293f496969bf5a6f4a3a197fd41b3fcabad659b426398942cd8b79fda00d644ec1429e60c3f16d3000c7b751818a548722026deeae5bc9dd295debbf52296adfce9e8715d6649942cc23bf80b38c2dc82f8ed1cfa30a0d9bb1d8c4a4eece32fb7d8e3e792ca8879785151a0e5443b63f81c9e52f842c2dd5633ca97a1d550bdcf7b165cb04cb381984483f0a49e79dbc578ca731d0bdc7e48921ec371f40b28ca92b99f2c6a022c23f23f9ac8eaf9e9cbd7a35fe8546dde4cbe7024ef9cc1b161e56fe8d8394372ea871efbcde6ab292797853a8feb11fb95ec02ec9ffddef8eb58e94b949a33c08fcdc5190ce14b60e82ca9012bd9869f376b6bed0d8582ff1f782e2821fd410a5249ec3bb5ea0efbc01df1c5859c179a7d64d2645f6fa02ca93d88c998f644dcd892d25a6a9a449bcebbc87f4b0861b5af3165bd30638e61236ff2f857160a8ae9cf9309efbc8fe94ff8e6fc7454f1c81ddce47dcc0bb80192352b4e25554250151c21a21104abdbe8507348763beff441739eed1aca278a244e812e5efaca70127a16a3c9c64779b2de4eaf936e5f159f8f38d5197575fc83ecae499b6a0e427dadc7717e166009a4026ba04938a55f00dab1587a4fdf75d89ae6d0c9c21debd128445fc922804097bfe260311fb19aa1d1835c1f0db069982e7a9e2ce09ff8913bf9e3fcc9988de2ffc237acac8f54f95b6e1794513c89e2dad62b5775f588f5fc6d2a48a43b9174332040bc89a27e1512facefba82d77f9a3216a36f28271502bb784cfd5f5715c806f04b46273bab8fc0a8b12f39d4d4da79bdb865598a774e710e44327ca33bc39d70e93d36cd05bbc3d56b997d9f2ec01c46e64af25b6005091d0c04de503d46a046c9a146aa35f0b06a7bd877e84d2cf52d6bf8c353d807c4d962eee67f2d5aafc6071fd62a10120abe17fac0281a0478d53b37eba1cd17e31ef4af12f42f52694982300f2a046fb3af606a9ff257cfe9ab0171f4ddc6e45d2613c16fd3336394c13764b98a2fe8f22f85bdca4967bb7c0cd0711fdaea11f56be8dc79ca079bed6d73957d3fa816ae883613bcb98699b833d55e22167a4c5303e5a5a0e8c3f5f385b269b9297eaca3aa023b91ac1cfe193042fa92a26ccdd96f522d729335b5abdc6aab80eefdf02e85a97b4a0a21d5173ad451294cbeb99288a1d6acccb087a4d9b3218dc3ad84868b3b21d01acd4cfc3a97a3579f2f23db1d955307008d9251999d362bec24d50ce11038fff143d70b5b8523c60fb2f56ea4b5101046e46b219c09f181ab3d0c6edb7cf2c7f901427314f0f0ef6636f7d670c8b241d8ce9d3161e1a7d736e47135c6167e26422d684515dc6d90dde11f2a38423ef2cf9b25c8ce0c97d1f8fbd3f4b7d5a3cf97d6424bd532345c4e4024bd3ed6ceac4c922632d42bb4f187509d63f32fb0181cd061e8ccdc45f2a30702389c798490e9b82a0b4c23dae3bf95e246312eaecdda39d9d4b601fca0b2bda3d26250fd35655d2517f068927965273a9a6d14cfe908f0466befdee963b766bd18a85b9af93dae09688d10cfeabdd3405737bd9ce484b16184772c3a40c9695fb54dba677bd1db8aa64b69ef2069e14493e7e18b9e86cfdbbb85198d73a932a6e972d830a0de56fda439507dc95e27db1c1512774aa91a4042ad17e2c356e94cf3bcdd247b39e5825440f65552b006db2923cca9e22f200fb21e6b7a7534e67d5a79670cd03659cc3501d752613341c413558de1ce4b52d2d3d5243b0e1f1c3a3d14bc6ae6947cd11157040804d2412d27b20d567e0ba88c03c1b60196fccb44a43a75ea0d0b70e465bdbcafaf74df63f5d1f5d958a59da490bd166dd18c60a726d0b56a1c67b04241a7f169fad65144ba0f0150abcec159c1693089ee93dcc37c2d099dc7f68181971aeef873a7e20d7772413d5cd245f3d9a5e56e0807139872bc332ae7df88ff36f4ced695582e986706d686359bf23903f994e5fa239c30fcb3dc85d3f8e28197a50b31c58dd19a8d33286fb03f923323072fe91a337a8d63aeb8b33e35011db017acd3287ac3e222f4534fd097e102eec9f22031b0ff0eae8ebdda1f1eb36cb540160fe985cfa28b36490fd350b5fe78a76758eb8bd26234832075e2435fcae22f60d6206cfe7bad8e5858e17800d3f55cfed826b920ec582674cf1ffa0c2517540b3742b09f0117cfb63cd68b13bf61f10742ab301a859122d862cd2c9bb9a70e58cad3c896686f937b21f653b35275c7b292b044d0e82868467f5d293f6e6ec7370c9ee7721b44dc6f19470726fe79dbe51f2a03bcf462f2194b0caaecc00550ef59edc6aa9acce9c2128263b782c5aba11e01ddba83c94e394d805c635b5ba01d55742554b3f2c80a05ca7257bfda43583e9e5cec06d9d0d55fd36ba42bda87662243a2978ee3427ade52075573018cd0b429fe7276f9fcff19f5df1596d76e253f8d6228821a5da697abcfe70ecc243934b0f75361f607ab8a2ee00dc5a2db003089039fd19d63c569aed4795debd782b262e8b968c5bcdeba373be6a41dfa08ad64da32ef7cb42c13a0f757c13e2d40bd8e9eb209b345bbb422ac8627f20b2d3db75f7f497f338f96ec013c81044e5761f0a562aebe1471cf5c47cacfabaaa93f9d659a90c3919f7fc4a9a9c1fd0435cdcc64815378aefeb182c95883cc6e18032e67067c59b2ccc094fb9d52f571873fbb59960050e2a04bece86a4d23640a0e251ba502ec4e2b3e0851ca98f88bd707a0aa4f2b507c15e4b6d38f2aebaab994ff884cb4ec0b3e7742b9f912bc63db025722787b5bbd7318fa362e83687e33233fc419ec2b65336cc88b10c73944f20ee4b57cc6d01e00505b0197be281a316006deb57ca466fd8e1c67122a8d95289f1bc4ebea5f30c3bfb7bdd322a4a993560e075951375fd901ae2a6b531b35ffb0c0797b3aca5e13d0063ea60e2ad9af26e2ff31b6dab7d7705e5475daa187aed78b2814c460742140e4375f9feeff8f0e67750bce584f0c2aa1627ea49f7cec1fda009dc47479359982a75c0a0e9e62e30e8ed113053cb4995e04997b2d1610fa58915ea4c87af5ef7e86d839a98a42686648e6210220fbc3392815c72d67a2e7d9d84590a4a733c4fe5e539ce418be57eebe16b2d8059d61f61a6f4c9a314d99973557fb2a57f54e3ff24398954d71fb9403ee44cee0e83dc8a90af13a57ba60b9040b575ee7045246e1279439f88a875d9dcfde6d9b132e46cafb43f5353a623b11b0d357e19470f764a53c43922feb3a9995bc8535ae4e577166837090775fdb4d94ee07bc13e780110207ca424fef4cbeb95bfe4da4fb151a8b3f2e864071a964c4746867f4fbc091b62a30860b9d61658f14615736eb244cc923a16fb5462290769d4e9cef84918aa806baf16cfb383397165ddd39ce9e9ea1524133eabe820447c1bd50878a1569db9fcbceca624e9e7695b7cfaafcd2e9ff876f05f6da03848caede660b8bba9dbe898ca05c0a076ee95ff213cad1b3854b51349aebe065a2b1d1f5c9ab080c27a15a9120ef9193eabe60f38505f62d3d473d9236f81d0a359c506eb4530185b8071178b8545df1f831e93d3992282df185d698471522868bee153dfa1678571fa9a800b035ec08d37f62b19849410db87915464260c7678b485e053a90bbac8b364aefc448aeb176231eb7800b17648023a9acaa69c193b9fff902f6f1c09dc10141b931f38a53860f20c57f3b2f2ab8e0c0d858a13ee3d0f73395929528854d9a2a8fac97fdc4384516ed54c114c96dc88f0dcdb2f921be29778a1b61b2c4b6339d6844227a7bf3b8c344f0b1f2eef8a27048ea785c7181a018721400b1c4b604497de4546d954c76186dc12986cbf08aa90bee611ac28c426c2040dd29e8437a2d11c29a1dac00476012338911e0fa245df97a6cdb8ef23d13506a838f19c43fd33b11476782d58135ed7189da165e41fa04890f15409062f391e381adaf33619571ccfcbcd60742e2d430dcab8425ce7dfbd46ef3a72e027a376f1a2fd1e92e78b86d5d82d45a66f9e55a32fa4b0096f5abe089187c8b032b4b9f224042bd0a45a5b6fd3e29c167b5e715cc89549fb40e2e4e96fbced9de4b4ea8e4018c665d17d6076208141a94bc5362583b2bbffc9fc8d79306be6a310c95a9b6be38ce429237b74c332e1ee1bea197917a1a2e4b7abf7abe3eacee0a945b138df1fd6b8942788cad7f116ed1dc5a419b1ce1fc3965ee17a3766ebd58c5ab61058cf6ee1f321c518614646cea26911914851c312f372583f385e79a1dd2ece6455dd30245dc046742a8b25763e6cb7e940432f46d10c5be70d81954067ff3f9db070df81cfc4da0db1d2a733e2770febf22858a766e984ca8b7b607cd749bd3a8ea0147d840bd24ab0022688bf942b651bc0a5651a479392eb507da1a3d9de2015e57b72ac1abcabe2c407ce6894087e565e27bd3ee9eb156d384839c01c5357df067e95fdb896b956906a734d5f6cf767882f2a45ab63e46f984030ad9a51b82e38ef8ccbdba7a0617f5ff499433d168a7d60194c076c3a66c1b52bf9cd0efcdc4cfc92b7f3c7a4dd0f7a12c1cd58a477a072033c156a7fc81ae128b9b3d50cc41acdb56b129ec2edb6d1b81ecd60737217382157ac1ea63e56c28f82c6d3facde849d4bb5cff9e749a88f7afeb464225d6f334c03f70b3da3bc743e7f7c5eaa46937c4e412a498ea1063ce4115d74565faf6f6f81cddac4595a32ab8f9867494e4793d1b5965558e264f7b65085441007adde5634feaebaca9cb0c4fbd33942fcdd7ece91664c54524f00d6dfb9563421527dcd219ff54b2578dede9ab9e2e01b5e5012385de900747caa4eeb772943fefffcf862be39080c2614c4d2d02ade05f30129d01007643e2e5105de0775f8f9bd63a83be110ac8b47d5c1986fad0fb3f7cfef8230b9e6eeceec85df2758631b1fc5bcbb91a3f8de6f7251a31e22ddf822cadd66adaadccd0a8853cda0ea06e2825aa6a8530412d88cf37845bc0443d3de39f7338c5898f82c268f60278d366235768c692946009a93d9f6f21ccd38b52301dab871016fe534b0528cde20e8d30bb8b3143875d84aefd0e2264b39098578871d0ede2cbcb274251ee0ce92ded6edd794089b7f9ad131a1ed69f349ab91b8d82f2cc76d9e3ad216404964d2a8d2e9226c3121730770cf43be4ec216cabd1c637b652c15964bbbd8bb22ef6080eecfac4b99bf87e16f4973299cfcf0d666317b178ab8c56b3ca8d7b0da257ae7f875db68ec2da25722ac7fcc1a1fbcfb3b8b771db8f6b4f9d079265cec3a343fa4a90c8281a3e2068d915fd4ccb1bc8a679e11595bd84f9024404e986316b450c87352f7e818a48083573af94b41571ac81aeef6c9c97436e622143bd2fdd82a54ecf0d3a254528c0218bc322cc72d5ba4e6e737cd1321b55145727772337b5667ac8a60b783c30130dd7961b2e63159cc9ef866219d2e316f5bb54cd399a4a5c3f465b924337f1f9d522087ef76bbe4a605dbf72ca09ef27274c77e765df97eb974f84b39a228f65d5558439cc7259dc4ea0b308c2afb7346236496dfe89a4b4986558d6822fb409ab59dd2d9552cb595a40b83aa7bd1cf0562bc97cf704f25d710799dbea51cd0cab61d3891a1fdbbe46343c593fca944acfff6887eef099f895a13772aca46265b3a87d4792beabcb97827205da5b93aa61275f2f619743caec9327fa981bcc549393c0b58ac2f076f10506378bf963cbe55b0f06c9a71c251d22990aee58e31587857028c107f5e610c1c780b378e78bb2b761aedb9e764cd7bc26b5425197ab833892b8454ab02e91215340f032ce6f35249517289ff62266a30d636c532f065b5540c1c55e746ce4c605f53f3844dfc12c24c4ab941613cb2acf8571219a1ad04ec2f5568f454c089b82186afa26a0b8d5ad36a79d73f1ab9a9ae3980e41ac827ecb5bab47a86841f14134aae92f2debb3813f315d909bf3dcc16707ba9fed3f471ad442108468661fcec68424f7cdaa62cf35a2b355437d42269a551f87866cec04d0e421aff55f7c80ab439ded71b50dd03365fa71167537fc450b83fa442e1c91de25c09d07d51bb1775e95d75e74420fa51c71770ae1c0830a56d648fef688ef9779406ed4b5e965a9a667947f28f241d0a22e8f01df4c18ef4e3cb5304ade9fe45747050250e64f9585d5de7f783b37ba9368f482bd5a4d2d9d1ecf819ebb0be6442a531d7a1c458078e399f37b4f251adb56b7c972355c6a0de6b7cbc740fec8065035d7166acd87390f13d5baf7d6edf176275181f288cb1b24242291d133d8838b69e6c9351f090abf52da73ee16b8a98c808a2afb0c486dd186e245075b1f28d70068aba8b907215901ac0dabcc3417f08aa1fa485941860865dc0d904d39bf2f18fce14030ae958879ce9deaf78b83cb4de9a57efbe56a7aabd834cfcce75123ca9f036f3cef1d56937a84d3bb92744a515252b0f3bdc9d82a03ad639f7e13fc8d6fee9aa8a561c787c391d237f4ad892f1d50e37284ccdf7539afa53c53bf97326d72d71a9b70133029aa169b998c3ea757dd2555180a4beb95825c6f39bfae8c15bcdb4be0a6cca7eea462f562ab23f53ca0a800d440746bdb3b4aeac234eac7acf05288181a72ac40fe2a8e0cdc0ff5282bc0aed6ed99b7f060cf92cfd8beea2ee30b2463bdb8ff236ac3068ca5d7c295ec61417fc6b802f1bcf425bdecd2342a962d2ee7ea00e1850830e5f45667fc150b30f0fa2effe1adac431da05b4eae913636ac6c69fb9666d889ce21a21725e444355b200efb4d9296738840e88ead1798cfe9dd4918ddf02c78dff8bdfc382287fdf8980d88b513224cf2afb3d73f248b99e3e97eb414ee266b3cee0d08a9880b0acb157fca424420319bdfe587734d568cde589bb80bfbd79924e3393ac550271e6fa13d70f8491a276157f5fd11ab6b09e94288304486bcc2b636c79af0d64496b7513f6bb34ae9a656e5d0e44605852076fa4c606e5d9131b9ac6f1fdc4e415d663cca6e76fa6a43483d97f17e4de38104db7974643cc068862c1c56b903cef19fcb16150c0b7c7c1172c58e388c33a1b55c728ab95954c515afba56bff5147acf7f3005942714c1cd3b24ed9f3b4b8418c5d6d3a3442d7cb0870f0a5bca6fb4ce31c87e59f320c34d57aff72e2c7de0eeb3998f4a5841f949909d786932b41b05f2dd4e190ba7284045fadc4c0b057c79d00d30e30aa31dbb02c5867fe2d81612eb64316979adc69f9e7668d12aa8b1cc28e7606aaf8a03f11caa67ebb821cf69bfbeff78c544759ab760ca211defd33f0018adf69eab503634dc2958a0231418fad840600b915ccb318193d0716f1206fec5846ccfbd43f985bf9474846b710b5456b9cc2275bc9bc83375e83c87b31668927523d50bff35ca11d8f5c2d23e5423b3a9a496eaec7145e419425e0b5644046c1a60b363a6e06ebbd668138ad4521b1cf09f591a80ed36ae37671b90330a180fc97be3d579940fbf9368de2178a087ecf9eeebdb81fe6e8e2f0549f7ca790d78914c4cc74731e092033f57d918e74fbb664d7e47760a6e1adfc6e67706465ddffa05dff9435eaef6b218668819274764123b4f1a1f1c16f01df4c102efa17752d0357de1184d5ac0b72150e56394c09a8007178f014905b420c81b1a457ef7cfa268cfb4b16216a8238b95466cb11e02824feaf841e7594a65eaaef75f6de5043db3a8dbba764e98add0dbeab420a93f874c5de458fe73e3b175df6c97052c10641d7a8ad310f4416ed84e837c6088e9685394d9a41d8b7e35fd49de1544c90c6113bb16d8cf6e7b365762122260a6c7ce36ac0e0c914e558423791d7c22cf505eb6debdc82c15eeab882e6214e018be2174ba8a3e1f0fdd87c9883d5e3c65cc8c649dcd268cb41f3488adaddde719ed5fd9ca571126cdd6ec76e9f1e831cddf9bb932d26586f934382e15038286ca068160636beb3e1af45c45b42976385adbc2c216875b1d4c6e743c21c241ab4c592e9b95565d0dcbef265446fa1aab340017c87a70a9aec75a8456e52affccbe4011c71287d69c6252acaa8ef47131f1403ff927ac985c40d724e5685c3f482acda6216710d83351c8671dc4a2e693398af92ecb0c9888b9a664c9d70054287738467f9ce13902ff41f4b8f1270eadd50f3a6f3e255275795531eaf8caf034925caffe36343540848f6e6f03033cbbf9c517e06cba124401b2c5985ea60eb52ad88ed9af17b251ba2ba3c59b0b2dcdaaed59bc3a34527f2df832a0d0d6b08cc2e801d332e445e921bd8de2b285d0e4e3d87b1d638aadaf75e0a265b5e1b1170d80bd73b8ad3342a7a981d43835835a62e1c73f3ec7293eff4e91607bb9a365876981a3c93d9aff0831380c6858c6c45c54249843ac6693d530f445dad5afd0f1b7316efc5262225b79cc44942a88bd00a1d98122b730cbae148b7abbc1a6a8dc454d53ef6ead421709ef84b5e7ddaa33c047b3902d4c78c09f8b91f4244068c3dcad9da3f3411a75380ff86d46b50c15e37da32d5869b9de60b907154ccbd6e667c4ab8ddcd730b23d96d0c841932742ec4351e58e6f878eb3d66c268ea3bc2745dee1e8e905293c647cfba938cfda9636868be0a645249fa1165965e02d8eba91860f28cedfffdf435eb5b9c5eab18956af4ea5c449435d6d2927b8206d9192bc0bc1a75f98ececea21d8087551e8b709279372cdcea4f5ecd29efbb7261040180448e293a7d2e71fa407a1962e5c970c603ac44fb4636b37582957b2b7eaf93408118a40ecf8175c8c3d4497df790407182a45f4ceaefb4df68294eec6f8308f5ad7808de8af5eda19d1ca224b3dda516412d2eb76d14bceaaff94ecc976b7f0a761d712825373a5a634245d2df02eec2950c2bd5c125022e6af75f9ff4448cc8c84c2e3081f7e4c1c3c4fd8439db822ac30ac24e8747269bc72b6c71e2d6c6a3720cc54a1d95636054a8e437227c09fea15a46b214ff445dd91a1c8f6fcf5878b6ed8e624aea8777549a80106e5e9b9428e64c3d5630878c033a0e14b5bc306102f380c1d7eaded4ad20b92660fcdb1fd8547d7fd7663bc1b298941b1b4bc15a6964feee961612cc398ca14a74c30982811db9cafdaac5bb5e22d3fc055738f42853f6007fbd198d0414621540386075ebef65a953cf072321d8c2cb8fd3b9f114ff88bca9d0717179b2733f83fbd6ef6b6f645605e3e20675e4b7eb519eb9bd0a50e1e73b8b93418a1677e4c42c371e720fad30134ee2ec4130fc7157f40817cca05ba1e6e585bd8aacf73c0b0ca4fb0de263199277e772594901418a7bc92ca3b787cdf103910bf7a25a48693501f0c1d3d81652fc7af935ec8aa70772d64249e1d68c1c5ad5705e67e9af387a7ba1faae7a69474dd10ca50c1691bf1dd7ba3cf0335ae341701db62bdf231219296c30a991dc370994a08c9204c00c043ff685dd26dbf4298a005cb2352fbd453abf8303739e2731c1ea0406cfa434550a3b93c486a8563de78e8f02bb2ed5ddb358efd6ed39a7610ab2cd00a4c5f29323a0a6a7783a5f5d1e43f88bc428841b0b46bceee1f60e52c16f2e833b15c48736a62050db111808952fa12572f9a52c7f5c31f77fa8159fa95e1d0a10f9e2aa831d98c8d8d2d97d1aa768694de823e78db257ac05fba35708acea795adff54fdbbd9caa9329601abecd27a679b75c53fde5386ca188d83c02097b82064337e402f58df7c1ba86466fbf23392b3c055fae44d72e5c21acf8e281e087b1952be9500d93c6d0d415c4b1fbea5f31dad8064ab7cda41b8eb8052285e64fbfa6fa12db84230c47aa582905926135766e87b4722d8d78ac1affd2318b5b52d37faeb2ac6cc36095f8de3be2cb7a8dda78e6642efaa0bd3d8866509d622adec0d6c1b628f7ca3ac62cd898a5cf870557847c6ea326b4cf4081e2bff183b45cf2689d174562538e34325b07524fcc8cce4cec5fdd8d74c9605d62f93e8ebdb4be0944583dc1d6e2aeb74b6ae978643ae71342e9e1072d717881d2c1e488e87d8b31a38e3e77c37c5402851573ba66482f175f1327174469b7850428a026d8545e9e150e8c739309bb6867f5a26d637eab865a3d97ed91520aa9f8ea9eb1e80ab7c4d7f5a095dcc3eed11427b4a02b9bbb9d7a708290793421ebb69d827d3cf69bbc755d9b7d90320cdabe81a19479639af5d8926d99e9ecd999333e110f4622ca0cd1d003394dcf4547cddc0fbc157709590ea56f1a39e642d0232cd667535b2ee233025ec1846f80850747034bc1491e5fd7b09c3133c0b3a04393f788a5f63d67bd70f45cf446b07e91da3797b2e485fda1f60344558a7a24c5858bd753b422fd568ef37992782ed90b811e3250e1f61ff01b7ef8020e55d76544c5277befc6662c5605d3a02944d6e81cbec2133a9ef3b9a686ee4e3ab58e8ddb1a082af6d91a2686c59b041ad900ba1a1ba9e867b078c3086a5fe8938bc34bf2719610e9319b2692a9f3e6ada18b014ef59ffe8503ce28775d59ec62347bc9ef646f35c099350391354d454852dcbadf2da9f74ff890847c6ccc0f304061d18d3e9d5d1bcb7bcff2ff297c48cd3c2a9930b3d55aa49856c2696c98559990909d2d966407e2dae527a39074863b15186fba55d0c33fbb46ac4a1e596bc647552447e9fbf93e70fc89a88373d8a19d3c29ce4d980b8580e5bc199b8d1f166f60e88e766c1cdb658b93a82704be97e12532141a409ce9a1767118b77379c57b00b085dc643f84a849cf4dbb0b00442a8be01b1496ea5b6f21c43d2f85ef6265fc58ac2a29247cc8ffb3b333daeb386f42b816ba68fa3373691ded54143ccc8473d279a00574a3732f7ca0217d431907e7ada6237ef2e556b04ef999b41fb5d4acd9145a54152367fc86ee509fbf088dddf2c486fbbce8293f3e248046739346f891cb428328e5a161a3ce49fce92410044922346c480ae00523cbd86c2ebc962ee95c6dc4d36447ad88668e6fba64c41da002e371bcc83d7c9f3df5685cae0581272b923ca29878e19fe6f16cfa72ae1dd24dd88aa3704ddc26e2164214e4b9fdc6a494ca7986df01c2196bb6062d34e4c6b29988c2b68bdfd96840aa8d6998ce2058294614e0331ccd2e8e86e5205a55a69db78afa706de10a4c1766255f9a71effc0a29f7c49fad73067d6486fbcde0c88d15e54f3153ce8eccc76a1cac24ba2f710aa16e1f93a1a235e628940c05b6a4ebc53073b767de18b5aecf118afef486fa033b451f145d2c03ebdf47fd8a6a1a42d05d4c2e28c6edd9c0733fe8bbf0f7d1fd1710cdcfd34eb82f80f0b42e05b5d40ae7fe7823deaf5af004d8cb50d8ebbe9b465882c2fd0267c82edf7255df91653080e94d0da44f1919241ff187219d33e385ea43cb36da7e652b3b5b9a229c4c74eb7f1a3011e2cc2edb93fdb00bf7fafbb28d3b5e4d626b29cbac94ec19a772eb7e27dcc38d6309b5feff03bcce8907f6b9720b02f08a8456954cf7718c04461c44ead0c36679dd414eb34f03f29d10db68507ed1f5d08b3754b4974feddc85dd22968f283fc83ad2b4a7feae9e1522415c7f0f818df363b01c1dc9405c5bbab8257ede9dbf02e10736c14e88b293481620719a27378c3ae015357ece9e706a8b1dc8fbb5a2dfb373f63e84bc5393d42d21eee4b5be99e6fe6fef77746049ea781930ae07f924b745b83862b6da37133aca7b6745c46fb035129352a45a7566ef3a53d5ad265421521fdcde90d29849ba7ca321206aa343902ad0efda87ec812d39f512be76121dcce4cce858ee66c743d37de0007e8a63f3ab0fab3e87a90a03377a8d1f38ee93c2b7ec561594e62b43da5862d51e14106bb162a5b54c119e03cd16b46d90b1567f4d5f22e9f8505bfe26d5affad99ba842cc72254a57465819b3484cefb02ff4324d7418f6d5d50727da163e032f275183a4b2f4950843a35cf916a4810aad2580b0de2328d41f4ff8f224cc15626a226da66ccb21869166bfb00c144bcd5d2113aaea3a6652644648b4299440a4015babfb199cb8b89eb599a956eade5e79e86cf87e4c05dc753c749407ca82189741db092ab2cbea875cf4a60335f3b61809b630e5754513b4eafe32da1e9e02bf6dd322f64155c1c17819fa76cbd196d192a7a81ec50df7ba0bd91681aa065cd0511cd05be43bd1c790a508fb131f91d6b71545170cba29c6c69665e01d6866c24635cfb50c6d24f83368342ef09936e31309ba3ddc3542b40aa63cf3ac272ea028a9bcf50b89f8c9f4fd8fab27ecc296d5c313b8c925ede2ca17576e428323b4476252e4a13752d09bfa48b6c15e3df8a3beb91f9c5237fd9df890e5af4a30bb9322d09f193a0ecf40eac9c3654f5fe88e7fd702bfa8c2bf5afe1ecf212d1fa20e1bd6236d709e286f55bb244f3521ecedc94e4039523f55f49c428442ae8a72cb8a104ee227c161b6e48d38ff676d8b262f5476040e0b025d0853bbc9a88192b927fb1d0d770f74b06b1b76c46dcc9eaa6cbce637aba6a980d1313ea76183061f793fe3df6a2c7e5badffbef0cc2d4a7272a3d781000874000c6dedb13d8e65574b3a766b6553b72b93e3fe81c85220da7cb4627ae062f90db660cdbae98f22c173fdcfeab0214fb35383f197113e96a0d2342fefa2f75e297a92e8c65b971e2338862af1a34b2d1eda3b44559edf38ad0985c68d032c45a50ab146d73e106905515b086a56a2efdd0a59bf7f20010a8a6c08021080101a806cc40a5a5e343aee2824b13e7ed4fb4de0cf1398b32fc5a5fdb22e7730f36fabf13b2fb370c2f839f5d0fb6fd3682a98d458a311083ebe20f8476b3abe63c6f9782b1e3e21e6cfbf16dad7bc61747f79a13313874ceab8b619f97b9110d2d07eefe65d7dfd3c347980634fe855caf2796d865a3258abb0d109eab7029d8453cdba2d0b99585cd8757816da59704f028b688535d5a7105a49b6c4bcb38912965e064b485f8599c31808f6b13a16ac2546a24668a3f1a9fb26b14e0b1a3dcd0250192fbc1dfb33c48631ce125084c4fdc2770dc8ec6208997a1bbc99f14eb2bc3050c5177d3678f37011484d7cb8f8d81f8f14f1b9b5a559c210e858480f9ae76408ac7431e01e31317858d4676f2550ea4a5e59a4da03cb11f68fd7091a1489a2a391616171a6ca733254f8d731ca91c11819e3135b2010f54948a3853b966d55d8c8c993e8ec1ded1efcbcbdadcb0468ce3cb1dac35561ed369d3f6b655a92960c4cf4520d0b7fd5505248d7cf9825c5ea35d991db943bb42a867255341fa9a9381389353c6004df18f1c629bf2de786a0291830c7f1f6bce65e2654f7cdbb3c4dbbdc4e62f7417e53d9e8fb1b8ff0ec4a9804bc2ea029561324292767c2c92ee5d31a3d1273dae232ceefc3168036e35723f0cbacf7ebd0a879f9f7bc0e24c90def80706379272b9384682a8d58b6cf28bd17fdc0a04d9e14b3330275eb50a5a9f1ace136a98358f985d549853045e5c0bdd61cb9b01bff8226a46b98734d51dac928c3806b1ab4bafa245f658c33be6e0ff4103cbe7806dea0f7071ef60a877757fc64bdcf2ab4bde05e9fd9d2145ff576cf0b3dbb4b0c674588216bf5e381f506895967ce837263f94095a537b5972dfc5fb6de8d99ea8b8be00fb04fd83dcb2bda36e420f9d87e43e0c559b95605a6effac66372464ae2680c45c67ccd68996e21f080416ae45bd621de88893d537b4c70223a47f8419ed20cbb6a19a095f2122b5df8306b2e1e665a5300269f399ac20a10dfa85252a3c8b70a47e6c11391cfed49f06425f6f140524cf2f23450d975b62303b4f2b478848c83e879222654fcc5f7cb0a34499e3ced1800722da54aef809a9d7654ee0837c41423145a54d1d40d22719a9f659156e184f406493ff7e48a0e37f31dd968d990a1edccebda1f6b55e6f9e46646b5cdad66de43718de1eba0fe11d43cf38a6bf428ce5e79eb2332d6e50583c7baa349301190d3e53f4495f07a0966c47d800dba1e53c7da241287cc77f5f6cd38aef7f91e751ed918af8802a768c536d19fdb15654c380171303378b6fed33cdf61c1f526f61b0c3e9e0cac4bb88de5fb55108f35d3ae47d9f8914c3d883b7a80afd4c2875a38d166a98d78169c448330b8a07956ba52845c1145a82f19fbad4ac171d17940d5c449e7526bb9f7190928123cd98d8a78a8eefde90be4ff4597ac102432faa1752b334b05b7d52049aecc0acc9934bb486300a23f5aea60a754ec895f1ecbc1710a32e559b79d2754acb000ee648ae5c782425ce3dc26a22d85575a8b02016853c471e05f189507f4ab700a5177ca1d501bbd54eb93e5c9ee92f79f79fc5377edd7694bca346cc67a4c0baaee03354f57b8d57b065a1b8df0131cb7583b1b6aaf6f8ab37839006f328aa6b2e5f8bc8488e7f90307a4917b9a0f78cc8b2b2e68d41363dd29d0f890a84f3bdea1cdc0f47fd620059c90524dffbfe9d1d9c48fedd4aed0c5e0dfb4c81b91fe9f4d0b611d4793dab526423dfab0d530dee889fedda823ec9a7213a7323503da49125cb9d93b0dd4ce641bd815a9009c9cd769f32de500358b1fb01e023b54e09783820bbb25e2009f9bd9f8fa8bddc64cdc90180edbdad11ba15674c9c8097428fc49b59643b68a11c6c0ba00d2a8a3001a9b1e4352b31c639a57698a18a049302bc95f78024dc9b9e8457723735d60fca2f0b5934360236fcf1b17c044efb507a6c3d69b05659f538eb4a97eb34636f6053f6619ecde2aabefe6409051c7567b17cfafff93111130a7f84270d91a2c758085cf88ea878e70ed4ced7f3641c67eb2545f2c76024735a274d3521642f6582ef7003840e7f012350fd514b72fa66f59bf865084857c215644edb9e0e75143b1afe221b345982588049715eb0042126ad8ddc70428928f47ed79579855383c75ab7df7a11e9216e995b1171fc55031110852e893950457e423f3bc861686908a2af5c65edb2e5c5716d27f0dc175e89099c8f3289042e2a0c7b8dad546a5097bbb0ec5a4487a97106e3b1f2cc81f966cdadf47e9fdec40623634911a9ef493476c39b3b15a29312668574853ad0202c24cead2e186e39477695cbce98dbeff3d1086144404927296824b84b6b28886f9e7924bb64b550c174dac2f806f916e78619d0b9bed92928fc9319361dafed6f682a839ea049626a74dd3accb61b028968d5fd162684a6357d5b221360cd8adde9f6ec52b803aa2c9d2f9f2cdd1223ecfeb212bbae78329f07a586fcd016f75490fc943a755ef7aec1fd5dfacdabfd71e92ffb00e823afd7c7c33e9c32f7fe0253978f7b654063bc766a23b5848a6b91d151cb8c7af5d49d2142ea518e2ae2424ca8a90684d97cc6c13ebad034a043fbecfcfe529b5cf75b6139cc4e1f3fe90575c4b8d06c07f4cc465d02f074b610be717b1123fb24245fe30c411018e4838b2eebc7c65663494790e08424abdd84e9752b0e689dc6539b802bd2daaf9bb9a24a6f322add96b80f24e79d499340823cdf69f67faf66ddc92055941b9991377ba0118ea86257132e7f99325715bffa7242ecddfe8051b05bf16f8b21df98c78f25eeb125537534032ab0b0de1b9e4c94064172e37880f05893e818904435d045369fa78cd80c2ca56779b461348d44615ab44dab10bbf7fcbb8da1f3757901a39dc4dba0de65b4a3362ecb07e81623a2d7b05685e197169311433dbee448ba93e80b0d0580e5ed231a4fa78251fa02830a437df8e76c668e7cf8394c3fa838552e82c97be755536da9372165d7afbb2997931d736d5388a732edb5aa54774adb45aad60829ea0b56d897c9060af9e5763fab6f5f231c115fe5ede8a6fefb9669b8a9d6f92235528afe5be1c19592e317cde339bc2fe9f5b6b40f00495002320fadac0855ffdb593c1d459ffdca721f624ef1d47d3f4e3329269480274d1f7aec1c86c9bb65adf4a36b06e6cad4774e7a5c5636cc6e9b1fe5ebad9cb30f5afc8b31ec16dbda5e3808ec9f5a9ad1de5fe8cd9ba29b295ca25a341833b33e1c8745eb44e9fb910c438545777ec875fc7ccd2f79d62f947c82e3f2daac82bbab2ecfa4ed3f39129e1c4a0f91eab6bc8a7303ecf55eb666c0039a9b733fb1e6d7d6cb0a852a26bc160529223f78dcfb388d6a0ef4929321bb8b561c5cfa2cbdb04a23d500056f847f393040495b7270588f2f7477cc90ed91093910b093ea510c4b96891380d539e1c971de0d352475838f22f5e4d10c089edf27838a0ca092c700f88401b62a8e62a9578cab647d1dfd53b031a7602751983f7a852f444b6a50651753072fdebfb67a86e420034492eeb94531e86652e08063233c84ab3121def3794d54189b08c3d55705f0af6d4e664188fc6115e985240238afea4eb1e26b91a0f451427b401dc1cdc816fc7f769ad463900d85563fd950fbe0a51713873fa97673e702084b00bdcb4028ac0a5974259de8657ab5b5e0df66c28c2307896103b142e4024c6416df4e4cb1ad934a348ab4a94932e75d063b71e8557e3bfea407e774c434afbda9a418a5bf39ee37e82e9780a67f94cad916ba6ae63735873528318180a8e7a9d60b366f2a8a05a2b368fd36685d1546d88218e7ca99b585e0aa228eea2aa8a896c77ec2569c9a6678e441f6fc44c4da7b3c8eb805e711adcd0d0ab0bc64cba3134a046752d2911748f5e07ec796837ab7787fb533308826a397686a53411d731d341127bd62d7a469ade421859f4fac7d3a7dc3f79ae824b8280489aaf45b7f1b73aaf82900f6bdf0340b9443f242c389449efd6ffed88eb38de8547afd55f7fd59e8c064126d094fba943369f5477d963c36fcad0eead625393ad7b2f903e7e0d9e1bf43618bfae9d5ee9743c7aa7480120cd134ab8ded4125373a76a9348748e2b9ee43ffa54548ddd175aceaae045fd32b5e94c68a131c41fbaba16667d2fd7b7feff6aa5596fe79dc5ce615f045060e625b1c285173dc9a73b99f185d4f2d279723b8ca243b95be151197da9b8597377ad361bfb0a0d410919a6dd4a3286a25a8eefa296a93fe629d8eb688bae4794f99136a78d698a8df0933dfcb5d0324b6431d377597cf0d1e24d44be50da7b00153201b21d885449cdcef7e26995d4a94227a69e1eb7e1405d79d18c4e94b2c9ac9e2b23c7a94d58f3e81a6e4b314ceffd6f162e50d1e23b846049a3a0d3bafaea480a85ce017355cba563cdd96c99183affdfae9dfde777b66bf583c41a6d3a7ab41380ebfbd63ea9181f0c65f0cfa68dae9395a7bc11cfbd5f94f1799a501554c5a8a3226712753f9f5825a50620fd1c5f5723bb34c2191bccd6eacdb2c3a0368d6f8d0c5743d25f948b9a80c915dd3edcdff42ed57d2bf4f8aa477aa7327260ba52be9d409abb573f56be311b55d684f637590e52433bd3280664215d502120e5fbc3f5763f1bd5459233776a44ec8e0348510330d8f20a69fd03962fc18422034507b0e4c3d272985b72aa94f561c4841526c15e268b1c6b8d4be47ed3ed765da7b6843605b25b1ff3741a6146f6958698a46c0f61c10c205145ce2cf79480199c94d92feeadce8a9b8c34b8c87c6f807e81d3bd002fa4945d012c1b1c2e5dc9d45f52f64b139bb436339ae7a1c4e314142e0771c28e27bd6867a53cc222848e0d292c2e70d9bd5cb1d3f9624844fbe49fe02da09161a4bff2ab56d8f1c6c3e71f8d73e706a7636b9a0b88826fa8ca7b121c5e7fdca80e3fb7c1bf48dcc872655cc5c6f4176d3559e687b1244836a2d44eb70aeb1b54adbd771984ee7ff0b415b98d5d8957032751bae77226196c48068c4287703c0beb0c20adfb11462c82f9d400bcb9317564292ea9afddc9d177b9f8386dc2d2f9c69b02f3f1fa2e7531c6c60b03447f5b98447d049902ee5b53ce9a9f54830a216ddf576fd2e17b5db6132c64f30880468fca4877015f0a28ff55753b1c535c8170335445a27cf6d07cb3c939d3c0c3d679245dad437ffcfe59853eeed91fb83ee49a4f5649563ded657a3664d269e902951e38e9c417c40fd6720c7afa30007e00710d9f3a982ca771cf6fecd32d7596b86158c363becca480d3b80a8c0b7c24537bb607a2ce0fd4c1883f4da984b8d125fc814fd6561080a5b202ca652c4e2540e8a8d48cba462d61c5039c6865d5233e36de07f4c615b3483be1542df8ff8ff65f86d61a20215b138c2b2b140568b66f216cdbd5a9a0e3592e94faba56e4f168740aecc849ebf695bfb49f234bd649ddd63afdac719649d09dce8a0f647e39906217fae1dec1acc9585f76ef418a4da92509e1aa3cc7a0d9dcf8415f0f12ea3b248132168dd3128eee5692b7d2223d6f45cb809fda742309c1a19595340e46e4b677d561018260edff6ffef213acfe571496f5a3c6e67a350878e0a453a9b90feddc9cb50eb919028100fcf9d7776edabfbaf25accccb4bdfd10955bc9dfe43e1076a980aa40af6cca67b53a85e2c343e2e1992415b73e62ce5f216cb6d4cf77200d6cc4ff87e99236dcd4c7a0ec95c92431e005e6ab49304298176cf475524f34a6eb5df593cf841b844739ec60e7c3ffc2b6f581c473b06251131d82cf1e6e26b88e2df00cb4e5e0eaf2f17700b58c674cac2ab08f7342bda833b219a781c072dbda63369206ae069bd281f1d886807ed18fe386a9fde17b18774025f3c6cc9f97b7906c2a8620581e94b79957cabaab202f045905c60f8a1c78dbb74ea34ed95ae7a1f35f67f30c2caba2134f4bd32cb4bf81e2efb72e9fdb8e57a940be50df13d04f39eeab82a8f43461918f71c8d175b2a7fe098f39ad15b26b4a04aa863ce508e5796843465b81477cc56184a9905bb325b412b359510ba169ccc0e46dc4567734de9dbaa1deda791b90bd5adea2c7c7d4ff42024430778adc3eec32115992595793c6cca2774e42e714418a6d84cc868489db3d3c1d1c934cf9c2bcc43e0b1a7e85452bac1041531e5d9206f514609b98ac3c7d410cdf717128bd39d0ece6f4d377d6eace3f892d6f973659efd1183a3a9ecbdea46a6af922a53f1220d4347c8268a784a00f1933af4f9a0dc251b3dbb3758e77d3914a51ccebfd593b07f4140bb1e08c32ad367c193f5322699b121557c2b732e84a9caf5c77bdffb3c6366238c5d5dfe6f060ca8a3699086e1f6494b74b02f49caaeaa880029005a0552542b667320a05d90f37e3cd4d1d221cf2067b045b7255fa50ba776df1b0fffeaa0a046d09a8f13520ea7e1884c5fcc1d1c82817501649a30a6df415bf403f528d7cf5b127db1805fc2549947a3e8cca9890b0fdf25378d7d136eb44f0e2aa046cd56ffc7026f08d9c630f90b750c7e56b22b971e06911946620e613d4140249e6a2fb2c0dcfdfa0c96ee8955af10f1d19a06130103cb24871a5ea018373992df2b1246e544dcb5202fb9c580fd626f79781fd7e0b4d7492aefdd5508287a0b109fb376ded9dd58ffa47a18b066069d4084024e0b0995cb6b9177ab2467af0ce72ed0f9f1f591536a17f9a93e2e4a25751605b2b76be006d6e1cf48f0e39bca6d361f7f98d52776737a02cc7ca572683c953196585168037ad5458b62e41d8540c2987cecfbd2154afcefb36afee3dbc495bb451a9b0efb15ec2f172eca85463161d9fd4ac57098d2f3830a5f2ebb0daa012a443463fa44f5905b30b26fa9149f8d860fdbd80203c856845338e72a7c1ca48ce784e83bfc3474b20d42416ddf9be1c89c76bdf1f9cc39966795ed882a8f3a274a3426b0ec6a15b3d63a8cbb4aa27ba80548a56b0a3e924d9a54974f7a4fb7d00746d03fb458829569029f39e4946b8c627edf9e41fa4cffe11969212b4a0f35990a19be5c07356ed8afd41080de013502700a238124f0570b0d371f861f6af8d093f562734b68db1b2997f0b3e0c2ce1aec980b2a03523a73f8a065dffb8dd17515f0e8ac4d271a627f6cc649415650b309d89757dd63448d97424b0af68be878b6846efcad7779f10a6ea484ecd9ec3002895f0d96d65a68c81b7699af28b66cbaa528a102dd7bf423a3a4174dce46af6fa5e98aef0105e244dffea6d8f2f1e10bcd69cab32ff7b455479dac07dd402ad69f934c549722c48980aca5582322ae36befe26440926290affef1748b5eaef807e847ed68623a4407e8380efc4c706d0fe0d103803efd7a0ef719774d650e9fdf7dd9b71beb45427d2d6f150aff61d935bddc60b38d9af1530f7a0472ee220336e96da68b29687427f09a94fc47f9d7e078eb92a3df59870e0e02f32f53776a5d29c74bfabf82fd46e713fa7b4c3544668265a4db942102b2f127eaadb57af5981ed04f2c28e7d922f3b3998dc7867199d6e4cb32f4a22b5824f9c9c01067afb3277dbd0da0c7a4f43b1eec362d6ed77ac014cde31f06708ee9bd21b709e874705e345955a125aa86e2f74d5311cba9a78219ce7aae5e392975e5519971baecd602024bcaabf4ef37973d488486e0fe5ebc30c333636c5ca131faacd7bbeb465c49094e485c672608eaf903138b8736a4f4bff230ede9176c349bbeb932f27cd3e0a0d9f0a8d5157912db833b0312d4a1257c4bbd9b31c3cb80ad355cd2a4f62834aa552e5e047fdc23c878309c9c80f626789e998095931e9e6512047a45ab4d730b75a68c22053ed0d9a2a5edd4a9caa012b03f1e992b42dbf8964036401b56ebbe680b35997231548a8632d6f4702fffb3dedb575ff0aff2ecde771a8c529b67a9decf40ee476a90a3a2f3cee61f827344ae02f3547b1e696f1128e58a8c1fd7e077e433c0a35aa7216bee91a9277677c8c2bebb3cf42bed2fc45e0ce406437d209c01c3f1fc27b61acde25cfd7b40f1b2722e1a428d05913f5c4ae9bab05de704d060715a5e8bb298a68a2231d1b08702cd7a52420205dbab9daffb0505584a6a9f449d306475bf68368ab4cee06597c703a89f4ff4dafd8317403e7d781d586a5916eb6f814ddb0375ced7d51ef4650ab2c48108ddca1f01b01800de41a5297426a54bfe2415b0a9896ccc4f3b973b45e0b1a4fa59f430e8e67b17d03368690397a457dd06be64d0279ef4751923332827abf32e7582697d655bcd3944403541d78bd5e5487623004327b3a8d984b6b89e18f2ddbac928e87c55bbea7c797a9cbc681ae257b4e58658935fb1ff87deebc755884b420fc77949c523c59f505740290e17501d871b4331e5a28e8c00d875302a306e819e3c8b915cfac72d5ff52ef5162f5953355792959dd5d4be46e54f9c38cfe9fdcb71fad9b0a02eef0ddb5329134d313a087a4aa49e36ebfdedf2eec6a723d565ba092b87d4528a6f2ccb2cea6b0f3f7fafede9183b24ddfc42467e7cdd094a2b1299c81a6fe8b7f13a5574fa1b2090c559724ad90916e0a079716f0c720ae2a22184db917945a4192a2f9765ad12132c8822fb4173120bdf6d91baf67864c8b3805fb87b92832251b45f0452139a367b7bcd5f2cc071836d2fe2c2f982d71632e4bed7682611f7e91c58ba111ba9e36dbcc296580b8ced40a7670b0759492e765edbe1f33ddc004a413440fb301096e55983fbc58ab1b420e5023303d7aab8e6fab1206044626f38b60493fa0068eba6cb974621d3152416a07637eecef4ca3e1895e2e5f79b66fd353db4babeddba2320f9eeb529148b15b6849c24313b17beff15bbc7cdebfb9dd980edd6a246df52bbb9749065f4d81e7af3daaa209914bbabc5bd40dbdb753680140ee05175230b74cb8b6c30ef4862686d18a332b41255a29eb37e9eea2e5cecc8f29cf0605c55b0b0b9553e231089400c0adf629052c9856ced87b96cf06b7aab580554e5c156dd81d564d661e1a803ca185f8b8ee7364653f827e86c2734ce9e65912b7239be93363980ad87190a4c989584f3df6940a9d1b6f9bdc4f75cfbc21566714b2e4d51e61aafaaa2f9a4494db78d347b6e93ac0e03e9a92796b3bb25b0ee85eec95784b175eed0bc6d5b502f11d3b7cfdd78a7dcd3959804a8953ce623842988c1b7abe04df5bc4d6ee90ba24ef4d85e321770f1abb8f39729d881b875bbf2731e899349b7796878c7d727855261121e33293a5e5fdbcc57134b8efb2fe0eb31ec34702913eeaa377cc1fb135a9495a0a1667a88de6086fee22fe573fb4a1e11d66be6168709333cc516326512e2a515b6ca9b0ef7d31096eb490096b32e57ddbd73fa334eb539b8f1a5f45fffe2d7c85c124588b8e645058364df45013c6cad1e729434f90f1b37507ce459f33ef77fe4644279f2cb398945c286fb4fa2bc1b5e44d5cd69faa98f6f9b9f7ed7e8f6982922b1b332a2e26d6ea9c14b8a4c403e449ca832dea4406f21399e5d1d4c45feae6ed318a7f40667b3d96822e7a6efdeb88c04e80347e73aa3cc3c361b455f1b5b334c32a3d32528ef6ca28b5ac68338627065c0aca53af1ee66880252b822d59f8d099c122906e390d7821caf20d0375082e83d548bad0f6b4e424c576941bb50234ac06bd2afc2f4fb9354ca501e273002582293af82559821a65257604ac10a2d2cce3e39e9028a29cb2452cfcc1baf2868c3d32ca3919232caedfd4a3c13309751a6b4189cfabf442cc938064b6beb754dc11198ed29e5c5ad6625e0e0b8c37b37a2781dd45c936698d51f36029f93fc3fb88d8792f998c0cac930043db8d262e6347a15d94dd128fc2b2e50c79e7fd039f8cec35dcf3397ee44c9e21dff66b4daeedfb4e6b4a79b723b2e2c2cd721587b99a7d41274691be7c8b9f8144eeccb453954ca11f7cd70628e52f9cc7eb2ac6cbf51a338b4f3c868091df803c81ff81a9447c9ab0f7d4317ea1f9138dcf0852efe907cbd28516dfb6546f25324053c83b0d0ab9b1b4ee181c4a7882775fc708c8171f3854c4ff0c76e72b0b818bd232f3aeb8825946d793552b3a79029b471cbdbfdc7fbd764cbc59cccaf67ee5cbde869e6f44701bd62c4c604019b9c4a28426137eb55c857ef92304d3d24134ada35ebdda7512067f6bd16d7c1d1ea6e0ed8e27cc395c5131c06bbe8d5a94169eb7e80b7779beaeb1d552e545954107e2decf315840c30e97fe3ad177f487c8a04a355e5c1f9efd0e5974572c222a437b23e62339d2a38b58c7fd0c0892ca2c5bb198e798fce395ffb5911cfaffe8a55f23f7fc906596089081850c362e64bb6f69ce3296801bd32db9cd1edc6f0bdc03796f28e9e6ae92afc4cd390f0b2c94c34e3f76b28c97c1cbab9b16bb1c4d680a840ad05c3f40a2957ad8fa1d49c1940074ea55eeda292cadaf05edfd22317c9d48ea26b708ef6db48c9d8ed968ac138e9ef7373056b7f98505f27de10c360a084c63c82ac0f3bbc7a047f8ddd16dd063953158369f8ed48dc878cd1069fc2f7d001fc17f956db2000718769d7eac07328a2e24793fbb8dbda5f8b515928885ca65e72c544f54d07b3a6489f22202332396e37a02e15796e6e6aa7c9e9df6b8cc2a34194b6cd734e59cb608498e9b41bf5d23d63b9d6d15a412ccaccee1cc74d9a0e7e164757dfca4a642b75f44a1d88758db6a1b28afbdbbe28bc3a89f21c08e2a0c941b5cce308421f0bc6a62455120c4c0af0238ac5998c02fea7f42bfa239d01e39007f2d53e1ae7e48789f883098c5a0f5db3b39a51e109312f35780f526f532ecd428412127d2f7f5c7a9ca0df0635e557da30e9d86f1678781bb95d089c847393fe51bf3fbdb4121786cf46ed1d2f976a446ae230842aed51786812e6a4e43d90057abe8843f8c30f811065c6e49ef26e840c463b560b3b892204fa2cad1f9fd3c6c7a25dd4db956c2f5bed0d5a2b3d08225174a108af9415e70c61862f3b51596439a98087a66e4352cd7d70b4a8b9f98985de6fabf8cdeef8ec5a2e790ba3007bc716b72bd21b8962ca9d445abf4ab1272f3194aa397e0e57e790e44cd6b16cdeb987b948532924727fd1eb25a3cec752a175c599c1e60af1aba977c25118bcf67d242b682a646d03e50fd2ebe5ea61a627603432833cafe52d6f07e1a6f45e48216bd057c25d57661af31e3dc27a018f156a273b45aca344c665ca3660b46a281a37f29dd34cf09ade186e3bcee512393adec99e1a6eb27fd4eef5a561b3a6bb2b7d6b96fd48c35aae4301f65a03548fc33d92a5ff035c618028852604a91fd31c3bf5953942cdf511c05649c84b7aca3aac5e1bf74768f926834b415eff60d5c12307b81e4ad49c22b4a9c6f0c6164504121074a1dd20a202fb877762c313f1484bb39ef5c134e705477198a5d2a42548836c9f6585fe629b287a4125b668c91d3571aa689ac66c40c20b5a5518192a0b1a458baab89c5ae738f9592b22770b647042549b23080aec0ff3f08ccb2cd85eabb18c305f06ed0fd29bdb0c7933bbe0947e709e056076126f9980ca51d6e172102d66b8fad996cbac4b70bcae218abbcbe9336e48c5c0154a6e0dcf3452e28c5018ad24ba6110614b851d24ff609673b176a62647e168be9db8c688672c2e3494e4e0553cf7d9c4ede27181a5e670264855a459b20d0f62e4be811ca87cb8681e58a21f892174f1e3b8d3fc51377cac1a6995ee6c86f5286bdf28e8266181261b13680c82a24b6c7b5047d9306ef4606dda5a1b2b8d016b585aaff23985c5d18cd9a9e03bef061c4906b0a044ac990f090bd037e86559307bf0d3b5be515b6f0b8aa4f4e582a9de1fe040f35d542c8afc5823b1ef4ecc612fa3c25e1226064fd4e2b9f88475dc3fa7058ac737ca85dc17808b649a2aefcc60c0b00bb7fe6f0794fd285f8afd029d8f0e23ea5fb9b34afc4bf5957d2b36c0b5d6ddfe2f17188e9c2bdb3d183c38002e1d18e3bd4723fa6c70be85bd26e3eb7131da6b1ec2ff3954b019f1dde9cca69d50d1d9b7469f210b1f0f9740756f426a194cdb0f7a3339470e539eda0443c490f6071615dde096f6b3ff573e3ca7861408b5dea735a75d13ca8bd5852249668960cfaff101c575071615a1f27942c93e261f0eec5ad3fa7c4e925999292be2222b1da928afda55cf34aeee8b641f8a1144a5ccc5da6c8aa23c7c937530965fdff1da838d11f7d484384b544ad53ec54ba544be0eeb27bd5987dbbde0137e10b907f7aa987f331f736638770cb509055f5bc60dc618e66bc15771d88efff8c9c6037c26e4216aeff0d2b341f48c6ec00c820ff0c8e69b83b81d59648f2f043f0b48a70e70535a1446e3c7c9f5caaccd3f98fe95ea65ec8ece3d9e7b8e836fbb1e7a44bc8d3133a1550287515f97bcaec4538056066d8a1533e00db804357404bd926fe7f193c7b41b8fd0a944c1683383aec9dd0476cc62a2c7010965da2cc016a8c44df0ab4741a3c1a52f8dd45b30795a531f02be86b851e9cfff65ee5495fde3aeae4d82a24a375eacd7a71cbac5299b552179cf89cc48d325a5418a7f8964014ffe2aaa2234f12c3e10614fc5fa4b9da994c05ca75c78ef29b3147a32fa4da90b7225702c793ccd4d68daf326b85e60bc28557109b400718933bdd62081418db176c5bd759040b7096682f592bb94b889b70d15a051a80c41800329bfb8b41c59d3c4f02494b60cf77584f2899871d6dccdfcd60fe0839d6a5d604b41358b6ec2f6a71501937d3eb250e70e8c19483a64abfc2a2624dbb63e2c81586417cd0487452c2ff059238a6eaa451ec44cdc2180c7a03f07ec146c19dbccc5e1e68f2ff5402f54630a3c5be17a2c75bc2039b301b3defc3efc291abfe98d6db6cb1227583a0f7abaa903543d4c9de3fb040b6f064a71f81cdbca5e389b4da240c135065138887007fea831b91ee6299cebfc03645181c726c72153a6bbc9ba9a6f8c7c5850475b6aa0a9f1eea1288a64977ae17646cf8c109851116d98e3f4f7e9ed2f3f5d8ef319eb333ccef576c09dcbd0f89c648166f17bca0aca799feae2a9689da6f5a956637d5036b8522a9b9923a7ad360539b00aa79ce1f1d237325b348bbede44258bb2f8b1b7119c174133c9620645e89c8fdc8e5d5a6a88fb4f5c3a8b5f050929071ba99de3634b97fc535732b655badd7f5f0ba5ed1adee9665145256f20d3a92f31a87f9bfe96c0a09307c438f7f52c7a10445022bf1068082ba37f6636beca13e57731851b118a9fd662c5e0a5a41633a68464a95ba241b97cef5d6aabeacba3d5e4e18d1fda18ef1b1bc23dc4226a3b86d32c84ca56a883012b6ac8196180bbccd3a347a55b9fc6bded44686ef8ac416bbd03b1b9b154f70212e5977f60d804f527497928abd372d220beccddb0108a7ae7ff7813eee21e4fef72c15171e6d73d13b4541d7a6838ab9394c5ac8412c35e7db7e81663b7a3384153ddb2ec4a67558180faf5691a02cbc15c03968f85fc4fff191537c6d5f77e8ce36e013d75322685e845fba008dfb2dd8771175bf0f9964106c9b7c04288a820c134a68a7796924e6aba6e6751864cc2a1943cc1f0925b79bcfd2c2cf76760e0072cfb2107e7d3ea41c349de9381c3c263665674674188c4d5bb7d4efdb8892d986564ce342edd93f18c28837e893a1f80c5bd0ee0a9e42d2005bf018b3448eadcc5364d94c6b7ae4e1f609029b5e191e9003186103f2df0603f6ba4da24702fef16080d24cd1a59ac5fda327b93f5c7e8cead87770e562da363adcba4feb630c51a839ff8d2539481e7f4f076afa835c69fc90d01886ecf70c70a46b4f1301c75feb4f6e5e2f126acf82c9f12e806af04e25290962db5c43899a77d0b8d6a7193bd3021297c47c067bf744bf6a1bd9e807e86f5b871499149ce57a72683cb710067fcdd75889d46bad7ec5463ccd75e45ae85fe6d4217da3289d0d9331ce1c9926f7f7ba335609c11d5b559105e79d9cf461b3cd2583440e37ae934561a8c2a7ee40bd630a064120a6c4648a11edea0d0054a8521363f51979bed301492bf4f458e81729bbd53102c3cafb6cb13837c8ccc0006c1c297f1cdcf38a535cc84f767cd99870db4535eda39df6c9c92352aa70c3da0355c6db5215250884cf1bc144058e699eeeb95eaeae2775cfefe23fe35e2716774e5af0011b31ed56b2aaff1e6ccdce673f124445bc8dfb04439e157097e1f3f97bc26aff6bb015418cd9476ace0c832d4a18e3dc35e293cdef1bfde508be814db448836a0950b23b77bd9413e0c5114813436668a133cad7086f93593612a81ab62adbe7d4f07ff78b4cd7f88f71edb685e25d33c800012f68fae51bad93a5cb412949a6283b969dad2647ec8c729a6ffae5b14034a28936b09c6e8c8180455c465adb4535a3e1165e9a3429cfa7b406dd86016801b5a0b1027562d242cde2fc14bfb440d20d99d573fed25c00b86fdf767d5d7753b4e05b4a05acec2be60f97c998b3a6aea27e6be940eae22da331a82243c1538f7d264d6dd1962b0c499c9bf9d2c4a2aec9b4dd7cccee9dc91c9044e0ffbc5c12bf699ed2d28f80b0cfef6d82bcb0fe543b61ac72bad344dbc023a86243219114f25d72cad332ac3500c32e33a64655b78d5173a4afb8bbe06b01f420f3fee36ed0095457d9de9de0d671650c04966232ec44a734782262c0a196d90c56e9b61961a0c37de2f7300773ebc701706c069efddb84b3ae8937e0a78ca3360b35646415fe38fa64308c0b8ae17e9bb5c03b12d72527efd2f2ca3602793c3901115aa38ee7947df0d3bfe474f893ee830322134be25b7d85c763c504f75849d13689e34781256836f60a2f5eb63da12f558b65dac6539610549743460c354b90ac2f2efec8b4c6ef0a07caa9e1240b402d46cbcfcc5e5394aee696de938c33fdb4b84370460abf921eacb3ee7f2d05cce6f360a19ff80b6681b4c583c7b8d13c99c8c191214607323f6ec9af489bcbcc196d5be57c4ca58071c54e4e6f6ad906cd3deec8e789e0e1af588c3170c5bde50c21565c538c093c0d98c6f5084790fe65f82539cb8ec898a819e14f986c0ad5dc6c7ec1087dcc6e939d4b9cff8407f656f59e7fc72e159f29ef09209b9de142fbd359c7f6882bb6b105fc24909defd74ea2102881b237ad6ea29d885cdba8a20a769869ac985aa7598b4bd1e98b62ba1f18115c091b9ddefac8259d295f9faf5350f7d3f5276f80e43ef803d2b35c167f10fe37e4e4ae254e3bb23985a96fb74953353849100b8eb7f230eadbc98dc9f8132de4da07c7d5eb835edc06b3c2c315246e79f486bcc02a5b06af8332755c244fb8f005f64743c4d56f43f291808c6620592d5929b83f92650f103646d76428a5214f5f9c635be70e881951ce3dce230ebfb755038a920cf13615cb5e53e165f82a0d28bf366b42d7012986de1793feef26eb1fdb60702a32766aae9696cba13e025caa3e740e11c4572c3f7b0a90c3c82894e31c0430ed26faf752320b993c40e92c567acb44e62318031bd1f242d96614680af9f88e3a7c64512afa9b4d2df1c17c519892a80f3d321d2d1f8882f5f53841583af3e07d4a970e2b2b42d2c6d353c0721d7dcbebf98e865319bdf173de289aff3054a68fc4be5865e8cba9568a7e009dd3d80071086476ed8bfd1badfe4c24382c32bfebb1a301aeddb70954de1d4c9dbd1bdab8228250fc30840d600809af90686cae00ee76e7d6647321c970aa877eb85d14b26224d945e355188460704c85e2c992272ddc1098d3f12132419dc0a6f9fc17917233a2eafb073a730f1dcd4242bed3564af01d88ca17aa08f49fcc0ce4cfc86ba337c90e731307710b0325abddc7bb1cc7e670d83bb15e0f7baff02a36a5b40b69b2f8cd9c7b32b5647f15b5dc683aa29b14b83d12d1568ba39d2497ff19b15ac464ca977dce2945b9eb416f41749ef1dea511d003f479a3f88d080ea09f29d4291ab387e9018e8d7ab953719853edc8c2b4daed6083d769f6f07c7d46e82c7f53bfacc8b1cc0137b6fe9939f2f7e84a4775ab7ac39258e0a0daf9170d74e6c3f3c9c90e56a4d8033ce2c4f7335f88993ca0a24c8d42feecb35c7b5b1b4687761d7171a3deda275c00b32f9e6fb3eba5acd553afb313a9da58e4de220034321b3cc1f518352c305c11c2ebf1f96f986c462eb5e027952d6a832de4f357653bfe535f032a59d0bbfcea2969909c99ad35525624d3fcc28e152a8ce391bf2c6c6818ea36adf43b35b165e5683c5bf50013429ae5a2e7c5456e5f10c4413332b008a2cd8e677f813681d754cd5e3ec13dbb03aa3088b61041e41764ba3e7600b1f8b5ce9ed9166686de05f5c7928fdf849bd0a9b72aa0f46302249a5ab939416db0af414e47f523f6f7613b63547ef132ba67c456685cf6a98c90dca0cdc9e68dc328c4aa8ec3e2ba7104290e06b2a92ef53e30cb24afc5f22ebac8273fd0f192bc13f6b50a980e7abe55e5f935ca43d4863944189866714e9c1a82c8bd586360383df92d672efb7cf402df9d72d10fdadcebbbbe4ea0f6ec8b72743adcb5fb14c31369f3210dfc8d6b4c5e19e63e56b37a5a8b5750a0f7f16c2818ff0cbbbf9e92581bf655b0f3df8276a4a7903596f1ae8826307fb7978f9aec6bb298bab4f8ede3cac45349f70544c7aee8ee49f928b7a7f597776aaf68b254247e410b429e7d936bd35ec65089ccc2aa86c56ad2273ebbfcecbd752d913dd65f62a5b947d7bf63db3bcf608053569fe392dcecdcaaa10031e09ed45e5769d6f8c3b92e128e570238d8a3c641621c0b331156bc7e85ee4dfe4ca05da896c5e557375130d814f647c421dd6b794963c0e49309cd13ab6ea0abf7d2baaeec32f733bd39988a6a5298dc31c31bfa0e78af17a87cda158dd2b78e7bb9ff12b91c2c9d67c555098c1b71c79651116bc2d1312704d885402f94b78453a1d97e82f1ad413b940be527c51bcb81d108bf94c3a9ee5c04b19a38e933a4f6fbad24a4e0690ff184ef095f18e0c3ecf87fa34097b37493fb8794bb07036406159be797350dd8373fdcca70f39be4d8bec3aaa1b9b58be42f80e0fb8a82fbf1ee8193bdb15e21e243b0de385fb22048a916a15d04554eb214b81f54bc04ac6e290899718687d6af490756bd3bb55cc6d0e530068d54fdde6243a6170026c33daa82bc736a7c77259ef557656da3a865c5de70b0c65639801719ff63c18547f64c93ce4c58243186f52dfff9556088e8f3299f048f0ed69bee21fda64aca7d92b344c1a7f921a4e90a31747bc110165bdfdc0d9eb0266470cd3614b5d003d9f45a1409327629548bf7dbc556696857112a445709731d17797932d337dd9cad8ec42525dee7b35001c80184d3d03949a99816571a809877627bc3dbc341d86d0ac9c659ac676b5428ed5850ecdaebe140fa8cc4760bf15d886aad4676ee336acd467289a26909c14826a4c0cd07886e8bba864c10b8e551038bd22d62547377320790a55bcddfc15eec7756d1faf95edeff7d651c152e9eda95c7a4bf3a511e8c97556f26556977ac193cb3a072591b94a06757905c2a6ae0d9cc817312b01e27c275eb309a99cf45dc748678ad52b872b05a465e82d98a913cec8506781ad3c74235219500a9a3b8bc5f4ee3a1e4070d0a833186dcba224116011573d956451f63eaccf12e3c6a4651c21fba6dfecd830aeb25ef97649ea884b0f8a8ccbcca14473e6717c659967544b1aa2108c16ef9c7f0d90517bfdd36432c8fcaccb806393ce1eeb5e5bb558911da71be13cfb83df90b949f6a64d57656816f9047407759dba413d0ca941e20aeb3e131f59a81b835a32cd8233f4c66e5fc4fc8a79ad8ce8d378ad52e342e91297ad599b80b29901d996aad6efef50c9854871a2d160193f4849efaffc8e8750395f7b12ddc613a6697b74e8d72f53d8101da5cd4a54f36d4d924c05704a9da68745745772018e9ed8bd476b930d0f9f92c7dc3abfce9e802a47b9ddafef0684611bc7e1557ad82b34ea3f627f4b8941c4b457616add2d40368f1be7bf28d03a18b583b6f07fef42891776b11712b99d6c89429152e57fb96f17ed56ac10ef48c6fca8922eb191db4c23f44e1ca63906a4d2786a5b4957007ba4c75ce00dd72d1f798e654bb936ea0ec54d2b5acdc95d8a3f8c55f516ecb1496faa99158f025ccd5a3f65e976b5799f3dd22d84a1b46829b0882d154ed55931b8e48a82715503c1a9f97b4f3482ac9959372ae55b1e09739b7c9336ef5fbfcb68bf31c90fb4fce181fa2ede8cd3e83357923a702086dc2a1352eb88d3935b1269f21f045cb3c9f9c6fc6e746ea9989869eb9fdd5067bf72af4ba291ca235c28b645c1dfd22a709bc4499f047d9c46b54ce020aa3a9ecb0b54ad95dba6e2dabcc653b63fe19c77fa368f9e9207588b33b85f9d3285697fd218c3e89295f685ccb6120d600de157504424b108c5c1f799d57194040f08fe83ce748b3d9d0b646b8b1fb9a353ab9548b2cd34bca40309ae93be2a051d3dff8ee4e6673fba5646eb5f63e6b32556d3e9d8036bb55c5996de9c0852e93dfe79181c91717f44291b99387ed41569b23e8e09789fe3e4b36df18a5e9518a42d9c5a77d0973299abeceba15f281e70cd5061c162345ed134b68340c37a60d719115d2d0197eb90fe09170f1b4fdb36e53581b1ddeca62c47aed61f90c547ac152854fe2c76f746d48e5be18148038c8952026d1dd6469f135bc54ff323624696106f3235480ee68088d82ba41df978c5f47bf2f497b72d77de5a8c531c6c7a023b6d5f3392f1c962ef5de45d17ae5521f062105b55dbdae4a4679a2c29fc0825f8696f79ea9d8ef454ff10c83200696bc7a3bc235b29e0c97db473518469109d3cbcd0dd188775dce184168d911fceb6fb436f44da25673fe8f8a510760ba8af0750200cd34f33190c8e9a7f46b83814a826d5dd4cfdb21b1e3404598734ad958bc5604de993055cda5f2d36dd10d8c7457347bc8ca022c6dba73cf3233dcb99ea21e992c80d7f9316a09ac8e3dc02835b3928ea3716ec3f71ece138114b1a8d549d77e20d5777afcddb5c7a8c0c5d903a02d5707fd1afd9d8b962c4f9e1cd22d852843eb6fb7aef12b30dbeef7e30d192e1b8f7c7dcb0a4ff10e6b90b5afa700ef6e4e1fc9b7cff254711c9dd04597bb31507bed87f516311f38df4ba87cf2c57ca3c619a0edf3d7f1e04efc5750fdf04fe9cec670832bb16e249ac8788f41d67a917069fbaba659759581fa2b0a10f78b926b857befb2eb2570ebb9a2295a4c002648733d0fb9aa89f35541c74bbc36944160fdf15f38f4e1f4dae35150f1f97c71d313d087a31693af164272bf145f4fc54a9d80fdb9a98a4f3325655deba242f25d70ff47702714de1979eddfd83bc2ecc0d42a052c480f704127fd0651a85793ef16bf5b6feae9951c32bf36ee52bec8dc22001",0],["0x0a8a6c08021080101a806cc3319b5df1c8ca5bd9148831a54a296ee8692e8e2bcfb697aa49d031f4e1e74b3f4893e30eda0d44ce2fe9d902cab4e837782e18d4c7807c52fedfe4bc02605c6b0dff0af05efadd364c794527fd8ce044a42650a13242b3f80e96ac2861167c7264ca220185834ef71bbba7bf2850aa2ed72b2345672d7f29a39634b1f3e4eb9f055b7992d84e0feb2afed0b9dbdbae3bcf433bc4ee39df235600bbfab6d6803a67f434b7dda4947c4e174144e03e74714ecb64745c03d21a0a5aebdfa0fe2e2a07ffadf5344d1eb15e7001e57463e4dcd38ac2d6c3427301602980a17e1717f48f6b915033011afad2b8e1abab98d3245eb218b3eb6d3afa072a767c8f51795ca2506496cf9c058d121e88ad720e57d8af7449b4a66ad3e89f2f05f592fd9c1dcbfa85b336e51324f5ecddd0c78b486528616485db1f1f3849dc768b1cf7c219c7d6123ff5c48c3e0a96d94f34ca32e11a2d05be1542b3ac9d2cf59718108676e97ed353846bcc81ab7af14289ce7f11029113919468f000455440743cd16504aeb0d87c4a8dae61a179230ff30145bf414dac12e81604796158b2fc0bab52583a5ad52c47270977f156b37f175b6b91de7441b594dc174c41c6d47403f4f94baea74a9f7782aa92eecdbe3231cf3a98b995466d0fc327e53356dd13b7cd4ac2f7811c468951b82bf2c1b50e6c6a6d050a1c374235b9d5584d2530c06203196b0b8c2954755b02466b1c8fe71f2fb9af57f3b514c9ef2c5d96031eaad2d1314da681fba9f7eb3e545f0d6e28efa084219277783941305fecaa6d9b7d3f3d93c6e02d53d955ec1f07b7af95b139734515c88eff9529b9dd9a9c82694cdd0885b4007ee0992cf8fd100d148721cdc9af10fc6347dac93c5cb1de5b7abf20ae513eec43e03d8ed218a38e088914b58bb69267bb5b7e494623a84f0da7ff2810b3efbe8367d5235e0471ac32287b6803709fc686a1ca118a79b9e6b65586c328e33fb0d52de785c8a6f1dc56f11a90b01cb678078fdb7c0890179ac44670ab80a3a6cc6ce0415c2647099d6034fa22effb5e73fa66ba0982b849de898ba4f5cd5c19f508457f8b28b382a60dfbab22746896d71072a9e70462d29930290c38900175323c285232527b84e6793fa98ad2dcea9daf9021f09ffb6f824a16d9e96333a257a3aa666d98aa2cb589e9b18acd62839f736fb123f82a5d6b388f6044e8781166013cd47b2ba4fe8a301bf3e3a831f6f0a07c88f6c309ad90e5012c0bac243455954db06f9f698093281b04d930477ff3d50001c0bf677beee1be64a807379b3f91f5977a6a7de504c9cfea5dbc8d5188b98ec7bf50f38d8e2fc1ba6de9ab7ddbd18b419df3e1834505e564838cd761947366a20120b2bc993cc6ef457b3b1d78b2fcdcb29b1f8569fb714fa18e1f59761838b94a6a6829db2336990aaf241bd2aaec0c1081eb36161f4d644ea64b6f6d7905fc9b4783348183696e178dabc74fad0166669675645b41dc2a9927415d29b81c19eea3cf021c183e398750f76aab4bc07c97ece5130ecd53100308bf35e7688b5563153a8002feefe82a63eb540b23903c4817fad40826116f5277dde3c855e10fde07a9a54d45c9f854f94b9234efa1b020167d52542fed897960078d55942273134be864c5c97bc1035e1abd4d138bb3e12664fb0ec014185e2f4f8c4b6c2e1ab33cd935340340db53bb03562f8c9b10c8640fc0e3e8ea08f7954d529ba61907c20ecb3befdbccd522c1cdd75b15f2c9fa560f44f90a57566ae86a9c5513366d59e7ffe0aa1de399b4148c12734b2317038a25b6e8a72f21f782fec51f24d16894f308d5367e595131bb5f73cf501b3345bad54a42e06e078a1693c063e48139d3939d1839e7560c3f55e5d8ac78760df9f0bb1bfecf8c51e611a6ba833815e38760225161a6309c5359e8f1b7ed9d707007b17d1a870ba7ac25e0cbc12923883214829fac999bd56077bc48e20e20cf23b759ddc125e58a67cac34b3c01ab2ce905195d166e5429f69eb4402d809d05cf596ecb9d0d4f20bcb133bba0fbb704311cdb68317eebbdcde8cd80ec6ba20774e1b6d0e8d2b0ed6c9964d9f1e65dac2bd74a89f4a4dccc9e91920549f1b87fcfd33c24c4e2d8ff7ae59287160372b14f2e8bcc8ae410cf3be2c18149df686333217025f62b53a2df0dc6c573e1c07c5030726cbe7c78405afcf91567efffc066d4f2d76b81e8e824e69bb58192f402c1ba0bdfc632f5907daef4e7340627e26cf371918596897e1ec51f4568dfe9ed6406cbcd812847b4edcb8a1ff69015735bf4bcac011f8e5a62c85ac6be97b5b91a1314f1d37eab0e8e61dc24a155b41306272eebc4da8df6e2856a74edb692984b94af223e57dbd8eb7f23ada0498d9aed26ed0770c7be86a7320d7a534477b3b5c7e64e2229e79fbfb4072f68706fc47ca0ff4e138a7982349d0bba1232f98f39f28469470c4e0e95883178e595dcd06414006e200714baab0e5925af9d1c3313514d375280a4b0fc402220dda8621e4ff4e173142b113e40547a3598edd7ed60b72bdd22d62fdbcf5e4113016687c9d1af01e2fbb6aa0daf2cfd13abf7d36075caa2056c83d39e7c34d2f89a433a326ab01ff27953f865919be6866361991335b9f68e597d2b5bf1b732a38afcb33cc6933b32433f9cc72c7d0a9319fe55a531e744213037b3453e0444a50c36b89b699abd3d5951568d2432671310ac2960f06aca48497880546a6e3f0b4f3dd3a78cbc5c6465eb5b12a791de1b8a27e4c49f2c1c923e0eeaab94de3210ac4dfb67697a365740da550aab8704fe638a9a00c1f0427c80309c3d80956616fd36d8df1b5f98987d23cb79296247795a46b6c259adcf8fe6013f76dfa48137282e45cd102de060597c6ba5cdd64ed78c4eb5935197193ab2831504b64642ffabf1718950ab124282a4cc06bc9a2e84d52c5eb6895d5987d0b4ade4c31797591411eeb2c4e30b74ddd851ba2ef8345893efd5a146e40ecd7619e4292349a8814d0438b662fde8c3130c121928620ac5c5babc74014bda986aac4474fc5c983af422596fd88763ee485992a33708eb48ca57253ce1620447a88497d7d570eff72d1d4cb46005202cf5f6c0d477ff9ad8f8eb8e1537ce1f5a6e8d080b3b28183f8cc82f5c7a9069d578a99095da6e79080a81ed27526ee8c3614273d9050c28ebe27f31623003dfef51776e3078a2d2f7f353585a367c50cc931114ff87797c65d35c943ddb9f04643b5b079ec0767c06eb43846f4cab0095291b847fe18c4615d21d7267d0b2a8ddba6bab7515fc6aeadac8e930abc6820f5e1fa3182f725182c5b59bed3c47eac7e27db39790fee88fece2327dea6dc1887e415706b4f1ce5420bc062c0314dfc66ce3a3234a90dca4c71bfc06189edba318e23b189d4499518e7d9f8aface33cb6a9e0c45505bc3da9700740bbac0158a55caf35b93310aefbe2ca2b1d0416a4d55592ed068e65d364cf80674d6c6ffb79d6247c4914b0ae34400ec3def61b3f7d5416600fc985b6f318a1f183f5a5f14c09ccc6791661fcf477a75fc0ad9c80aef45dea6f5068f09d23ea72db5934cfca4c7ce5a230aabba563805bba4d4c27d4ea117d51d4df8d28804b1a837306ac84a460f4b8c2bb5648751f474db64b1326dc5e1c0631aed12a48249f3092cc1f88595088fa9218165eabf6e7b31c0eaac37cc005d7eef284c9957d17b14a4e41719eee641147308b2dc032b0c0ced5d67a9326d5d039ecf3a62dbda07b4ab0d6cc201e17debf69b642bf06729b25138c2745bb200854ced5758d883fe127e918bd2af2da5e899bbf83bb3a42b350befc9b1b1b25daa05c7382046e23e4a658b7fac99b0729614c60396e3ce848ce06eb4f77f0a7e6cb4124a451eaf2848b5e7f2616c3504d1c5c714802375340c910b902dbd7757f80a5825ccf8466fb15c8d85897d4d048aba1cc48ecce90ce9ac9c87ce7daed5bed8f6c79975f347a638c83a67784be7cd0fd64b95574f1189d608ab3f5728e0ea3eb70c29293f51d4b1d4498827b7fb6f968780b03a590335435dd11cac8fad110ad11dabb4afa40bd9632b279a233d3363ce05f09abf86b64f99e8eaded1e4c131dee8c05689749874766768891cc86aa3f8bb9ed5fceb4bc3701c7cc439a8a3ca92204f4f7534b87ba1197da6c7f009e2a1bd0af09c12cf91024fb2c798ce2e4a2b4fa6c60735245155f5496eec6ee836f94a5102e5a74e1c059287c7ae34a0b3a917224ce7b2e596c43475f6f7ae2302239c3bfad1802fec29300df28132e38222ea0609ab3526515fadfafeb8019e6fcd798143a37cdf1bdb434c4b8e5cee91e01d2080d5d12f8ac6ad2a3a421732fde139cbbab219cac320d63d02a011af806e68362fea72bff4fb11be197b022862a4e48bcf6e8d7a745afae69b96b8643fdb3b3db821697f77ea350c08043631a4c65a81b5352669216e5a44fd3a0d0ee1e427d41a99b7d1e0cc5c5919f92c7a9d6966f6f158a40076b8290b22c783b0b245b961d2dfe7d176522680b35092d7d2c8779e452c00f6bffe788033087a1730b7a47910dcdd60fcc57ce750cf925cc5d9c7056786b1361b35aa60ec081b4730fa9746babdfbb2640cc4bc98a157a4ae8d6b20d74bf68f17d08b6deaea4d715dc1a74a2cc4ca8031ca6922f1e434e09c52bfb97e9a66e53103180fe4bbf51a4126e180c3ac0a82c16c5cf02356f39db877035edd05d4afe759ab267c2e8869aae4c11530bfcbfc6b0974a14232e73d920a0c11bf3bd452835193d1b4084566e03bbd13da2c01db06d79b7407b10b2a91435671bd59f4a59b9baa4b7213310ab6343020c91dd0cb9f70b0919bf35a4a2caedf95248e73f2dc1ac6765d825f2d53a827c0165316ab4ab1d124ef785118b5527ddfb12b806669dc34d78547868674c4f6d8f744ceae5ec28c19be281acc842b8d26b2fadfaec839e8d9d92b034d0193e4ccf373868c5d16a7bebdaebe8c31929c8ad936d74ec5a0425bdfa507cdccf57514515ed5503fc4b707cfbc0336a5f70745640f70a39c1e98a29959a873bc90afcf6e172a6e2bcbea716293f66933b9640b864871b370d5121624c4991545d801b045904cc61022ed99c70619984fe8cb370912e302df6c01f935f13c2202ee4c3422830746f1387d9e898929d5097a53ca0ddd804120ba0195993343d70ac5db85ad93844f8a9a3e6968a27d48808a4948e74909ad4b47ec17be53364532b213a741529be98b2e861709ac8e425885de58e189331da7277d2958b1d6b76e7255bd69f8ec9dadbb8a167a31d393d9bcf5517aa90eab46b1716df454981bd95e958058747c6099078da94d7914ed6e82ce90e96a9e01bdc0110ed13cea1b58e095145289096698838d776187b754930ced4d08aef8af96829696a02b40b7c5689da27b64831024c80821a5ffe42d78ae2103ca76ce5438a264e5ca5a94f8a7308c2c3df7949b6af653f93b9ce2bce99c1f43b1a9237a680dc971f6590b2c4d4821616638bb35acaa18ad0d1534110a8eeb9fcc91e77b5dd65118384297916312f75447e5e1549057bbca2a485d12235f2e3c477e0ad23d6603c617a003f363be94cd8d99e0d00b3bbb519728383f0def22f1f77cf62c42a4dd582b7fb254bb8f342c1129f546f02bb3e614d21a121e626c285e5e995010c6bd51d252627d2fefb0b2c7399f0bdd2ab1543bed32d558fb570b133885bd1712cdef582035b2f97f7a5f6e985af60e4a5b430f0cbbaf51c66bb0ec901c7ca04f87501895a065dd43ac2352c2dabf8711a76abf5de7da151021879244b6e41638de6a3522ee3f14e74ab755758407eb516b4aebd6eeec127317119f9ddf9edc21daa0ccbe898ecb9737da00cd2bf73f395bce8852e7caed3c2bb9d67ed1a811640b8e2b36eb9d151218d0ba61b52f7a686aa694c2a76e12df8b3ce97df2a7fe4cd75e290bda3e756e79a53f755e51aa6200c502850e97bb5c1f2bd97a872a299ab4b0fd691ebb160b1327eee3d1a1c0f4cf0decb77faa7d7601cb52e54c3b49c4e56ce730c05b1c34a9660210e67599dd63fabc58b422f9c78a487cf3af3fe6f9106d4bfc1ccbc7c7054aceb4b44c971949409f3e28ad9d12c6119f146f0d00cd7a1a90333a2627a565f43d13633cfe2e970b087fdd898ccc36d6677696f6a2ca618d8969c83e11e7d53aee1e5729273712eb52b927a356a3321e8a54e8e1dcb4774410d82b21d800429e7a34cf49b8561ef6b7f48db426a6bbda606ec282768fb36f5f508d5b1a1995e7b03c5da7e348552a4d0b02a508472dc791a9aa201ecd2ffbea41de41632f4d11a8b9bf51eb47aadbb4aabb83472044d546557500ae2eb487282261728c4249cc1b5fc22f75bdd069c99732334c471a50c2c944d2563c67b93901e0304333b407a4ab2289db5a9cb0b3efad1d357e329199a3b9693595f0e1b5f2a0355a110761655f9bf94eaef537e648f23bbd57bdc53b5790c5b23b50e0003e0ac603bf9f4ce0632004b0407b87da898c0ce89ce4718f382daf347e69f873ecdc82d4151b86694782569fb114979e8f499c3e48377f7eb4e84b63ff841c972dc195c14cec134c7ed425222dbb704bb09beb8a6fd7067e3c9dd6c26a8aee5c59922052d6d1367956edf672b62245f044af38b78e67b780523b610c0b40879faf4fe71224659aba7852a9d95d87eab777dec8787576cd33b827b8d33aedfca5c21a4317c0d554fb78321992f8da9e11c286b50aa9f42dbe474c611f7f6e41647e2effe5b61282a7d0a7adae4c4a22b54596075eaa729668e731c6d040cc1429725bffbadd620757e38c57ac5ed36ff6861a75db7c32b41459f5209e709e0708a8f825cf50eff912049332f159ba6e5a2a05ceb243e9972ca4b1a2984ddbd19f3b5159474c0a6d00befc794c23b3b9160b6e57d804b506e17161dd1614e2be8b4d30cfda057aeaa5d75182cf870d66aab9b3ad927dcdfb212fa83be8089f935fa5bc21269a60a59c0d59e6914e1b8556211ce2e57d06b387dce4cd3e9aa6b6430859f823e6f94c1cbb4ec599028ccced912726679cf9ca9c40cde1fea539a5130e5756fc5750a125110f57b158778b0c25a61ced4f7ba63ed6f67ac77cb9a23c3d1e9355f1f04182a0ef0a9a9758283f1100830aeb9a66bc4da38c5047a149165620718641b943dc0bf3fe991f3aa0e3aecb8e019651c262d5378c2fb3f86c50e49f62d6d47bb90f7f10e5120aeab73c9384b8ccd23801037c5af5aba4d507ebdcb3bfde67ac7c1bc7e7d3bf632189f47cea9ac61318818fdc1fdfcae63a4c421b43e0ed36a461eccf485ca86bf5347b0c2a2bb0af6257b9044355a45ba1d486cba67456c0c606e0b654fc45462d56371a625447617409b0f1891782addbf8e3877f38e49b634a8bc2e17b47e49e482b4157cc15680e4542a5fe270fe7001d663fe374f8e5cf64c01458c639c8785227200315283ea01465d001dd031f56b846ea02dfadd6ddecd7482cc31614400d557d0ddc816577adc77347e29297a19ee21c1dfe7aad972f0a3dddce5c1d42474f205097091a4f6edefc218d219dc5304d5dbf27985c29a0ce7eced298d1970353037b4eacf69a4808f1e3ef9cb726336c970699dd83385278ff63ac472c4923927cd12eb9376de17d0640006e1e0ee90e10836462552a02c220179d7f1f9058a12be5835ff350db5c94cd2e92c5cd25950bb4760fb920c210a14d1905552f43366c98724fb2459bf0fffe5c202af3d293cc97c6c0ae1cf5486fb78e0cc0d26aed4819fc050b1b2c8f1175d10c94e6942a56b028f7f3f25a59c6cc8735cf823cc7c21859093d5accd8dec34a6dcbeb790f12e82f59b3b62ff8b9ff0a9d12c688f72e51ef7b8967bcf459487f4ba361559fa2da7eea647608410057174cb7afd86353abe59c521975a7e0ebed3a9b05b696a83063ad693ec4738f6cbc816ca03f97e4fedb59674be736e8cce508628a93511d20cd3f417fed7e10bdb5ead332183eb20c59acfb0c77adbb7c2dd3f16394fed64c62bae9f97b94303597e9cffeb7dcef628d63549ee484432ae2c5b6987d40cfff6e11b6037a1bc3e0f48bf87d8e1e30bcfbc739a2307dfe12e5e23aec7ec4802ab4e5afd4fa7bcdb3b81d8341cab08645f10947f1b772cb2391bdff0573d335f148457624116c72b20a5e53ec983f6e601dfe152e35e4b28de209f6aa4055c271cd85ea04746bd4efaa4816e8a71a8d61ed88d3791f9606b965d8aaad7741a9f6bf06d55e3d1bba1b88f2bdb6ae9e48db89f40e3d65eab834167837130a4e80d3a9838d5ba0d09c011f80aeaf5a3e8a291672408898b4933849a468b786464bbb3fb7d944e8bb9ef85d1fd671b2792d5faf68c5e307bda8df5daf543f6ecf3919a63b3d6800257bab48afe18274b8a1a08f823670a33fe58aebd2123cc46b754bee7318eae4637c2a6885d8d1d5f6539b152681b986c297f17116e17cdde777ba39aa54402774eebaf093ffebc8db90d071812c02849665f03171eeff40f527be475d8f49d87ac77454ec24c214b9e2eeaf973176654c5238cd272b57166145bfd917b8213041d605eae8e33eeb31d83069d046cb482eb6bff7c885bbb029f4dc120cb3853fe18a345ccc9281a867642a0823e5e02ef01635470b44c92b917481d93090a95a75b8cf7ffae94922a928c26846dd8df14a07e737495990e22d82fe19a2f3e06252a8b1a299a4a1d483a4e9abbb0e261b1100c03b87b126fd074037b9a84f8a891462f5aaff53ad5b09fae1459f217543ff00485eba91800de8a58afe5951b06af1e2cb6a25e679da1ced0d4e0b3421b00e712e1208e1dbd10118e81457c6fcfdaf5e8c6570096b7bab3b08d4fd56200bee44b89f3a03bf6e245a50cbfcd4287cdbf41a8820b57102ce49ceb482a9b2362e223e5a99d4efa31f27244265493066b74695a960ac0976097ca62a9c740706907fffcaf11e4501bc05aed9b3d34ed7922b740aba00d2c4e3424125ac3dcb2c3cd743bd159a1443ea5cb27d6d3d09c927d84598f37511efb4e77343dddba507507d73719d7b53a43d7710ceb196795677d73962fc2f9e3d7c0602240bf5ff0556098077be4d75230266e936b2f7eeceb7a35baf9a91a2c8faa1b1f96d9d5b8b551caf0e94420e3edd126ef1dddd4d0e0961592b1cb3b2b67290663c086a0d96929fadd74b0da3dd64d3885b2f9e2e275f54b0ae3f1edac0fe568a28108f93bd9e9d2f4cc8c6265e3ee79c9e416d4d124145270cee7b41a4f32716c9742ab6cbfe3cd6e9298df8becd717fac63c5a7880169691d12a31b0763310d7e558e2c1afa6ed8e9ac776a50fe7cae2c3100e8f484fae1565b5cdd2ddb2aac7d9062e8cb25e75311d0b447c8149245c92a76cfac862173b37074aba19153ae7baa1f780ea899d99397fcc25fafb780bdf0b43978e325a7d355721ed2b4361eb08ece897670744beef4d31e52703e0736f8846f4c1a4678824bcc4eee0ac0a64106e586fbfedbd246fa7ffb090b1e4e807b1766d0820ea328654aaba569ad0290a2195349d25485e35668ef113054c39cba9153d212485ec2d3fe6d3c1b888fd6f47b479703598582b048552f9a3981ccb544c1a4836da60f776c5f3e485a8b5907903472ca2ab9f5ce92fe2434f444970e1a757fe19843ed55c1c6489b963664980b030c034ca92d5ff3a00197db40239f937bfdaafe4b1b4ba85bf6d041b96f5a422e754ffc5705248226bffe006e8efe943f5ee74df69ce5734cee1faa4e9be43edaf5e763a5cabd2048a89936143e8489489915d6ab1a51a2d85379045c99ee6267daf8ca67991ce9189d314d61b07b93241b4fc4c7dee8c9b7eecc2b4b9e74ec89706f47dd17eab6d08bf77195f1659733e7e2384246f3024df6faa50f76a6b556de4ac9b16926fda83a686ce2cbb98aba9e050bd5fb44a66d16617b4695be24bbb1337bd0aab29f504d6d6eb89d0a949786ac64954494cceeb6f3c4c87c39bc9c3f06e321dd8c172fc355c9faa8740809e1d325955d1dd4258d88bc20e931c572fbec36f5a4e045179356486f8ee53e1401c61127b8c5a17cb81614951e5e889366ab04243f08fb481ffdae619973ffed5bcc98cad271bd882b65719f5bd3e2a35896dc4e219dfa1a377d27879d0e97cbe046ed40b629773cc279076a300bb51d0ede08e148364300ec9b2ccf809e628daaa622160cf705b7186884ec5cf45b3a297b76b8add4067539b375544dc17dab27df841036bb2d2526705d184f9727d87aadc2d352c61174449b4417a93cf44d8103f09a0c03d2bc02e345bdb2ab8923b8a074ff48ed7cedad936cb633d39e273d152eaeba3b9e381f9067a6f4b1756a1346c966b77a550cad884699a3ec5aa31dc2adc12693915f21951faeb4c91d19577a0c7209e5d3bbca8d84c605a8918cd9761ed1240f258881f3608afad4415fd74bdda742a83da4a399a436aed7133ff24414ebbef1e2764d4c34d17b8d06bee52c338b59264f080ff06e728c5c8cc9a62d41316e796aeb17783031bda05aafd8e9656ca0f004884c33f87f4b1886c24e23fc7b59fc83077642245f4a584128111721c9aeb19fc6cdeab204a817367f04453ee8b58c4ebb16c7fbb62116f0e10f9dc288c3daf1631cb3e66ac5e7a0ebdc60a35ea7b486ee62c97e10e59a93837fd7e8e0e9d53c79d666a6432d1c78127ef6cac5a4fce8e85407d651b6e6fdac8283ba50512b8267a326e856dedc91489b2036d8cfdf3c571cde2ef5a4a6228abf440b43b29bcddd5a0237c002bb1b2a85378834ed97ccdcaff962da3583b1e63d2ef6b391b887d67eecb82cee4128e2f71086bd5762a1860a45c59d94fb7e845cd2f5416ac1f80bf12315190ef0526d532a1e9d9a8157fbb44a7cfee66de0a8b0480ea16dff23b4c9dce31131039aa6f6af41a772ea19ff3c5df7416686154e06c6e20424daddeafe3e6e6ae2cafcff58fec7ec45b288ef73e9916405204f2adaaffefe6a5ecd93ba602ca79223f994ba487f99ddd8bd0c35600e11048789b279ef585d37e62ce1d1c437239a58511df68bd316063787177f8a91925176f69a7450cb03828698ca31905a27f98318cab30186d0f34e2ff45cb365776a0f94f5e44e0410cc051e5b96266e26682fcea87604d0d73361fdb9fb957d31db5b07f4b5d97b52ebaae31b067359afb0c8d68dee37bc442cf5ff86b05538dc8d31fb7768cbd3756490a30d194065d849c57e791287260435b3acceca1363b96eaf52bed43cc6ba3b554403a47beb7ce32bcbcb18c56e6d918e36f6b420640f867e4982342b57ae1e2126f5bd1398913935af5b57852b8fda4a277cdba6ccd850ae578ca2622af0896d7872227f029c5a9529488f9ad5625ae5a7a6567d87e8a3a84329d1b9f0c2b3711c7ff37f14ab6f81780aaa7c7bc3434eee2284f02dba4110396697d43a2a3b64cf25dec64a2c59943839ac1b45a059f366236ba2c0d8d7a42da04684c0b212de066ae4cb8de50ab1472caf2d53a718dec4d64e31b2aee32616119d8a3558317237212d18d2ffc5e0a5616a7906b91c888ac6a76f70a15236beffee275964268ac5f91e955842d91c2bbd04c19b1a8a9d5e6df05bf224aca4517d8db9f0b9086b3a053cd7f7a15082ed0413f6eec98088203c78e8ded7192623329b4a533fabff89b89cf100ca1574ab15255e84c2033481dbd5ac0464b1f5e79731308df18d9164b2aa51818ea9dcc058fd8e983d38d7e84f89483c6c03ecf65fbdd4f3eed1f654eeadc7225faed914478ed94409689d216f03a306a3c52e2c153b1de98d7773266bd5a5e930868620c9d20544b2b0e157abc0c664302bd0a7bede6cf157a542407aaa30895b57515cc265e8d571918712c774abf68c42dfb6e5b67167d1a0b03d49d99812ccdcb4907cd6ca52afb9a82b17254250cbf56c2886b71cd2570168310ba7ae6ef46520632686d28c0ed495629a59b361004819ac13c8b1b27735ada548b91af4695d1247034ad9af3b2ba6659101b49ab3fe3276756e7ddca48d0d26cd4f5867b8ecaedc9644a9209b00fd076bda19e15c3fea4e02fc6159c5b96b0d31649c99928352eeaefc3179f82511b37f7a25739e279cbf7c3eabae2488bd0389496f3e4112536a473bc1233f27b472468ca847eee082a6afa4ca365a87362603ccb61935101c997b7ee946e89d47abc3d0abd883914c194c17cc17b510a19585881f224e89ed237a90ebe2fe7bc47e7274222b7d16ac9d56cd007c570a8f4f9052babb73f899d677fa2edf7babff38e5f718ed09b8148d4dc5aa24df54e2ad34067b91bafabf89dfd19a4c835e9dc528565949bb78bf1f886e0e1981d86e3ee9103240ac14981b074af45cc61c40f581a4ba630a920ff9e14b5a8ac8cbc1ac2863a6a64f144add63683e1713f5eb2edf832229b45912ece8d971ee3c3773d2653144847f6e6ea89449cf9cf1a7c6f0f676dc4ad67af5a880979fba322dbee26725cbf57971281d6b87a7cf02515dec94c7618054e58dd5937498f28f752e46157f7a232437c3a0cdb4a6781a09f91485392c11519f4618588a03aa1c6bff54ef2225c1080731cfe30dc237a4cae3421a98243d1a0b42366ac9256dac8dfe7694ee3869fdc28967caff931f5a7400f50d42b9453eda8b9e29bb9eccbc99592b87f26f42904fdb24837503d47e1e123a5cf278accd82f95ae3a0fcd20fcb73f4d8e4cb9eda50863a84fe21a34da368889f814015122fa33b859dd7de701b3160383223813451cdb5534f966a956efe2218fc9cba9952b5f6a9020bcabb23e1c0028e0b3f26a003d169bdac4f54beffa27e2f5f9cad71db9d3a097035acba205a9c60898338da3f32fafa4cf5dadc2e70336f4268518048b98f8637640f0ea45ad29646fd4fbc270b661b5a5bc596e0d1b2207666fa6283504ff88c21563c4b03e0817d3e3f4a9fdaf1ddc668574b2341c6afc67ae3377322ac9626c85e088cac7387234b7d5743ef93cc7df7076bcdd36de3e1deb00c6a2e2a34abe0dbe8fc75ee0198ce8b14ec8bc5d6fb211fde84d9629babcae5001ad4e6ec8afffa9cd02f355b466dcd8a81115f98ad896cbbed33c8dc2d3247a598e4ae78e2277748ead8a5071633b4512204098c4d9a0b717125ce53993759fb12abc550cf1415fce5001c397d9629c237a7a3e609317db5b3b483d4e99331100cb7f417a899fb92be3f6546aa3849314c863ad1d78c74bf97a0b79a3cc8bafc3ad58aa6a5da5ad8d5fd09a9d679d96d12d4311da3591556592e381e9239cb77bd66d9065d8dd2616d2807b55376d8e907ede7f34383cc0a53c300c6e6b6a498fc060f871305a2d560f926e2c7ba668452d73d44af62d15afceaf2e939cceeb50bc98d079c4482da75636061a334c400892f2b1ee1da8e32c7004e5285737c1b311a432f2b4408fb69a15d36234489a7f1f50c451d8275f4083a9124f7fd070eac8be98f16a0c5f467f93b2cb5f283ed0dc022a45946e5c46b39e0be9bc844164ce032b430587e2419752dec1b67c5aff5ff72758965de79b5122b80ab292b4704a0ae5ec9b3176e6d647627c53f52d4e363af7db58ed976ac4f63adaf19775f297e599c01bc85425e822d0c3963889be7afe7aa9584c912ef23fec578f6efb4b46dff66bd5fce6446f8a1f880947c33fd81298539b63f2b88881a2d4f064bd945cf598ffdad4dac5e70a1c386f2fa9a92d3fbd4029e27018c8dab866cd313fa045ad914cb1ce7f9fd727effb3d9d34b12fef06c1c0db513a2715d9a247b52de1005d87ba20e3bfc3b06986021c4f834cab4c86098d7549fa4d26fff7c779aa1106090a4be096ec7bf9b975af6f4c174282f4893501dc462b5f0d3e9c56aec1f65c489a77bd8429c180b3094da23b098e620ad94f86a3bdd87225ad40cdf07f291a06c909dd9202ead4266db2d39cc52ab7dacb868f967bc01b8e79e125e8f43f323cb86712a0b94e12d9c9ab524db75bbf49c0f75b1cf83e3752a2de2621d5e3f9e469f6a25585ff444936a12f2d704bd6365a555a4e182410d9a85d84cf4dc40d57088d06452cad2457eeb0792fda119b21625b0c048816dd5356462085ac82c81a6982fdda285d5fb14e87d11edbdc21e4958db8c8083617b3195a3e74457aa6be4ac12c288b6d999109e6f7bafcef8b669cbbe352437b3bb4803628e8e2fa2282b677ed41afd2a48550f80b8ca281e8f10e39769df87c51de50dc550a9e9bee3ea7eec1b2d35fabf2c3fb129a02a895799707a36cc192a1821dbeddd61323d711ab03022df2a438971821329ebfc27ae89b468a9ae30a0a8dfd4192f996e5afbee98e0fcf82d0885daf4f614a03597d9d873b2a0c4d88d02cee84e4037c3ba5895bb88f2a6979789c9a32d68612cc31ee8f9c39092d645913feda93b53b44db136b3576a3c877df9006651ef36f9712d306ac6ecedd2f3597c93cd8285592a85eac0223bd3d5a041a66bfa6864901f9217f36b13f6c8a47772de206e27cc6802702e3011549d6af9bf6b14bce532ee7ba1a1a1fbe15f3732b8ed806af1108e56d43f20d2724f9621f307615eb4060412af5ec7d9029fd3a339e5d9585268005268abf1755f9be78ceecb0bcbfcb96f09c1627dc1b22b28597388a97f43b1dbf0203dd6654a005a2b6442c4893b62a28534c49f1a234abc94bcaeab075825e599fb27224e4254099d297e2a659a79745368fb1f9e38d042008fb3e035c68ef0b799a3c14ad38893b63c7e189754128be43c9130502f2931fcf910729edb2d3ee71aec9df98d269730df66aa1a0f5b7043774b2a3bb4d57761b5ef702fd35c35e34f9b0f476a83d32295b48ec62e42ec0cc4fe0b9e7f1d3b205a6fbf848ed347dbe3d339a296d0b467783119f6cdea07be058c64e9c96c781f39a214d64acbaae211ce76dd6bc4aebb365bc3917ea27cdb53e5849b0dff068ddaef33a9a3a92000fe284528c9f591592bfb98fde74246e08dc6a001a91118cc9ca9c05186d3aff33d53d0577c5061ddd3ca7ca5bbc3dbe2ff63d54d23dd3cb8d12a4b2ae65e111b6b335e6bfbcf07cbf6663a179b6c21d8e5ad6b678223203c54083e5772671474b713185378def76392c934dd896755613b3dfa3c816b013922db4e77919ec4e4be1dcd0ae98d1738e53902d4ce86afc184b21f7da1371458bf68dda0ddb25c486bf88d754c1e10524d067f9d77af7d0220652357de578766af2676fa2a22c9dee118e54a75268a0f15e6bc825b0f7d34cbe65c510eae604d3b987038f45df0b4bbff97629e623ee14f48b893e66186c6edc961ab6292082d3f368ed74f663272ea5400852f09d5c6be4530b99b87d22b05aed8a646ca8bb6ea29c66f9786cec8566b1f1ced4bc7b933338d7076cabe2e2d7706cb30cf63d82026894fd8929766e8f5b622ece3b29a52971de73cb9c50bcf76b259302fe71175ccaa16359556d2162be8cb9e6fd7e3d4ad5d722fe8276c3bb3b19e15ec4bddf4b675e22d26ab99abbd23b818eb75d41d8c3d250ef239434f7961176de77971a87eb245aa2fc652796e9dcb2f0d021315c8f23b5ca5338f6d6b16625285b4f5f4f1aaa46bab1e434fd885c0e0532127d415047423c6dbc753e3385514a0acdfb6d5ba988ceea40db458d2b4001c02858b62654d736208d0a954a18174ea63a48c0795f0c27020715656d0b049fbf9cf3630ebb4240cf69824e10da3c6744866ea20bc07171fa33598b4e5ee5eaa5d59973886524f278f831e8b71787dac358b9a05c271289496c842ec49865f43e1e1d888afb3d85b3a8b74c17321897e3c5fa8abc51844aca9374ff066db410e2a4b45ddb2fabf1b202c2391fc3266accbde91a95318f35afb69883ee5ec3721bba12213c7181de23e6651655d2b9619d4aac08de66989afcffa2e5c1ee67b04958fa58bb4bdab3fa299a97b59e499721817e83998478156bad449558b11200234352f3d33c745ab26ab111a073509a90c6514175d295fa71695d8e485290ba63f136778eb864ad000673d4daf53e782a5e52684892aab6a4fd0430e404ce4195d880a0067018247ddd2cd07f4b19a8d65369e2aa6e74e42d5a6b32ec3ec32f4a7480f81358ef84ee201e10cba1379897ac62df5b359a357e344efb72763271157da8aca1bc9f4a2d39ffd4173e89dcdf6bae37c43d2c665ed38dc6d17e38a0f691cde3fa04d3d9c1df7325131c7734f582ccf15578fa8e0c6f3bf164bf2896671e624dfbea87bf08204041e6ea5c57cd14ac676ccc0727c8d55b14c4a1a6f3f227912686bad380d0bbabf3ea10b44efdf8ed6f2fd359773fcf4abec3f7f3ac6feef96a33e0436fd632969e4e127b4fb7579cda127af98e56160be2ddf7e6d8b868a8491a0e25152a6912ad6bdc561f63169315cefef202575fcd0b9c7de473cf3a447049292b95e08c0a3bbf5a969a7e563c3cb016da033b7e5e68ce78c2a877cb2ba806b21aa5a37ea175d11c3b548e1c47c6460d91419214603862f6728861f8f36d2682b1f177716857c3eb345f0641e569e31cb992b6c2046fbf083adc38044bbdf17bb115f707a7f72da8503fb6aa7a082b2b1905cf35d416ffa996723a23123f5567a5c9cad55cfeb470c394123e2874c27cf9ec3cb830e6edc2b66f43b4342f45fe260022f175e94279e2a202a18a052888aef459ff82e1505fb343869c793d56fd0e58555dd28c87242147d81787c57e1f8a964a1e8839986d308f0ad3f9acb65109eb19d821bd58c19cf30e071d8132a4cbe782d4054b870ab71c8e88a47c934644cb3b164feecd2d54272b0e4d54ed9e7483d1309d3ed79b46ae1feb65abe11ae879496c10a0479569e533d78b321b30242681f3a6f6460f608d853b748710602460771c578eb6c4d7c0ca0b8d46557947048d5d8c05c80bc2f12ec3a2de865047ce8e8c8edcbcd26ddbe5f25ffea6f7a76d4b693bed20f69da7ef5c892f4e78e53b6e68ea86e83f0da67b7474244ee0f4c71d4e10654ce6663bc746bdd984c91fc47c9e740b70635f9365de39652f1c0ba24e6d5db5da3c0203691add207aa9ef38dcc261d97497613a3663187d01ccba51793ee43837729b070168ff01c2e33c57f91c962c621942795223d4700025175287359a25a9954b81591e390ad580e88dd0416593d1022312294785d97e1854a797150c19d4e9467dba068a8112434ce4f49a7125aaad95050b68c40ddbabe531399870ea39386732f30ca67d1d6b59bbed9c55592ef67556d054c05741c5a1afc3a4b0a34f4e89bbb7d2493966cb0c473a0a6fc40cec1f71429c7a826a286c7d84f1f00bb66275cf6f0271136e7b599a06f95f7158e6f432dc35686aaf6c3ed3e3de856abb88e80552c4f3d2a3bacc981b1a49d83434c707fbf7fcb6bdb36ee4159d7a59854ede3b8dc21759f047a481041f25fceb00cdf403efbcc90f82b39e2ee050a105043e7e22c6eb6c1d12ca8b5695e109a3f4fd2fbd56373a4e0f34229d666abe0d1ad62e2a66946972af508e888797ba4b913e7c659b3f5715362e953fcc3494c904ebf9e86352845985b23e4e6cb642d402b2382327e8a25f2ec616ba5f7b42ac1192f862468d711c66662fe965f8743b8ddee4588a00916a8d3ac82b07f2ad78cc4fff6897a0a4b14881f5c746b8304a7413ae2fa5856cc75beb14d27b7d966b5137f658520acf11ddb4ba8f9b2041d906179c03c749c90a2a53d4a2bedcac3ad680e17b585e2348005d7f7fd1b2c72bac3e9512195578b0721215819429e59f189e5b681e63b9bb0528565c6c413e8fb06b93385b446e3427e1189ee0f91c97605d25a244d4ed63d9c551c1851af75b38648114e0592b9cac74cabbf28b93166fc46e336c065d1f09a0f26cc6d0a7b480fa52a79ac6d006bd4f95eed6e6d47b5eee066da00cf27c4c2a5cd136f36f48c20d81e1ab1c3aab6d6cc7f8dd8bed31a60951818fbef26eabde0d93ef1b1d4b206192ee0e3b484e5c6fe603891ff507b01e146bb674b457420031cfdc0809384daf0901afd58e429f32c25d8286e1c70a7b7a126c8e3801ff4d91c71f33ad2daab27b30397da7d104314f84391744de33a67aec1f47e3e933f142e42845b040fa2682232462752d453f84eb8e5aa2e82852dbcc64490c61c98cf2bb0051d230a3d726426fb8857404962951f9f1970c8f708ed93fe4ce9e8bfc7262f5c120a133f329b0f005f4e5f59839d3e007c027c118bda957d8a6eb697a832656a6b17750f809314477e5032729bddd47c9b7c6ebc2baa0982d6ea1275f5f16d9a3c987628bd3c1e9fe558816f044440d1ba2367af1044afec53ccdbe042e8c0fdf8fd772fd9cc813125b7b5e9f0124fe15cc920cc0abdb6c8cdfc67d5019167fd2cf5d060cc0b64a6aaf03423a816aafe3b250ea048b52835991fe9444c5c0ff4e94859d7c881c73708876bf3478e9817394eb784b324b2918044e51246b9b4a108a89b3453a852d3d40c9851f573510f58519f4beaf06b4b578e7d9bf346a621e188a4ba4f3137d3e9dcd83ed317ff1971eb42182f0b8c70b24ecab4132e01d6ae65b149e18cdcdf50c05038188b8408e87fd5df998fa6365406d820a7abb2062db37593c31ca523db22827f761c8d9ec4a8d2c1112dcde7a8f114102a10cce708be77755352ab9f1c2b980ad6da6a0c046ea024ee92b98296b293264200daa4398b3731764fc6d68a3add782567186b3ea8673f84e54abb859cd81170377ff3cee91e5cbdb3e37072ef262f698eb43c35cd526b3525c4dc6468cf760bb81784911fb513846274946b05608f687c4dc970e5d2a97b0532fdb6b3bdc176fd4937fbbf1b18803762f2bab1abb0a46003613bad8c7a596d691d86b909f6bdff11ed62fdeb2d71b0ca8f1b96519ae532d8e6c4854b3615f2ce1a9b53f3f1f41cd733f647a04076370b524fe2111d3f66e9c85a936391ac4b0adc0df553a11240d4af6ebda207608c473db8111949b756b46dc26fa70c9e80988fccd0ec6e2ffddbd3e12d8bc77fdb5d87963d32dc3a9f174510f530d3157e9abdeeb0b72113abeb945faa39f7a0f507f8096a7a6da674c49ea752d46936a8a812d1a4d475ae349942f59def4c38147037d89956127c321ae16722cfef8107fa7248110861605a5961a37586673f756b431d169133de7340da04ae9ff00f0e09385ccabb3f49a89c8663eebf6e721f992b994f77bdd81db84c6fbd21b2bc609877aee6d438da6b20f63b5cd4b5f96f7949312bd9d827d4f0db56bf0c2959c600986c70a884262e3b1d889c25c5ec936f4af59040009b7853603ec5b88ff07c3f96c6e5ea62409b22ce6898f792c222499a11bfcc101990ca9082eb6808f85acff3002adb6b99c344b13b489967fad0689f30e975baa23dce933b136471dbcb07a38d04e0f72cfd13f8bc89e111b42cf1e453871462b93ac96b7e570a6db3db83f9dbbea7b353b6e7f2b36e55d6a88ee220d2a2796d448e305820010a8a6c08021080101a806cca51809f6fb028bac197a1ad2b2aa3a9ca7e1f29e640d91fb2e89476bb2d14e4b14aa2af28ed8f66e884a4dddaca97dd84f1ae5cac96986f514152806ecf71c7b2abb22312e4dfd3aa6b2acf96885bce250bac75b45bfd5bb4ca1b140e8be097220474c23fdef63d7b951105a0745354f3773a4c04848432e10dbde3033aeede189c1d1c7e08f4557bdfb708a44b0754eb183dcb47f6affb554c7d4b851162ee4e5e57e66361311fdb7d5f1efd942199107fb61e477ce239e1badc0180b3eeadad1fb7774d6b2454c1e596044063767c21022066f563d4d49f203e21748961109a1cc3263856897d41d7fd7822c6f0c71f63c6f40e3b9d291005f94ee1bfe29405c89f19d28f26a2370ec9cf9167a2447bcafd8627b8d091756ed5037412795a19486386e1f2250c80f42b758d6b284ec3146b369387af07e98ef39c1fb536579ac9f39a3f1c809c5ee3d9b6666ecc7edadc3c45e4b9cd611b33fcdad85356c8d5943027ba91d3db8fd606503bc47aae6f430b62a15cb762921b53bb1e72a22062579865409eb70407bb1984b84e167f799a80e66db69adb195d58a5005968c55197cca467679ece0c80ed94976202fd0eb34635fdfda421bac7064769ea85cef8e8f9a1c89d59146ead0e7ed5ebb2d74c2b75fece75a5ac721892ae2bce38b12d858a61ea386a5e811fe5f477e2dda001e6bec1adaf5f77efd7a97bd1def6742fba28818a975d06cb74c92b062578c65fe6299a85f28a7bf44318dc3c81d6c3daa6f01693beeb5b00159583ec2de1e8e350a4339a014001ff2837714cb6dd226582cf4b9c5e3e83d5ddb23eaa2ad0e9777fb73fd7ad34e7890ec4614984a399ee135e6ea168c270313574ab37537d421244832c8cce09c5c1d74d3823014167f2e01f5a33bba2b7bc9cb7f101507ebc27cce5dd19288c8ee68828e1f191dcba7187c8ab25aabb33feb843e6c0c7325df43627271b3017fe27c62a6dd719c9c385fbf57c5b9a5f983f44534c8371e181eb29c168cdefd6befe8de3b7c938e6d61496cb92f3b141da2707d4570fc4e559acf912a8be0c2eb8d8958f8cb73497da499944377f5be83d8f0d54fbb6e5d76f0ec714c0177dcf7e9455473d99e8e1bb74b8273e14dab62890ed45726a1424c8d360c600c7cdd49c3b0559131e2759ff11dad5448b56a1191819b7ba7d70916d5b6b75a4abeecf14253e6ff71dd36b001ab8d10479653a64a3074775be9251aa18bff3dc236c9c2a12aa597085fb9900763733d305ccc10c21ffd1d8f3a128979f3664de4d7eaa87e22ad62072ca7c729d2acd682e66b058e6bca192de134e16803090537f797302b277c1d256d72b71406d30150e8ccc2b555f81a65bc7f63ab80cf19a84b1b35da933a5ad46d35ecaee9e22a68891c11157dfcef7773b37ed10b65a56dd8931e7e1aea10a43c0d42b0ea6aa017fe9bd0c5d9c5c1c7c51c51ead05ef77bddc327a59bdc0875d0b7ef8824fae892f46855e342af4cf8424b4bbc1da56fbfa735d56a8b5d94a4690632a56629d2a4b2b0a634f83bfc92cb77847fab265dbb4aabce07f5ccfa1c397cba9b627e7f9327b142d0d9aaf10110573a9789d2edd6a04f6506dfbe1a26182948feff185363ed4b8ae595e120a7098e6accc69df8fef256f2b0fa05d212670f4d55830843ad59b3829074e55b7117c2ea91c22092f6ae0585e7eb1d569d27ad2c16355d5a83df7805c5645ca2ccc6a20215c48ee0f0ab77b3203f61e5916542cb99fedb1e3e18f6d4e370cc2ca73f2fe059688047a4a067d626aa1aaa03616ef8447e3fe311a583f4cbda175f8b9ddb3062afa626d582f21753deee94df19b0eadf9ffd72a9af623b902d106f7322d94e8e6c8201d053497cea11a8b9a97d1e76b8d1c4f749d34c268f784e1d35ff8504aed4431140087dea1c043bc01fea4c5000519d7959720d9e5e45bf9a6c74890e04d44dad266df3bce699dd25e462d089d272d65cc3446c8b33bbbb16ab921b20e14b159b2beaace745653d801bcef30af5bc2a76816c02dde348a8bd4663350742f682d22b27e2b4712341f23811e151cc339dde6fa637137475ccfd1f02cd38f212eaff8d52bf4229647eab61690542f7364dee53fc41ce629a22fec802f41f52f19c3047ad3e85d6175486676cfbae47546401c86a7f5dac96cb65b194fbd3a1895d4b5cc54cb30594d81674a1212205214d624e10e0d300ee36ad5c2211191401d28c56bc7126d3961dda7532ebfb05a4ff206374007fe49968bb2fb8e4cb2d95dfebbd7f207fa8ae6fc535564e6cfa76af8596e56138af4b685b52f7744ca12396ca78e918271ab1444e65f5a79c3327bacfb8280bf5bc54b4cf3d1c03b998d7d9b2487d9d42b1405fb25f9530dc3f1fad04863d9bf5cf4bed1102be34883c7f1dbde224a3ca31430438e1abc23490f65f8d39bd3b0e79adf91b824191a16dde672754392b857a245e40979d2fb6226dea5f17e0d9c5b4c519f1b08bf9e32e314cf4275fce2031cb3977f946e18c2655ef6fb0f571826af2a1cf9a1dfbee4c07bc13659b609751e227a30555a43862020d4347fab9812efa82f235e775c6f1e29d9371db0592a9a4bfcee6d7bc779ce5fe11fd558dbb1463db8889e7658b9f0d2d71f4c2bdb3caba1a73f785741d3b47af729f390760dd8b67587b06fea1ad78fe61a2cf6978fefb282b0df576182fa3077d8c8bf722b8f6a26f889de3326c5230c6293b6e18c12c73ac42799bf91acac3484696b724c0f60f060a5cfd8a52187af85f4becdb7aff67bb0c5ef57b67ca455a0cdafaff7d96b267d265ffc0105f57de09922ef72561c82e16fac5cc9f1b3f968e45990a5fedb3403a13d8b577a6c2dfbeb911ca924012763d198b902378a94701b9edcf5a48f57d1c526598f9d678e503769fcc2d7246f955ae257efc44cedcadb44921f109631cd8987eadea41bf35c54e44e23accdb5c514d6622b0d51f4705594d272c6962481c037bf15b0e50ec42e370ecb1c3202c8ec4ddc36beceaa2f505baa3a89c1c4bacd872b7b89b99e9accdc802131c347540acf30b20ca42dece9f6549b9b33416426b4d67aa7b1d2304b0d3d3e606e1dd225b69a865e8916c28b1f8c7a8ec0213fd421186838a69bb38a2d442168e29cca916aa8c9cb133ba34e739ea93d54fe2f58ca8d24210a59193b9aecc9ae7c4176ebc07858c323788848611e4821f2b57213ac290314a45f7f31f2f68f0023beb3f473844c19ad281672b3aeda7005ef11baeefc492f04eca6cb6f0925c62898343958a5f10ee828bc51c7e2bdd07efac5eb9ff41d1fb46f240ac837635e964ecbc431abf57a9eb681f720ef661edfee907d66e550327f0fc61af0e2489b2232a543fa5b4d8bc75cafae7db71ffd3c555fcb5416fe3d7506c5e03f1850785605df8c6fcd1e41fc485f12d421980632bf85a408c42ce430c0688a2f2062be7ecbae4c319317285c2d5b8bc66087e6c892f1f85451a02711aa81da20e8d3c6b8d0fa8779f8ca2bdd4af1cb83dddeb1de43d6d9e2c1c26f91e216c26517b1ea54d36a4c2bbd7f999b1ad2c3f6f9ebbde6f2fd236519fa12feaecf9796cc8cebb843edc166fbd2ec3b91c1ccdefdbe42b22a938118b86b74c821d974cd65e14d5c7b384182d1ecfa22670d6e818f25da7eace1aa80c0f5ef7a208da22faa029393cbf52687b80c02de2ead3010d86e2728dbc031c88253a3977f9b6228ca760b29a47d1a71a1473058ca7c2c8adf38965b748a523ee9c6d44a4f288da885258bea149a2f3c25f77bdded0355cde33b32f55f1c9104fddbd13a17fed4ac27a1f798b98f7f9058b3d8ec630c6d1887c2c2d9ea89dc79d6e5d1b0fa202b6e3160c0ce1a0b6aa2456cb9a708f9a8480d94df87f6030dafc80e5f51bd7181065309b20bc156d58dd1ede6a73fe5b970e7bbba58e615841de209b560a6464cf381624793e2cb3012eaefb371fed189e1cde846781341f965d43f59f1e234b77e62cab81dc3a1a79d9de9cd64f7677d5a14fd7b1c50e91db4d8208dbe3e1ad67399e2bb9715b059097f47134d9bc8dcc91ff16e60cf084881db05059b747e275a880fbef8b7271dbfc354009f832420736f0ea70c015f2dfbb46adb69c20595baa9d66366876e843a74ac92c0647ab29e16cad1b1d76615741a547963d172e56fad058d4f0cb9281ba78be66d9d09cfb1ba5971fdd077e1a2bb77942461f04da4f7fbee5e8247c3fae0e7fe664f2f564399496682dec224a9bf502c974c5ab6318bccc127354d870f3c94659988be135dcde6e804b1cb76ae44a54f38712689b0cd86fb2cd2a4bf257c91b6cd474b629d5616d4b47ef282d1b74d633749342963c424b8cc3bd3c8a944e48ef888755d09571e3e8b86439bd7777cd6dc922f0dd1a236442514ef8131c628a0b73e6841518ec88f693f1e16d8f39a52706c631e44d20e71894b00c1f14b75a3e58fdc27dce0581cd46bd9ae66f54520842ed060d9eae67230c58df9b8694fc443d4530b51e7ff5ba44a3aeed4ac6b7bbbb125075e1933d7a0fe997296b12f0136a6cf5c78f1c24560f4a0c99e1038529c4f8f3244ce2ec56132cf45ca12989a6ac41a897f34d83c0168ca71c83060097cef3cf7f97b4d78f1c1d0fd01c18b4ef5835632bf20080c579d1e82e7d032f3c1e7e9bb295c8319e88dd001c69106d74e4ec0c3dd5d24bd1cff2c287ca61ae5b45e4d2d659233be3ce6a7c232d1c535a28086f4b1fc1ae25bc8196520ec1429413deb2d777b35069304a928c12526d2b4755ab052011a0fd6b5501f3193ac49b37ffa85d0be031c972d47e6a390149a08d8a84314dc3fb086cf5cfb2ce66087ea5ed9ffc80b10cab0d05fa179dd20fcea5cb922e750c60b74a2844afc5872aa6f43f4659562e3841d5d2d5335dff24ae360a697effbcaee3c3b511213446e53eb924243ab9c04c9f90123377a038a09b9932a0bf78fdc40d3b4c6706630649e797089df761f25baa62a2eeff55049d2b3fc566802498b3ce10ae69de25cf9c881ed786907c199c3bba7c835debe55419e87445a402ff6cc169cc152695c2005039eb1a55275f958f933223cb0145cf67581b64c0740dc3df73a465c9fe74a064b9e855edb72ccc80dd0090143e28450e5ebb1c1a13eb4cd3d5f93aa1354a3f18386ae358ae061406393cce531959725aa945652a14a3ce40100368699dec490c7d0b494145d48a35396046faca1cf9b3cb39d8392e3728c22adfaa327ad54bcca94df2d949a3bf9b84f1faca6c6ae612e99949a11f03f7ec045efd0207d21c75bd64537c9f6465cb2e917985d7ef0ba320c5dd713fc5c8718eeb1e50f37eeb176dd37ad7a50f6d0c666b7bbc05e4e168b07ff2a87c025c8b51eb60a2c8e04c745be1aeae87711a1f1c030b8623a82064ceeacae6f9f04dd67466330756b425f776e9919d1cf56a6dd4bccf0c5465120212ead57b65478f189fd3803b3c6963c67bf30fee8f6a80dffeaa427cde1b34012f1a2d2d4775d395d4c5537071c29aa6cad2d09f66800bc787ab700c90c028c2b7246d64d0840f0cdfdc89db41617f6e72e65516c1e8cc944e76899663f29746eaf5bd7e22b81428abd2193370a545f47e3a1e025c697da235ce500f2535cb4d416bdfc433b91b2f8852369c313c88d483ec9f9f59e70ab8cb504c13c6fe465067ad02361db2546aa6182f0538ad0d6e2a40a81fcac68c97af900ac6813cc174cd69e4df2699b42e915745d0b0ad601abe784d39823dcf3878f373f9e2350cf0eb0ee7ce6fb155649e06297174dd000d9af83c8c4320f0425617879dbc8b6733b9e42646efa95206bf84336dee38841f3813ada30976b9af372e48684eddeb7076df5afcdbae6989f8ed56845d34ec557bf749d3bc629aff0395464dc4666dece07dc31795d73edc284785e8052ec57d8138b3347ba547981c591c873468087ab5eca1398dec718b8347e879ccef782093e5eaf82412d1308b2e794387448cb04a750e8295c684e6b9d2a7d4e97f06b631cb5ed148e8ea7210e8020f41b4317006077096e64ad73b3c9e0bd2ea3863ee9142d00690bd61e1d1499006fc4bfa9ad54b993261f779490d0971f18148bf3678d70601b9a1938cc8ae66ac52499d0ef692e23bb769c3fbb60df42214c552469591188bcd0768c65ea3c90c002bc9b50bded4527fecec42921c6f349b8cbce3ee07704e4c9896ba524e006e3c8509c6a82574b5e4547de5022b287896e943344f32b7c2f144dd49934f301930ce74f46fd8e000c6b56e1c5cc531a5996315028828159e0c6b8ad7874f4d478182ddb4b8d864313a116711ead8ef45b1bc131645655f387ab13247406a7bde67f9a01cc4b25a7f8a46b2deb4b53dd1b61401b6ca4a0ca1f8206f460c4d0afbdbb364ac0f56ea56f1b9ff44f51f55423c371a375c6197c000b37ab4575f9f2c1a4ac06d2d37ca4028fb566f0b0a7a3a8120ea9edf8913f03e2a5ba56797525220dca17f28b740c004b12651c914ed37d7da669f7c7290f144c8f656ae4cfcbded82752ee2d2c9e622d5d083b1249d2dad020acb1398112a96b4ea7925e691158486bb609666170179576a8529a2df4ca1aacdd72596811a27f43ab46115943a2e931a230a8347a1688240b0a8c58f5bacf3f721a96fb6124ad6a92dc596ff1dc96012fbdedd095749a4b1334041c01cc82450999ef7987fa08cf6a681d323e5f4030be248570dea2ec5a33dadcabb98a0869a9e308f7a54c660cf6b8fa92fc79ffc2c218234203e45fa4e253255aea9ac6e03c715d9908829b3e9f36ad5a068298aa5c5e47b05e2fdb4517749c6149c8c8e9c9ee27bc64bab5f02deafa4bd663783251a5840d733554f17e325c234d78c3ee68ec4ff0547d5ed09e93c67a4d5f355a53e12cb330e4f044250c90a58f41541e87afa7ec2c2268ec95bc7644828d0b105191c4c6a6641c9344810b5bca1864e578a9f765d8827c5782012320e83399ecdee4606650aff3dca5d680de18cd2b1e4159a63034514442d7786e323216fede840f792fb8ac9feda1c38ae8f0d3837825b1a5c1e81fd1e06ed97724137304c6ba67df69e6c3085175e100c3eea911b1b85aec953755b9c3b76d29e2f69f2f3f8ff859f6a3a3edeccae8f266140c281b95a9da0733a57627ed7f23b52ed705fd27f7544867f9c13bc81e4252d8121d8fd471ade562a961344b35bd63b78dae83ea4c61282440ddb519cb0ae5c2e48bffe7171cc2b645d1ff1428878250d969d7a204ed95ee78f119c9d7b8990a9178a351e48d49433f5d5e1f79a01ee759168a721ca9dc36865092b6e7fc5af1ba338a75377b5eaddcb7196f57dea9be9b082e6d149fe2f34da8cb16e62735e80b2a8c959b041578f37cb6125ab7a1ea6fed9d68285f0db10c21ca87b6eb45a8f04d55436d22883f788ccb60d78d0ea34e989f020d5aaf123186d41487980df028c7f8b325755ff0a09b24910033ad6b7cbd03efed54dca1a59b42e8f11bdd8319d3a2e0cb9f614ed315e68a65bb681278fb97ab62b5351aec2766ce5d67522f2cceeb20e077fa6d0f1faf611f1d11cc00506f7124e46ed3711a8dc3f9d475b1a92c32a7a00f2a16e02727a4b467f99063501715fe9c888000dc03dffd0f963613deed7106920c8d003cdd144c184117d373c050aa664ab1aa0d874b8ec3d0e075ee29f965212ed06c361a18690c987cc7fa44b19d01e7dd7bab2119d55cd4bf112f79f375b54f8a1b6f1e8c51a0b3abe2708fe1c00b927c467d33f6a65a7572fb39a85578fd375f67fec14f8893f1c3652863177f38d1cefecc41d38706d5f03d5ecb160ead5805336e78ae1af1ef24ca86d507368723f71056794a2b999cddc975712245c213e221328a2ba8c5ae14e8639f4aec34df7116045d1e0a17ae5386c242d502c2f3242eace9f9aa33ac862f77bca6494ad7c531aa32c1aca70c702fe52c2a2c1a5ad43c8614dfb323edfe00de127b741e5c5f8000d892d982ec6782cbe4d183257e8715a52fbcd845b684999eba74c769661db3049de41dd47e523b79685d79f41286ff5d165b462f1d33b8f9ed5b6660605ce65b63172412061cd0a055be6414019ded66443d52ad6fef801f4830e33526399b4ca356cfd67e4bbf9ce7641e70df73a0141975fb8b7c0a2d71140904d7dcda3f8851bf8a207189b29c25617543a07a7ab3788c2bd6a7ddf531d444a1b43d5330d2887bc1271386051dcca5607caad836b0b8d9472e133594f2506c8edd3052a79085827e32d682fe13941563f0f8d888caf374909265ad5ee869094258212f75a1fddd931d511992dbce5bb4ec52ea7bf0b9bae5be67117eb45d7d7d523e3190b4f814eb77ee410c40e1fd5820747546b69849ee6514cb29eff5554c3d22e1fe0ce7114f540953f1b5d780b0486449950df22ba93221ad7008424308d6358a3704a1b449845669072ef58a5b68f40147af8231ccba2ab4e2751df1bbb00085ed112a7148954e5c5e8cecdc4b5f0b1e33de3351ae93b1241e04fe55dbaf1c8df079e0731bddfdea75cd41573c703ae3d10eaec247d6e4c217db27543ca630f12d6618b2437508aca230cef127971938db02aa57b782ab448888faeb19048c18a2d3b7b4c179581b3cdc1953a7f6f96b719b0f2e75fbf6359f1fe1890f4cb4f8f1f064a4a891ed65958b4bc1cef84a3f36825a15b326939229f1b7c4897f99bcf206b3b65f29ea7274fef2704dfc2605d9438b556cd2cc1eb0986bc356219c70df8d22da60b3e45baa768292cac53480f738a5ebc6b1a64950bf3809f9c37ff97f4a4c3a14fcc1ae39b775bd0efd01428d41d82c8b2ccceecf4333cc4cbd9f03c42b781be8f0a495c2997a9edcc73b9e900b02173718c0feccb52a28ddb8cb439c5c7254978ac06ea601c08f3f7a824a951a6590e1bed0257e0384f1b20a10252d53713472190ed15dc09ed005f4e808060435330603b9d3b856a8d9979c0eb747ebf946a9b73b4d39a239f7f0eccc36021d1b3348b9681f9de1115342a1aaa7019a2e9d4f4d29863fe0f343977caaf03d4990cdde431c279749bda1c247fe76bc07c5a14a6414e64a607a4f48ba3f20432642ad88213f1ece7ce8cbf1a95cee334d60aa366223d35ff207ecc6683976f3d3193fd25a257cc420513554ee30598764efc07d11ee3980794e775bb71c8d7b8ccd7f3533df68e7d2f17228b6f76172ac7c8ddae5baf844ea02ff5c17b363b4564389d449551e785193353676f81ad72a7e15e23f2bf11a2d1a399c6f3b22c082c49fa57166b0434f21fa8e659b3f8eae83289aba1136c48e11967c62c9f94334f5354e83da6fa3f4dde915cbb829914351a17fb4eda0811410ac4181ad41c8c4c7f04edd028f0e77217d7d606961f8eb07fc23064d8b9c73b12b1a634543bbc52601283a7ea1995dc459191ce002aa216df7f35615a0598598aa18ac5319992c2a73d77ef98575192ba9a8322834faa9a38f3d4863339c55f4f3972ce8e2b79dd112eae87fcb5c95ba8bbcb867da56e7b42a6ad919f56293600a40697f82fc2551c6aa2cbd20610acefa003b1a4e1c08248803c940844730cd22df38677ea2ccb6e6fd5e30036d92d3668f3c0464881367517f04c15ff77cd508c1f42bc5a4ad243c116b78184ba34a3bdbd4edd8062a8982926e36d916a8ef52db205e65a71568c17a50a742d1cee993ca1479a90120524c0ee0ce6266c4bae96e81aa6537a04ad820b683b1c8a01397be4c69cc96131f1a9bcb611b03546c082e63b6a1cd324661a30a91841294654123e6346513a4c69d98d9074706387897476145cbbdee48d5e587e6160b1f506200c46b8a4be24a345b8cadc2ddf4e1e777873b4adeceed2b6fd739f63c0fc73b29c24685c57989acf539e876f5ee13d3c9c4934e523b1cd3610a8e8585d963d4c13fd5d9fc935a9d0c1a8179aae1501f4743d7278ef08b92ee6a9d574b627435d836a5f3d7cbc64fc6d3c7751ea00090a2258aa9a877ec198ede3f84af892fa3ecf113f036667c743ee2d2c111f006eaa848de2628bbbac82e1adb7b91f2165d9e26eb3efdc9ac3a3ed1c90120bb8cd4eaa7a4b779477a4db47508e621c6e7279f8c7fead38aa6a7190291a902b6c6d190001f511a4c146e080e9fc4422fd281bb03529ab7432a798227a769167e610ec58d79c9fce50ec66501276e96aaa20f0c2840e8d8be2913cf9e6d617b9e8c4292ec3de4d0d0d2378ebf64bf0abdc4f05e9a9be664a526d3ccac50dd689631f8a259cc98e5ded2f0bec288cc7d2f3dd39ad84a8d3ced964a483ea1dbbc8de54295f69b02de86b06b4044fbc79cfd3a71b3a584f4777d7bd9904fccdea3842069f3e37bd750295500b53000ff6b03aa1647ce3199cdb1e52937adf58bdfef7299e211989e972183261265766e1dcb01b7779c4ec16df03a639e461b917f668f338c5ddbe98e6a2d12aeb994fb33665c7faced75f888cad5f1a58605038bbf715ca5c4d07ee3a0af9c29da545ba66c279e0afa580ed95a62d86871d741f805e2aaaf9ebf55f1835751fe0c667deb6cc970c728e5cbea49934fc7636a03453e9cc84a03f46d1d45cfd25c948edcb4ea277942d2d2ed4422eb89dc7f374e3101d730767739f642faa3e585e7efcdbefa35223b8e2f740ab7441f60385eaee0337aedb758a3693a72b2cf92e6d119469451677d2cc3cf81c2df76eee59cfab7748213a0435f2d1f28c5ccaeedd45aae23c70e48f0cffe2fe059d42f4a8bd2204b425d9ea970f7788260d89cec29fb0f5234aab238af7e9aa89c33992b86f84be73aaf959ee44e58b6b7ce8e5cb1e1ed9a2e49971cdadc97c1c7c0b2212dd3743e779ca3685063fab308c907f7d8ed662c69abb378ea5ece02b1cf5b2a23d98e3259f1a71092676eab7ddcd0267e61054e3049d39996fbc6fbcce2113a774cc2b1ed611f4571e7a2afe45bfa362b450715006619ddde58c6805c4b5d8278838c3ff9a33ba4f534b870a3a2d77e6de26b3ff3b74251f3271190aedc8a2e9ae9c80db393bad6ae9379b5d01d6fc161eeae1bc945d86cda537c2966ae6536010d43894955f03295da361757f9dc21c3ddd52ff1d68a9d60dd01a361c0b97f29f942d5da8c48d9c3c403332089433b72c66a69b0aab8f45737d91ea3027dcdc083c79b1b42c09c5fdd09dc403d44f3e19e6af7c324acc82d265ddd04b4c333f91464a2adf04cd17e22fb2cd7a72404d31e66e1d48e8b92ab7ca3bb4d4f4e301342bdce04ef1fd9c06240a403c1387edcfac9d862412c5638b58475ea4e831302a4938358e54647c6a1a764bb79a801451f6a3e7bb4f27efa72737447db72d77ef42a9fdfa2dc52bc06c8ab6fefaff92edfd3cd95ac57d7ac3a8ae6bdfefa1542a0cae653f7b78626fce19736a373896be22a245357671ff4fc3172066e70f30b9dac186943b92cd63796ee555c64ae34df577f0a81d648f1a55997c58df296a18c89f0a48c3c214108fa009f6d59f44242a877494f1b4eb9e92447b17fd63fa2d32a7bd88dc050fa85dc585a83c346ed82817b22593f444554a77ac6855b50640a1cc0e4b6e112e1bdd4ba1fce9e3788c50287cb96c50bde9563b11cd41cbe2338901bd1da4b9523995d4924fd66b5d070951757ca28361f2d322677705bc8c9fbe8043551cca46ad1c1c5d4d5b73a787321102fca6a50a215648cec49045b5c95dfa5233e60df80799d2fa746ac5785b5163a1e632c9e8dceeb0a857056e60597f0a31d113810a5e5b1254892521cae4a10f321aa478444cfd831d7cf3a14333bc890166d70043a4c7256177df981a8eb72dd4e7dd34a71d5c4a33f48168186aa51f1b03ea92a4c8214b0ca9f76c255f068602b54b15b1394b762d3f212951bea56a7d6cb5d0d124714f03c6a3300bb1bdb8faa730f18facaeafec1de34c78c00702fa2188658dff7e8270603110299ee314c404340f936073316593957dcbb798b057b01e743438caec716ca0fd5cd22f04454bb64bfae9360ced000491645a505c7b98a2d088d9167c6b3e3bf20abee4b04a05c0e47325936b4a5fed06d4d955f84254ab394975314d2df19f495d854a86ba06984421ec194a0d278c3f9cff99fbe3c3b8d29e3c73dff4d6a69173b3c48b967b47ad4a7ae5a2db3f7477e9b92f99468936685d1f566341f82186f53cfe098bd75b6e75e6c5196588578fa19e31131ab330a3531091d48e0f69152b077eac82f3287353756165062746356927c2e9fa2ec028d3a6580c8f1d84bb0fe897924a074f575f6eb756f5d89a6cc47232276dd83171f54f505cb28ae34c7f3bac3ab649933f4dcd6bccf7430d37b0e53abef0eb599f79be237cad6b19c748e0e503b9a7146f16c716bda7c4e2d5ee84a595f6abae029a2dc1cd5992439d603c92c18446b6ae34fa4e101c6af92054a5bab740f509b8915bd84ef86b86ccaeffc46d358db737e065cc7cd28db50c720a406fcb53c91fd7ea37d8304af1e036256397b5241a540dd1658e00873bd7b54b5d62158aad92185de760a974c4d0de3556823f2d269ecf7af9e209bc798b1ab53aea094b02df91a373b297b7565973ef52fdb0cf868439db8e9b88c6ced779c809fb7bc4d2946d1318ebe3679154ff510a5df173a47e9b9296dc96f3f43d219e4dacb90cdca8ff4cf75ecc60b43a79afdc6294bdb534b24da6533e8e54ebb1a34a0e7bdbf6dd4c79ffe9eadc3a002e2a53f0582953da8861b8cba715f4a3042d4e863d88a178b003b9a05b60b6b5feff3f0b42aaa814e79890b3f664e045e52c8bf873942e14543bb39e49f1007053da237f26b7bdc4b0ae7530913b0a629bc9838150276a3f40edaf75b481d3d1becddf14c39bffaf7fff2c1f8e828d32eeb43bf65242c7ad64b1d8a3e81112eec2f36bf5fe34a8bd43726c976ffaa0f41361a32cdcf5feb35706ebf6effa281d93d5dfb7f925c7c24e96a5b79036ba3e8db7f52cbf35aaf0f50d4c2308d03a6bdd58445f95fd4a347069cf26913c6f5379933a47a3211776fbaec01f6b2e212de4379cd7d367fac28897a821e856c578a2c65517fe7d867dc8df702edf3519a79107c885612342961300b32f68768f5cd616c862ae242b4e513ff711f2052809b4faddb982312ab95654bc6669623f6cb9136dd9d6555ad877fc065c405fbb1f58a5c393a4438f8a74534ccf6184f50b37207e7521ddb5e145570836d16f3ab27e318804d47bd4b33c140a3029516ce5162966723f903069446b8a8f544cb42d86528d2538d7eb32c435040337306919d7b9028e9d8de4d03a091bb7f915dedc0dc8ce8e6da8aeb0be210aeaae459b28d28f282f1a481b821f0d6a3fbd7f1c518b022b48992ac155aa4516021e942c8395241ab6719e64b7783ac2bb5e3e9d3eac0ef794281c42a64db73585e6dfe5902878232595b489f8d17c3dce3e26cd61288f003f110f9525dd6fc65a8c1bfdee3d7cfef891bd546e90e0c24698c50aafe8ede905257bc8b8f7cacffa90ee2b9b618afdae3de3bbd74a5c8a572df9c7ac8090a4efcf3d0a06b648669bc1d4bf17fdc7d1bf3425881c5059c87a30f5b79c92940f499005ef60d31f41143d919048fadbb7b7bda08d98031cd04fda6567cb8f671d76538d9da8345c04ba130652c4d6e9c95bb52e72d8059a7d99497f08c9fcaf03e7776523dd491bcfed0d6ff69d083e7f09d8469a4be78d8bc508dfc02f1e45f4e3ed9f5a25d41dd290c1c32a3a2847ebffa3ac300576aae59f24a954a6e57d3f4f84d8151b4076ac82665a0ea0c86a7f9115dc28a3ce34d6775b465611d07af445be5fa05a897850edef3bbc81cef43ac80df37c378aab2f8e28d8120694ca66289c50d963106beb146e95490734d749bbb2c49525945efbf670aba9ff7487ffe7972d5c422738ffd0c22aa722dcfa728a5866b30c368420e7a01ad326c7119d2fbbfa77dd80adca8f2360b387c386faa62f12524f322d5ee15cbf1d9ae1238eec586b28293d353c35bf0a914b19b22fd600837945b46ef80f20b04de7716e5d62cb85e48cc33c6396951bc7149a35d5e040982ea2675273cdbacf1822d6f01a8462a4b3f1a1cb44a7059d49fb732e9593b872563d9deefefb327a748d8098c3d82e2fe4ac46f213919d3dc2ad12ec87164c2eb1b78f133bba3e513d8f911181621a7cfd138423b17556d9263f625b618c74ee90afe891b73098460fb427683c9172d137caa977ad6ebab93f14b28613f60be6871b9bab80fe12e8a75b231b68bb37d925b942f3551a4f308cf5c8008c72e9ea3f3e21e187da1ad73cbd7a14c538c46b5621add6246f1d7980c9ff363da112d39469ab8bf67ecc087ab650d9be309aadf139584ba5f0ce082cae5bf51c77c21eaf8973c3218878f9c134a9910ce2dedfc65b833f587d03c065c024942f5e2b8f48ae80b6c11638ee45d25c91099d07121126000759ab5c4cfb72eb4b8decab6abbec1f4fa5ac32300cb3f6c64c82c9b037c4f188bf9da701fe84c1ab53092eced7c9aee69ca82caa6247a4e43c3c6542f20eb77568f8055b196850aac10eb7553c75e340675957a36ce9088c7791973ad33edb88dec96f8acbdeb949eddace60acadd9d3e3c1e65b65d42e22d0ca4cecac1ef63604ffe7a6bda658ad6baf8d09321ea117560a836fd44370793653fa0a8e6d084b33c1e01d4b9bf96c6e28d841f48c8d9590d8a99d06af7639a86c3609cc35b32e9e98454dc73ad034690214f75da4d63aa47e5c3168fa9e73e4d3d474efeabb5675b77a194a076becd0c5795776839697562f7fa54977075cf0764377eecda40f4c7f0c82124ac479244264418c11792d33294cb4fffdf9dd25a5b101a7e67eef825ff80754d1419df5df648222f8de777ccc37e835435fe0c378f8bd5e34c2e76977f60ed17ff7497803850d469d59469dca2253366a28c60c769ee5e07e5e450696577305859cb65edcf9cb69c949ae49e41e8ac16adc95080e97582a09a963d6b2749b0b41737f041cf529187aaeceea4e566add29d1c4a6a771c7254c7934abade89317a1b32aaa628356c72f643fc5379cf1eedbd0060309e65d8f30b1305d7cfb1bae60ea264260c48f3fd14e595b504ab4454e63462bb3430b2b6fe751ced4646570ef0c0dc8dcc6077b2ebf738e96cee8fe194455939c8802698dea9e983bc251eb5015dfe1cc802a2e525f0d990185b4c64954a94f0d6a4fe2abeecee27c4eba28a63be77e83a217b89883f4e5cab1cf4b04a5c07857fceb6276a3b32bff1f4f2850caea84f468ccd1b13946c011ebefb88d17a70d16591d7d990973475f322ffe86c70cdb66082a8f8d91e21dcd126c1dde4ccacc0a9e25e7cd7350d0823668c646f56029eec5a64cc66591b4494ad631201c64dd1cdb32d9ee74c4cb1a6ef5a13074203c4341a5d3107a29752eb3ce772a3c995938362f224264786189796e43a08d4f19ee309114392ab5deb6bb2cd0b28540d06c4e31ad73867e804484f7ed3538f0d5017206b0bd78755edf80f3421c74ff08564d39c702a6ae3671706cef5359580002ccb9ad48bf5ce5a07f44315b88a002420e084709b89ca25bc6f71b61f445f52de0503678e06f60e82d7896b8aa9131151df5d81c56572c10fd3d19cf16a319205a9014058a006ff6f64593f40e71b3d08f076845b98404128286b3731882fb1ff36ed24424b4cc18766986e8fd411bb389e9af81b49177d96a9b613f579da5a2e42d30ea0239b405e58d0deaf7634171d0499f4bf8aabb42c50a089b7484c4adfd3eb036c816b9c876601241f910c841d17b29d6f28862e155a0052f9c3640f3e85bd383ef54d997fd7c067126f40188a9c453a17dc2d35050738788c014bf9aeb45bdb0fc040a3dae9087843b7a7d61f736710c7246843faf1b159429555db921d3b6afbab29b487f99e22ad23a223ed953ef0558d3eaf690c2feeb587b53e85cd4f7460cc94dceef788abef63fc43585fae5c1ba451989b98b955b923ef28772d5de73791519800929ae90c966d2108f77be48d537f7f976bf526d422a3825f79099425dbdcc692bac4312a1816c573e6585d1c7848983d0f778a4cef8fa42351eb600d2abcfabbcf4fe884c524182755343a65ed4649e016fe55b38c5c4ad656a0fef36c5ff6d7cd2364a866a15f87e6d8efa4ee4ae17704f22280e3dd7021c13b0790cd53175a165355fc7fc818fc8fb947d281a81dfa6950a5e0946e667ff1c8408fc9b145900d8e71a91f9da8d2621627bc39e0cce4a714ed35affa7b0d602ff5f74b2e4aa4c165e1179b0413493bba42354bb21f021237f4fa51086f6f1a4b8926c68f2686efde9f3189a6eb7b0628ee7136c45bfe19113c5ecf8793b2baf64073cc4001c04ed6224adcd6dbe6739f80ad25150602f845d82fddb2b4a70477eaf63681b656fd07a86ce20c1d5077d3702ac7d8db563bee75d5b1b4fc18445232d29f4c477b0aaa668d8f36699b31331e8d7c485b8d6f2cc753d24cda807660b9305def828e7f88d8052c16d69b1a183e5592d7233224cabe76f357177124550ccdd8caad9e3a494a6db74f6ffa6acefbd37e8faafdd31d69716b3ee5922fd82a20343c8fd8f52cc1a0a7bbaf68f160bf007298c0a6724271cab4d800a7d9d074b12260a7bcd7fe613308b2559ec10def2753129826c019ad891456a599f97dd0a8bc629410912ca781ed51c5e74de646f73e6feca16dc5c1dbf20834edd2bc2f50c19d613a8cb4c6406781f4e533b0aff13084f8df3555d0834cb3e24db0ff2f41d1d3f21e7bc81202f56ef7e6607d169c39c6df1d9538745e9fff829e09a0f910e9a5d315501efa46c12d4af8587fe660c95154cf1c23b56635217d77577c7f9be1ff52c514df03229ceede0233f5048e82025f8a63bc3fe857dd01ba2c5844137b3a410257f2f318fa766a3b8c03c1186b927b724fdee1150e662a832ca1d91fd44de3c5da86e0172b6eccbffa626e487033d445b1d301432ebe23b03d832312482878f6706a73ab41b1c0c0607c78d44ab949292fc5be0ff9594dada1fe7340a78502bf712290a24c4d39abe18e57f72d6f268823e8917c07462602b43a0b31c34f0fe7a3182465b849b07b8379d2b8c8cd5c2cff07f283e4502f8b3f75329e7a8748ff0560c28a3defd9e19d7d75b309343e1b34a0363b783064e1297c0f341bf588a9753df9d7d664b8cea83cf99cd1f7d157801188b792f96d480152ffda80398b36c1891f77dfbb39455e323846e4bc043785d86ba579b028858e153a808a8423dae771712cbddeec0e1a37a0c11bfe5f9d60028c0d54eaac1491ee9eb6adf9483b8386cdc02c9b3d92e4c5d87bc5ce1c8c88182077139432fc35f8bf5c382b7d33d833c50209cd004c49be28680932e6b79c745ad6d5247fd84e03fb78a6a2f8952c3d350b565a0edf93889065ca671984aeb44323dc9dc4ee64902bb1e00e12157c4db2f6cab8ce09acb961afa48a58446a678b19f6d9edd8e6f3880cd713dec1c5003fece8c9214518e2afb7fb2b59529c71c5a50c99352bff9432ef3a34da9d4cbc13105c45c100538fcf17a891668c889b91200e0934d5b7eb2f8c6fd60712742953c36ea6b1a4fc7e1403f71077c8cb0a58fd7fc94c9eb7b26ee44b4d123918e03e064263ee7651bca931f447eccd4d8ace1662ad79bdd80f25446c2a8f3e19b3fdf94620952f79511b0eaf5d3872f4b7e5038e0628ddb50440c12e5e4eb6d57c37ce56cfab5eafa6e7c65053783b618962d07d549146e595ae4761a3912d9d7cc97f76bacf0ace92aadeee7664d50c63241dd99d8ce02cfc7aacfdca5441671be9f28a8aa7c34bde965f7878db559201c6d78e9d0f11aeff961fc4f6cbf89124e0e792e8cc7af62b130b8aa6b28ef1b7242dc651413d8b622cce56bf39c5b483074add091d6a45bd8a63576e065d8a01b9762344f1dae45dac3bfbb0ecb39ce206e75151d819dbbfb7bd95dfa8e81e2d1c0959abfb74e59683a9739ee78f2332085f52b342e1c2649db0202b9a721d52dc0ce3bfc6028e78de5182b60f5cc9a80ee7f01076f4816c3d5ffeb1874d58136d07b260f069c5e0b064df19884e50f9d55f5af31b65d57d26ae78d816408c51ad4c5cd16a83cd333594f3955799bb2e9ae6fe1faa1c927a9a7d68c544d285d177aecd253c67290b5b5c1858af9c9305b21fc1ce5d8b49b61f0bc22f746cd6a537a39970dce09c2ffaed8ce20d4b8105fd1c3bec1746e26057aec542b6e0f9aec5511fec1331aac9af4e9a70940b36963103e2e68bbf8bab41cf93434600c2b4749904c6109217e9167df1225c9e153e15e1b3f8a03b4c07b29b4e856c3258d73cd9978bef0a2fc48dc8c621ae6eca8ae14a42df29bd5b9f8b3aecf907bf2dd119f24b52a69486ea4a78286c219fa8706c488a3be95fc01fca255f76f266871f1c59d05290ccd6df0c72cce285549573cfaf0e94e58aef790c22f7d45ba34e570cf3177c396b190a9b3471b0acad51f7e9c97e6b51f44cb936b5121bce8d2689ab7a15aa1b7d06e22038f27963deaf110c31b5fb2bffdbd0f4d17441142862412cc09344142a8c5a04ec6c14edc9b22db758d23187d18518edd0a131bcb7c8f9008728912dc31ca149b2a01363dc9d9b9d842e8afc8158dff47a6f0be510bc6e84391de527e514a847aed0f6e96dabb954074a7693039c1bff2284d427538315c2df1397a69cb119463e9f1635a7c83599226e0527f20dcfadb087cfdb8da5d0f1d9114cd7d834ad5d210324ff6776dafe44853a9745436a24d2914a8b5afc9291aeebfa0ff7b918f71c2cbe58e1b4e14474bf21c2fc1439cc6bab3f95eafe7ef0b5872478ba1e7e59ccc4b13577844d288043c2914dbb368c8d9eb6c0583995736c7620fe39d65d72432578a8bab90839206a1ce2565d23e67c352527476f0f619fecb253c663bc273948c262b74b628855090a58c78f41d5452c49a57e133b8f87f3b04e1f4b0544efaf2a215b7fbb44e0bdc7bcfceff343c9ea2dcccbcf92708fb3a633d20e55c57b8fb2c58d63810d7fb3c148b4b79ba6e7cd167465e1dbd6473337cd890c01cb4d9f5d66ee7c99d38183f6df06fa0b6d0f8a413ffe189d06af350192e30fc8aa211641f0e0f9d2a76aec9906a19af17f27071194c75100e0f5edce561bafc3a55bcbb3452ad0b0c862d8e62c984879ce026817673d1dbc08bd82df6a691cc2cfb09f3c8ab8111322cbc366db71c3189ec557b4a978e1776442d10ed8433aa3e748858cc43901904f0f51a70d960b9a570406070df94a97b79721b9517f97ac09d9c5c57e27445e8fad05e96504d2695604955f8c65bc8fa8408cdb3e1014da7928cc9ba01649668c47f7c9b8889ba1402d384c659eea3e146f8c05c0887682a55b64ca3022c9cbeb208b4428578c84e181cb502650e5676f08b3d7f40704825c22c83cc4ecf660d437db95b2b6d9841cf5e182c0b5373aeaa47870379b2c1176e45710c4c074b7116d0ff12922fe2001",1]],"callback_url":"http://127.0.0.1:8080"} +"#; + + // Just dont crash + let payload: ComputeRequest = serde_json::from_str(json).unwrap(); + } +} diff --git a/crates/scripts/update_revs.sh b/crates/scripts/update_revs.sh new file mode 100755 index 0000000000..2b081cc264 --- /dev/null +++ b/crates/scripts/update_revs.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# This script updates all cargo imports from our git monorepo. +# Some of the time we create user facing (mainly) cargo projects that need to depend on a specific branch or git revision to stay in sync. +# This script will go through the monorepo and update the rev key of any imports extracted as a cargo dependency. +GITHUB_REPO_URL="https://github.com/gnosisguild/enclave" +EXCLUDE_PATHS=( + "*/.enclave/caches/*" + "*/target/*" + "*/node_modules/*" + "*/risc0-ethereum/*" +) + +# Build exclude arguments +EXCLUDE_ARGS=() +for path in "${EXCLUDE_PATHS[@]}"; do + EXCLUDE_ARGS+=(-not -path "$path") +done +CURRENT_HASH=$(git rev-parse HEAD) +echo "Current git hash: $CURRENT_HASH" +echo "Target repository: $GITHUB_REPO_URL" +echo +# Find and display all matches +echo "Found the following dependencies to update:" +find . -name "Cargo.toml" "${EXCLUDE_ARGS[@]}" -exec grep -l "git = \"$GITHUB_REPO_URL" {} \; | while read -r file; do + echo "File: $file" + grep -n "git = \"$GITHUB_REPO_URL\|rev = \"" "$file" | grep -E "(git = \"$GITHUB_REPO_URL|rev = \")" | while read -r line; do + echo " $line" + done + echo +done +echo "Press any key to continue with the update, or Ctrl+C to cancel..." +read -n 1 -s +echo "Updating dependencies..." +# Perform the substitution +find . -name "Cargo.toml" "${EXCLUDE_ARGS[@]}" -exec sed -i "s|rev = \"[^\"]*\"|rev = \"$CURRENT_HASH\"|g" {} \; +echo "Done!" diff --git a/crates/support-scripts/Cargo.toml b/crates/support-scripts/Cargo.toml index 97e7d4672a..0871d64d72 100644 --- a/crates/support-scripts/Cargo.toml +++ b/crates/support-scripts/Cargo.toml @@ -10,4 +10,5 @@ repository.workspace = true anyhow.workspace = true tokio.workspace = true duct.workspace = true +async-trait.workspace = true e3-config.workspace = true diff --git a/crates/support-scripts/dev/Cargo.lock b/crates/support-scripts/dev/Cargo.lock new file mode 100644 index 0000000000..eb401bfa9e --- /dev/null +++ b/crates/support-scripts/dev/Cargo.lock @@ -0,0 +1,2729 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.9.1", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "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.104", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "e3-compute-provider" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?rev=9e30ebad27cd31d58cdc0d4ff8609c2b2aa1557a#9e30ebad27cd31d58cdc0d4ff8609c2b2aa1557a" +dependencies = [ + "ark-bn254", + "ark-ff", + "hex", + "lean-imt", + "light-poseidon", + "num-bigint", + "num-traits", + "rayon", + "serde", + "sha3", +] + +[[package]] +name = "e3-program-server" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave?rev=9e30ebad27cd31d58cdc0d4ff8609c2b2aa1557a#9e30ebad27cd31d58cdc0d4ff8609c2b2aa1557a" +dependencies = [ + "actix-web", + "anyhow", + "e3-compute-provider", + "hex", + "reqwest", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "e3-support-scripts-dev" +version = "0.1.0" +dependencies = [ + "anyhow", + "e3-program-server", + "tokio", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +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 = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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 = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.11", + "http 1.3.1", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "equivalent", + "hashbrown 0.15.4", +] + +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lean-imt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2acc6dee32b12409446a76b9c1877e5ba9afb36dfcbe96d0ddaf15ca08f18d" +dependencies = [ + "hashbrown 0.15.4", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[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.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "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.104", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2 0.4.11", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[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-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[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.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.104", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/crates/support-scripts/dev/Cargo.toml b/crates/support-scripts/dev/Cargo.toml new file mode 100644 index 0000000000..835f632e02 --- /dev/null +++ b/crates/support-scripts/dev/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "e3-support-scripts-dev" +version = "0.1.0" +edition = "2024" + +[[bin]] +name = "e3-support-scripts-dev" +path = "src/main.rs" + +[dependencies] +e3-program-server = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } +tokio = { version = "1.38", features = ["full"] } +anyhow = "1.0.86" +e3-user-program = { path = "../../../program" } + diff --git a/crates/support-scripts/dev/compile b/crates/support-scripts/dev/compile new file mode 100755 index 0000000000..2d1790b485 --- /dev/null +++ b/crates/support-scripts/dev/compile @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cargo build --bin e3-support-scripts-dev diff --git a/crates/support-scripts/dev/src/main.rs b/crates/support-scripts/dev/src/main.rs new file mode 100644 index 0000000000..c721ab0e56 --- /dev/null +++ b/crates/support-scripts/dev/src/main.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use e3_program_server::E3ProgramServer; +use e3_user_program::fhe_processor; + +#[tokio::main] +async fn main() -> Result<()> { + let server = E3ProgramServer::builder(|inputs| async move { + Ok(( + vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5], + fhe_processor(&inputs), + )) + }) + .build(); + + server.run().await?; + Ok(()) +} diff --git a/crates/support-scripts/dev/start b/crates/support-scripts/dev/start new file mode 100755 index 0000000000..babd5eea76 --- /dev/null +++ b/crates/support-scripts/dev/start @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cargo run --bin e3-support-scripts-dev diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 3d78119549..595f2599ca 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -1,58 +1,26 @@ -use anyhow::{bail, Result}; -use duct::cmd; +mod program; +mod program_dev; +mod program_risc0; +mod traits; +mod utils; + +use anyhow::Result; use e3_config::ProgramConfig; -use std::{env, path::PathBuf}; +use program::ProgramSupport; +use std::env; use tokio::fs; -use tokio::signal; - -async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { - println!("run_bash_script: {:?} {:?} {:?}", cwd, script, args); // Delete this later as this exposes - // credential information - - // Build the command using cmd! macro for cleaner syntax - let mut cmd_args = vec!["bash".to_string(), script.to_string_lossy().to_string()]; - cmd_args.extend(args.iter().map(|s| s.to_string())); +use traits::ProgramSupportApi; +use utils::{ensure_script_exists, run_bash_script}; - // Note this will not end up on shell history - let expression = cmd("bash", &cmd_args[1..]).dir(cwd); - - let handle = expression.start()?; - - tokio::select! { - result = async { handle.wait() } => { - match result { - Ok(output) => { - if output.status.success() { - Ok(()) - } else { - bail!("{} failed with exit code: {:?}", script.display(), output.status.code()); - } - } - Err(e) => Err(e.into()), - } - } - _ = signal::ctrl_c() => { - let _ = handle.kill(); - bail!("Script interrupted by user"); - } - } +pub async fn program_compile(program_config: ProgramConfig, is_dev: Option) -> Result<()> { + ProgramSupport::new(program_config, is_dev).compile().await } -async fn ensure_script_exists(script_path: &PathBuf) -> Result<()> { - if !fs::try_exists(script_path).await? { - bail!("Invalid or corrupted project. This command can only be run from within a valid Enclave project."); - } - Ok(()) -} - -pub async fn program_compile() -> Result<()> { - let cwd = env::current_dir()?; - let script = cwd.join(".enclave/support/ctl/compile"); - ensure_script_exists(&script).await?; - run_bash_script(&cwd, &script, &[]).await?; - Ok(()) +pub async fn program_start(program_config: ProgramConfig, is_dev: Option) -> Result<()> { + ProgramSupport::new(program_config, is_dev).start().await } +/// Open up a shell in the docker container pub async fn program_shell() -> Result<()> { let cwd = env::current_dir()?; let script = cwd.join(".enclave/support/ctl/shell"); @@ -61,26 +29,6 @@ pub async fn program_shell() -> Result<()> { Ok(()) } -pub async fn program_start(program_config: &ProgramConfig) -> Result<()> { - let cwd = env::current_dir()?; - let script = cwd.join(".enclave/support/ctl/start"); - ensure_script_exists(&script).await?; - - let risc0_config = program_config.risc0(); - let risc0_dev_mode_str = risc0_config.risc0_dev_mode.to_string(); - - let mut args = vec!["--risc0-dev-mode", risc0_dev_mode_str.as_str()]; - - if let (Some(api_key), Some(api_url)) = - (&risc0_config.bonsai_api_key, &risc0_config.bonsai_api_url) - { - args.extend(["--api-key", api_key.as_str(), "--api-url", api_url.as_str()]); - } - - run_bash_script(&cwd, &script, &args).await?; - Ok(()) -} - /// Purge all build caches from support pub async fn program_cache_purge() -> Result<()> { let cwd = env::current_dir()?; diff --git a/crates/support-scripts/src/program.rs b/crates/support-scripts/src/program.rs new file mode 100644 index 0000000000..cedd6ddf6a --- /dev/null +++ b/crates/support-scripts/src/program.rs @@ -0,0 +1,45 @@ +use anyhow::Result; +use async_trait::async_trait; +use e3_config::ProgramConfig; + +use crate::{ + program_dev::ProgramSupportDev, program_risc0::ProgramSupportRisc0, traits::ProgramSupportApi, +}; + +fn get_mode(config: ProgramConfig, mode: Option) -> bool { + if let Some(m) = mode { + return m; + }; + config.dev() +} + +pub enum ProgramSupport { + Dev(ProgramSupportDev), + Risc0(ProgramSupportRisc0), +} + +impl ProgramSupport { + pub fn new(config: ProgramConfig, mode: Option) -> ProgramSupport { + if get_mode(config.clone(), mode) { + ProgramSupport::Dev(ProgramSupportDev(config)) + } else { + ProgramSupport::Risc0(ProgramSupportRisc0(config)) + } + } +} + +#[async_trait] +impl ProgramSupportApi for ProgramSupport { + async fn compile(&self) -> Result<()> { + match self { + ProgramSupport::Dev(s) => s.compile().await, + ProgramSupport::Risc0(s) => s.compile().await, + } + } + async fn start(&self) -> Result<()> { + match self { + ProgramSupport::Dev(s) => s.start().await, + ProgramSupport::Risc0(s) => s.start().await, + } + } +} diff --git a/crates/support-scripts/src/program_dev.rs b/crates/support-scripts/src/program_dev.rs new file mode 100644 index 0000000000..fc7b03e4c9 --- /dev/null +++ b/crates/support-scripts/src/program_dev.rs @@ -0,0 +1,29 @@ +use std::env; + +use crate::{ + traits::ProgramSupportApi, + utils::{ensure_script_exists, run_bash_script}, +}; +use anyhow::Result; +use async_trait::async_trait; +use e3_config::ProgramConfig; + +pub struct ProgramSupportDev(pub ProgramConfig); + +#[async_trait] +impl ProgramSupportApi for ProgramSupportDev { + async fn compile(&self) -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/dev/compile"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) + } + async fn start(&self) -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/dev/start"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) + } +} diff --git a/crates/support-scripts/src/program_risc0.rs b/crates/support-scripts/src/program_risc0.rs new file mode 100644 index 0000000000..e06d44c234 --- /dev/null +++ b/crates/support-scripts/src/program_risc0.rs @@ -0,0 +1,43 @@ +use std::env; + +use crate::{ensure_script_exists, run_bash_script, traits::ProgramSupportApi}; +use anyhow::{bail, Result}; +use async_trait::async_trait; +use e3_config::ProgramConfig; + +pub struct ProgramSupportRisc0(pub ProgramConfig); + +#[async_trait] +impl ProgramSupportApi for ProgramSupportRisc0 { + /// Run the docker container compile script + async fn compile(&self) -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/ctl/compile"); + ensure_script_exists(&script).await?; + run_bash_script(&cwd, &script, &[]).await?; + Ok(()) + } + + /// Run the docker container start script + async fn start(&self) -> Result<()> { + let cwd = env::current_dir()?; + let script = cwd.join(".enclave/support/ctl/start"); + ensure_script_exists(&script).await?; + + let Some(risc0_config) = self.0.risc0() else { + bail!("start must be run with risc0 config available"); + }; + let risc0_dev_mode_str = risc0_config.risc0_dev_mode.to_string(); + + let mut args = vec!["--risc0-dev-mode", risc0_dev_mode_str.as_str()]; + + if let (Some(api_key), Some(api_url)) = + (&risc0_config.bonsai_api_key, &risc0_config.bonsai_api_url) + { + args.extend(["--api-key", api_key.as_str(), "--api-url", api_url.as_str()]); + } + + run_bash_script(&cwd, &script, &args).await?; + Ok(()) + } +} diff --git a/crates/support-scripts/src/traits.rs b/crates/support-scripts/src/traits.rs new file mode 100644 index 0000000000..9d260e3678 --- /dev/null +++ b/crates/support-scripts/src/traits.rs @@ -0,0 +1,8 @@ +use anyhow::Result; +use async_trait::async_trait; + +#[async_trait] +pub trait ProgramSupportApi { + async fn compile(&self) -> Result<()>; + async fn start(&self) -> Result<()>; +} diff --git a/crates/support-scripts/src/utils.rs b/crates/support-scripts/src/utils.rs new file mode 100644 index 0000000000..09fedb275c --- /dev/null +++ b/crates/support-scripts/src/utils.rs @@ -0,0 +1,41 @@ +use anyhow::{bail, Result}; +use duct::cmd; +use std::path::PathBuf; +use tokio::fs; +use tokio::signal; + +pub async fn run_bash_script(cwd: &PathBuf, script: &PathBuf, args: &[&str]) -> Result<()> { + let mut cmd_args = vec!["bash".to_string(), script.to_string_lossy().to_string()]; + cmd_args.extend(args.iter().map(|s| s.to_string())); + + // Note this will not end up on shell history + let expression = cmd("bash", &cmd_args[1..]).dir(cwd); + + let handle = expression.start()?; + + tokio::select! { + result = async { handle.wait() } => { + match result { + Ok(output) => { + if output.status.success() { + Ok(()) + } else { + bail!("{} failed with exit code: {:?}", script.display(), output.status.code()); + } + } + Err(e) => Err(e.into()), + } + } + _ = signal::ctrl_c() => { + let _ = handle.kill(); + bail!("Script interrupted by user"); + } + } +} + +pub async fn ensure_script_exists(script_path: &PathBuf) -> Result<()> { + if !fs::try_exists(script_path).await? { + bail!("Invalid or corrupted project. This command can only be run from within a valid Enclave project."); + } + Ok(()) +} diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 6abdcf423c..93b21745f7 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -37,7 +37,7 @@ serde_json = "1.0.133" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } tokio = { version = "1.38", features = ["full"] } rand = { version = "0.8.5" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/crates/support/host/Cargo.toml b/crates/support/host/Cargo.toml index e0ead4ef0b..7dd2254e9d 100644 --- a/crates/support/host/Cargo.toml +++ b/crates/support/host/Cargo.toml @@ -15,7 +15,7 @@ methods = { workspace = true } risc0-ethereum-contracts = { workspace = true } risc0-zkvm = { workspace = true } tokio = { workspace = true } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } fhe_rs = { workspace = true } fhe-traits = { workspace = true } fhe-util = { workspace = true } diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml index 80179781f5..f15a8db467 100644 --- a/crates/support/methods/guest/Cargo.toml +++ b/crates/support/methods/guest/Cargo.toml @@ -13,7 +13,7 @@ path = "src/bin/program.rs" alloy-primitives = { version = "1.0", default-features = false, features = ["rlp", "serde", "std"] } alloy-sol-types = "1.0" risc0-zkvm = { version = "2.1.0", default-features = false, features = ['std'] } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } e3-user-program = { path = "../../program" } bincode = "1.3.3" anyhow = "1.0.86" diff --git a/crates/support/program/Cargo.toml b/crates/support/program/Cargo.toml index db68369e4d..e5d627face 100644 --- a/crates/support/program/Cargo.toml +++ b/crates/support/program/Cargo.toml @@ -6,5 +6,5 @@ edition = "2024" [dependencies] fhe_rs = { workspace = true } fhe-traits = { workspace = true } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } -e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "1bf6340" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } diff --git a/examples/CRISP/apps/program/Cargo.lock b/examples/CRISP/apps/program/Cargo.lock index 91da2bd237..a57ffe6f60 100644 --- a/examples/CRISP/apps/program/Cargo.lock +++ b/examples/CRISP/apps/program/Cargo.lock @@ -2115,8 +2115,10 @@ version = "0.1.0" dependencies = [ "alloy-dyn-abi", "alloy-primitives", + "anyhow", "fhe", "fhe-traits", + "rand 0.8.5", ] [[package]] diff --git a/examples/CRISP/apps/server/Dockerfile b/examples/CRISP/apps/server/Dockerfile index 62f6d893c3..a728628796 100644 --- a/examples/CRISP/apps/server/Dockerfile +++ b/examples/CRISP/apps/server/Dockerfile @@ -76,6 +76,7 @@ COPY crates/init/Cargo.toml crates/init/Cargo.toml COPY crates/keyshare/Cargo.toml crates/keyshare/Cargo.toml COPY crates/logger/Cargo.toml crates/logger/Cargo.toml COPY crates/net/Cargo.toml crates/net/Cargo.toml +COPY crates/program-server/Cargo.toml crates/program-server/Cargo.toml COPY crates/request/Cargo.toml crates/request/Cargo.toml COPY crates/sdk/Cargo.toml crates/sdk/Cargo.toml COPY crates/sortition/Cargo.toml crates/sortition/Cargo.toml diff --git a/package.json b/package.json index bb8cd7a324..51135037d1 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "scripts": { "clean": "cd packages/evm && pnpm clean", - "compile": "pnpm wasm:build && pnpm evm:build && pnpm react:build && pnpm ciphernode:build", + "compile": "pnpm evm:build && pnpm react:build && pnpm ciphernode:build", "lint": "pnpm evm:lint && pnpm ciphernode:lint", "typechain": "pnpm evm:typechain", "test": "pnpm evm:test && pnpm ciphernode:test", diff --git a/templates/default/.enclave/support/dev b/templates/default/.enclave/support/dev new file mode 120000 index 0000000000..b26305626a --- /dev/null +++ b/templates/default/.enclave/support/dev @@ -0,0 +1 @@ +../../../../crates/support-scripts/dev \ No newline at end of file diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index fc0af5cda3..7769d6f286 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -13,269 +13,289 @@ dependencies = [ ] [[package]] -name = "addr2line" -version = "0.24.2" +name = "actix-codec" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "gimli", + "bitflags 2.9.1", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "adler2" -version = "2.0.0" +name = "actix-http" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64 0.22.1", + "bitflags 2.9.1", + "brotli", + "bytes", + "bytestring", + "derive_more 2.0.1", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.9.1", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd 0.13.3", +] [[package]] -name = "aes" -version = "0.8.4" +name = "actix-macros" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", + "quote", + "syn 2.0.101", ] [[package]] -name = "ahash" -version = "0.8.12" +name = "actix-router" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ + "bytestring", "cfg-if", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", ] [[package]] -name = "aho-corasick" -version = "1.1.3" +name = "actix-rt" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ - "memchr", + "futures-core", + "tokio", ] [[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.8.3" +name = "actix-server" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-provider", - "alloy-rpc-client", - "alloy-serde", - "alloy-transport-http", + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", ] [[package]] -name = "alloy-chains" -version = "0.1.69" +name = "actix-service" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" dependencies = [ - "alloy-primitives", - "num_enum", - "strum 0.27.1", + "futures-core", + "pin-project-lite", ] [[package]] -name = "alloy-consensus" -version = "0.8.3" +name = "actix-utils" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", + "local-waker", + "pin-project-lite", ] [[package]] -name = "alloy-consensus-any" -version = "0.8.3" +name = "actix-web" +version = "4.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more 2.0.1", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", ] [[package]] -name = "alloy-core" -version = "0.8.25" +name = "actix-web-codegen" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] -name = "alloy-dyn-abi" -version = "0.8.25" +name = "addr2line" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", + "gimli", ] [[package]] -name = "alloy-eip2930" -version = "0.1.0" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] -name = "alloy-eip7702" -version = "0.4.2" +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "serde", + "cfg-if", + "cipher", + "cpufeatures", ] [[package]] -name = "alloy-eips" -version = "0.8.3" +name = "ahash" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", + "cfg-if", "once_cell", - "serde", - "sha2", + "version_check", + "zerocopy", ] [[package]] -name = "alloy-genesis" -version = "0.8.3" +name = "aho-corasick" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", + "memchr", ] [[package]] -name = "alloy-json-abi" -version = "0.8.25" +name = "alloc-no-stdlib" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] -name = "alloy-json-rpc" -version = "0.8.3" +name = "alloc-stdlib" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", + "alloc-no-stdlib", ] [[package]] -name = "alloy-network" -version = "0.8.3" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-dyn-abi" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b95b3deca680efc7e9cba781f1a1db352fa1ea50e6384a514944dcf4419e652" dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", + "alloy-json-abi", "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", + "alloy-sol-type-parser", "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", + "itoa", "serde", "serde_json", - "thiserror 2.0.12", + "winnow", ] [[package]] -name = "alloy-network-primitives" -version = "0.8.3" +name = "alloy-json-abi" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +checksum = "15516116086325c157c18261d768a20677f0f699348000ed391d4ad0dcb82530" dependencies = [ - "alloy-consensus", - "alloy-eips", "alloy-primitives", - "alloy-serde", + "alloy-sol-type-parser", "serde", + "serde_json", ] [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "6177ed26655d4e84e00b65cb494d4e0b8830e7cae7ef5d63087d445a2600fb55" dependencies = [ "alloy-rlp", "bytes", @@ -290,7 +310,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -298,149 +318,21 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest 0.12.19", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - [[package]] name = "alloy-rlp" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" dependencies = [ - "alloy-rlp-derive", "arrayvec", "bytes", ] -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest 0.12.19", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "a14f21d053aea4c6630687c2f4ad614bed4c81e14737a9b904798b24f30ea849" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -452,9 +344,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "34d99282e7c9ef14eb62727981a985a01869e586d1dec729d3bb33679094c100" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -470,9 +362,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "eda029f955b78e493360ee1d7bd11e1ab9f2a220a5715449babc79d6d0a01105" dependencies = [ "const-hex", "dunce", @@ -486,9 +378,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "10db1bd7baa35bc8d4a1b07efbf734e73e5ba09f2580fb8cee3483a36087ceb2" dependencies = [ "serde", "winnow", @@ -496,66 +388,14 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "58377025a47d8b8426b3e4846a251f2c1991033b27f517aade368146f6ab1dfe" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.19", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", "serde", - "smallvec", - "tracing", ] [[package]] @@ -746,9 +586,6 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] [[package]] name = "ascii-canvas" @@ -759,28 +596,6 @@ dependencies = [ "term", ] -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "async-trait" version = "0.1.88" @@ -803,6 +618,12 @@ dependencies = [ "rustc_version 0.4.1", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.3.0" @@ -944,15 +765,24 @@ dependencies = [ ] [[package]] -name = "blst" -version = "0.3.15" +name = "brotli" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -992,6 +822,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + [[package]] name = "bzip2" version = "0.4.4" @@ -1012,21 +851,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - [[package]] name = "camino" version = "1.1.10" @@ -1213,7 +1037,18 @@ dependencies = [ name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[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" @@ -1311,20 +1146,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "data-encoding" version = "2.9.0" @@ -1388,7 +1209,6 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "unicode-xid", ] [[package]] @@ -1492,17 +1312,20 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives", + "anyhow", "fhe", "fhe-traits", + "rand 0.8.5", ] [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" +source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" dependencies = [ "ark-bn254", "ark-ff 0.4.2", @@ -1516,6 +1339,31 @@ dependencies = [ "sha3", ] +[[package]] +name = "e3-program-server" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" +dependencies = [ + "actix-web", + "anyhow", + "e3-compute-provider", + "hex", + "reqwest 0.12.19", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "e3-support-scripts-dev" +version = "0.1.0" +dependencies = [ + "anyhow", + "e3-program-server", + "e3-user-program", + "tokio", +] + [[package]] name = "e3-user-program" version = "0.1.0" @@ -1804,7 +1652,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum 0.26.3", + "strum", "syn 2.0.101", "tempfile", "thiserror 1.0.69", @@ -2252,12 +2100,6 @@ dependencies = [ "slab", ] -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - [[package]] name = "fxhash" version = "0.2.1" @@ -2358,19 +2200,32 @@ dependencies = [ ] [[package]] -name = "hashbrown" -version = "0.13.2" +name = "h2" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ - "ahash", + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -2510,7 +2365,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -2533,6 +2388,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -2552,9 +2408,25 @@ dependencies = [ "futures-util", "http 0.2.12", "hyper 0.14.32", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.6.0", + "hyper-util", + "rustls 0.23.28", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.2", + "tower-service", ] [[package]] @@ -2592,9 +2464,11 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", + "system-configuration 0.6.1", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2713,6 +2587,12 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + [[package]] name = "impl-rlp" version = "0.3.0" @@ -2932,6 +2812,12 @@ dependencies = [ "regex-automata", ] +[[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.5.0" @@ -2996,6 +2882,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[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.4.13" @@ -3012,15 +2915,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - [[package]] name = "macro-string" version = "0.1.4" @@ -3090,6 +2984,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -3264,19 +3159,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - [[package]] name = "object" version = "0.36.7" @@ -3813,7 +3695,6 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", - "serde", ] [[package]] @@ -3824,6 +3705,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -3862,6 +3744,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -3942,6 +3825,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -3959,11 +3848,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", - "hyper-rustls", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -3971,15 +3860,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", + "rustls 0.21.12", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", @@ -3997,11 +3886,14 @@ checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-core", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", + "hyper-rustls 0.27.7", "hyper-tls", "hyper-util", "ipnet", @@ -4188,10 +4080,23 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.14", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.103.3", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -4220,6 +4125,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.21" @@ -4295,17 +4211,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -4511,6 +4416,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -4553,9 +4467,6 @@ name = "smallvec" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] [[package]] name = "socket2" @@ -4633,16 +4544,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", + "strum_macros", ] [[package]] @@ -4658,19 +4560,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - [[package]] name = "subtle" version = "2.6.1" @@ -4721,9 +4610,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "b9ac494e7266fcdd2ad80bf4375d55d27a117ea5c866c26d0e97fe5b3caeeb75" dependencies = [ "paste", "proc-macro2", @@ -4765,7 +4654,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -4778,6 +4678,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -4848,15 +4758,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "time" version = "0.3.41" @@ -4932,7 +4833,9 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -4965,20 +4868,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", "tokio", ] [[package]] -name = "tokio-stream" -version = "0.1.17" +name = "tokio-rustls" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "futures-core", - "pin-project-lite", + "rustls 0.23.28", "tokio", - "tokio-util", ] [[package]] @@ -4989,9 +4890,9 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", "webpki-roots", ] @@ -5101,6 +5002,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5155,7 +5057,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls", + "rustls 0.21.12", "sha1", "thiserror 1.0.69", "url", @@ -5439,20 +5341,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -5500,6 +5388,41 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5851,7 +5774,7 @@ dependencies = [ "pbkdf2 0.11.0", "sha1", "time", - "zstd", + "zstd 0.11.2+zstd.1.5.2", ] [[package]] @@ -5860,7 +5783,16 @@ version = "0.11.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" dependencies = [ - "zstd-safe", + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe 7.2.4", ] [[package]] @@ -5873,6 +5805,15 @@ dependencies = [ "zstd-sys", ] +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + [[package]] name = "zstd-sys" version = "2.0.15+zstd.1.5.7" diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml index f3c1453c02..9769a978a2 100644 --- a/templates/default/Cargo.toml +++ b/templates/default/Cargo.toml @@ -1,7 +1,8 @@ [workspace] members = [ "client/wasm", - "program" + "program", + ".enclave/support/dev" ] [workspace.dependencies] diff --git a/templates/default/client/wasm/Cargo.toml b/templates/default/client/wasm/Cargo.toml index c5ec5e4abf..43460017b1 100644 --- a/templates/default/client/wasm/Cargo.toml +++ b/templates/default/client/wasm/Cargo.toml @@ -16,7 +16,7 @@ rand = "0.8.5" ethers = "2.0.14" getrandom = { version = "0.2.11", features = ["js"] } bincode = "1.3.3" -e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave.git", rev = "f5508ef" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave.git", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } rayon = "1.10.0" ndarray = "0.15.6" itertools = "0.13.0" diff --git a/templates/default/enclave.config.yaml b/templates/default/enclave.config.yaml index 5b8f1cb609..729e7543d6 100644 --- a/templates/default/enclave.config.yaml +++ b/templates/default/enclave.config.yaml @@ -8,10 +8,11 @@ chains: filter_registry: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" program: - risc0: - risc0_dev_mode: 1 - # bonsai_api_key: xxxxxxxxxxxxxxxx - # bonsai_api_url: xxxxxxxxxxxxxxxx + dev: true + # risc0: + # risc0_dev_mode: 1 + # bonsai_api_key: xxxxxxxxxxxxxxxx + # bonsai_api_url: xxxxxxxxxxxxxxxx nodes: cn1: diff --git a/templates/default/flake.nix b/templates/default/flake.nix index 33544c721e..9274bb3d76 100644 --- a/templates/default/flake.nix +++ b/templates/default/flake.nix @@ -25,6 +25,8 @@ in { devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ + openssl + pkg-config rustToolchain wasm-pack nodejs diff --git a/templates/default/program/Cargo.toml b/templates/default/program/Cargo.toml index 8a579b7ce7..cba0c4e96c 100644 --- a/templates/default/program/Cargo.toml +++ b/templates/default/program/Cargo.toml @@ -6,8 +6,8 @@ edition = "2024" [dependencies] fhe_rs = { workspace = true } fhe-traits = { workspace = true } -e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } -e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "f5508ef" } +e3-compute-provider = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } +e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } [dev-dependencies] rand = { workspace = true } diff --git a/templates/default/scripts/dev_all_tmux.sh b/templates/default/scripts/dev_all_tmux.sh index 89d906bba0..612760696b 100755 --- a/templates/default/scripts/dev_all_tmux.sh +++ b/templates/default/scripts/dev_all_tmux.sh @@ -31,7 +31,7 @@ if command -v tmux &> /dev/null; then sleep 1 tmux send-keys -t 3 'TEST_MODE=1 pnpm dev:server' C-m sleep 1 - tmux send-keys -t 4 'enclave program start' C-m + tmux send-keys -t 4 'pnpm dev:program' C-m sleep 1 tmux send-keys -t 5 'pnpm dev:frontend' C-m diff --git a/templates/default/scripts/dev_ciphernodes.sh b/templates/default/scripts/dev_ciphernodes.sh index 012125f16d..f140b9a803 100755 --- a/templates/default/scripts/dev_ciphernodes.sh +++ b/templates/default/scripts/dev_ciphernodes.sh @@ -2,6 +2,8 @@ set -euo pipefail +SIGNAL_FILE=/tmp/enclave_ciphernodes_ready + cleanup() { echo "Cleaning up processes..." enclave nodes down @@ -11,6 +13,8 @@ cleanup() { exit 0 } +rm -rf $SIGNAL_FILE + trap cleanup INT TERM echo "Waiting for local evm node..." @@ -38,4 +42,6 @@ pnpm hardhat ciphernode:add --ciphernode-address $CN1 --network localhost pnpm hardhat ciphernode:add --ciphernode-address $CN2 --network localhost pnpm hardhat ciphernode:add --ciphernode-address $CN3 --network localhost +touch $SIGNAL_FILE + wait diff --git a/templates/default/scripts/dev_program.sh b/templates/default/scripts/dev_program.sh index d5ae2e9bb5..9fee0a6903 100755 --- a/templates/default/scripts/dev_program.sh +++ b/templates/default/scripts/dev_program.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash set -euo pipefail - -pnpm wait-on http://localhost:8545 && enclave program start +echo "enclave rev = $(enclave rev)" +echo "Waiting on ciphernodes to be ready..." +pnpm wait-on file:/tmp/enclave_ciphernodes_ready +echo "Ciphernodes are ready!" +enclave program start diff --git a/templates/default/scripts/test_integration.sh b/templates/default/scripts/test_integration.sh index c76d07d4e9..e3bcc074f3 100755 --- a/templates/default/scripts/test_integration.sh +++ b/templates/default/scripts/test_integration.sh @@ -20,8 +20,7 @@ failed_message() { } export $(enclave print-env --chain hardhat) - -enclave program compile && (pnpm concurrently \ +(pnpm concurrently \ --names "TEST,EVM,CIPHER,SERVER,PROGRAM" \ --prefix-colors "blue,cyan,magenta,yellow,green" \ --kill-others \ @@ -30,4 +29,4 @@ enclave program compile && (pnpm concurrently \ "pnpm dev:evm" \ "pnpm dev:ciphernodes" \ "TEST_MODE=1 pnpm dev:server" \ - "enclave program start" && passed_message) || failed_message + "pnpm dev:program" && passed_message) || failed_message diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 772b4ed7d8..305ec7f604 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -4,7 +4,6 @@ import { EnclaveEventType, type E3ActivatedData, type InputPublishedData, - type E3RequestedData, } from "@gnosis-guild/enclave/sdk"; import { handleTestInteraction } from "./testHandler"; import { getCheckedEnvVars } from "./utils"; @@ -96,8 +95,8 @@ async function runProgram(e3Id: bigint): Promise { } function defer() { - let resolve: () => void = () => {}; - let reject: (e?: any) => void = () => {}; + let resolve: () => void = () => { }; + let reject: (e?: any) => void = () => { }; const promise = new Promise((res, rej) => { resolve = res; diff --git a/tests/integration/base.sh b/tests/integration/base.sh index 1f2ec5e7aa..0fd5ac75f6 100755 --- a/tests/integration/base.sh +++ b/tests/integration/base.sh @@ -24,7 +24,7 @@ enclave_nodes_up echo "waiting on binaries and utilities..." -waiton-files "$ROOT_DIR/target/debug/enclave" "$ROOT_DIR/target/debug/fake_encrypt" +waiton-files "$ROOT_DIR/target/debug/fake_encrypt" sleep 4 diff --git a/tests/integration/fns.sh b/tests/integration/fns.sh index 3858639a6d..68b8ae7f9e 100644 --- a/tests/integration/fns.sh +++ b/tests/integration/fns.sh @@ -38,7 +38,15 @@ NETWORK_PRIVATE_KEY_2="0x21a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85f NETWORK_PRIVATE_KEY_3="0x31a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85fa33d3f580" NETWORK_PRIVATE_KEY_4="0x41a1e500a548b70d88184a1e042900c0ed6c57f8710bcc35dc8c85fa33d3f580" -ENCLAVE_BIN=$ROOT_DIR/target/debug/enclave +if command -v enclave >/dev/null 2>&1; then + ENCLAVE_BIN="enclave" +elif [[ -f "$ROOT_DIR/target/debug/enclave" ]]; then + ENCLAVE_BIN="$ROOT_DIR/target/debug/enclave" +else + cargo build --bin enclave + ENCLAVE_BIN="$ROOT_DIR/target/debug/enclave" +fi +echo "Enclave binary: $ENCLAVE_BIN" # Function to clean up background processes cleanup() { diff --git a/tests/integration/lib/prebuild.sh b/tests/integration/lib/prebuild.sh index 29c96f179d..84aefd6e7d 100755 --- a/tests/integration/lib/prebuild.sh +++ b/tests/integration/lib/prebuild.sh @@ -3,7 +3,7 @@ set -eu # Exit immediately if a command exits with a non-zero status echo "" echo "PREBUILDING BINARIES..." echo "" -cd ../../crates && cargo build --bin fake_encrypt --bin enclave --bin pack_e3_params; +cd ../../crates && cargo build --bin fake_encrypt --bin pack_e3_params; echo "" echo "FINISHED PREBUILDING BINARIES" echo "" diff --git a/tests/integration/persist.sh b/tests/integration/persist.sh index 3218b319be..39e97b3f58 100755 --- a/tests/integration/persist.sh +++ b/tests/integration/persist.sh @@ -22,7 +22,7 @@ enclave_wallet_set ag "$PRIVATE_KEY" # start swarm enclave_nodes_up -waiton-files "$ROOT_DIR/target/debug/enclave" "$ROOT_DIR/target/debug/fake_encrypt" +waiton-files "$ROOT_DIR/target/debug/fake_encrypt" heading "Add ciphernode $CIPHERNODE_ADDRESS_1" pnpm ciphernode:add --ciphernode-address $CIPHERNODE_ADDRESS_1 --network localhost From 1ab5fac074787235130bd2b5b2ce5bd7d92114d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 18 Jul 2025 19:22:18 +0000 Subject: [PATCH 103/106] Universal wasm built within the SDK (#574) * Replace old references * Update lock * Fix up build * Fix import issues * --wip-- [skip ci] * Fix filter ethers naming conflict * linting * use tsx instead of ts-node * Update bundle settings * Use universal wasm * Update client * Remove from cargo workspace * Remove wasm build stage from client * Fix bad path * Use tsup to solve bundling issues * Add packages to Dockerfile * Use build instead of just evm:build * Remove redundant stage and add enclave-sdk dist folder * Build SDK instead of everything * update dependencies * make config a module * Add script to prebuild * Incorporate tsup into @gnosis-guild/enclave * Update linting * Remove redundant comments * Tidy up scripts * Remove redundant file * Fix bad task name * Ensure types are created first * update external list * Remove redundant file * Add documentation * Add docs for wasm usage * Readme formatting * Fix spacing --- .github/workflows/ci.yml | 16 +- crates/Dockerfile | 2 + crates/wasm/.npmignore | 6 + crates/wasm/README.md | 32 + crates/wasm/init.d.ts | 3 + crates/wasm/init_node.js | 3 + crates/wasm/init_web.js | 4 + crates/wasm/package.json | 39 +- docs/pages/setting-up-server.mdx | 157 +- examples/CRISP/apps/client/package.json | 2 +- examples/CRISP/package.json | 4 +- package.json | 10 +- packages/enclave-config/.gitignore | 1 + packages/enclave-config/dom.tsconfig.json | 7 + packages/enclave-config/index.js | 1 + packages/enclave-config/package.json | 19 + packages/enclave-config/tsconfig.json | 15 + packages/enclave-config/tsup.config.js | 10 + packages/enclave-react/package.json | 24 +- packages/enclave-react/src/index.ts | 34 +- packages/enclave-react/src/useEnclaveSDK.ts | 5 +- packages/enclave-react/tsconfig.json | 42 +- packages/enclave-react/tsup.config.js | 7 + packages/enclave-sdk/.gitignore | 1 + .../{evm/src/sdk => enclave-sdk}/README.md | 31 +- packages/enclave-sdk/package.json | 36 + .../src}/contract-client.ts | 8 +- .../sdk => enclave-sdk/src}/enclave-sdk.ts | 4 +- .../sdk => enclave-sdk/src}/event-listener.ts | 10 +- .../{evm/src/sdk => enclave-sdk/src}/index.ts | 1 + .../{evm/src/sdk => enclave-sdk/src}/types.ts | 10 +- .../{evm/src/sdk => enclave-sdk/src}/utils.ts | 0 .../{evm/src/sdk => enclave-sdk/src}/wasm.ts | 6 +- .../enclave-sdk/tests/fixtures/pubkey.bin | Bin 0 -> 27676 bytes .../tests/sdk.test.ts} | 6 +- packages/enclave-sdk/tsconfig.json | 9 + packages/enclave-sdk/tsup.config.js | 7 + .../registry/CiphernodeRegistryOwnable.sol | 10 +- packages/evm/deploy/enclave.ts | 14 +- packages/evm/deploy/mocks.ts | 6 +- .../{hardhat.config.ts => hardhat.config.cts} | 8 +- packages/evm/package.json | 57 +- packages/evm/src/tsconfig.json | 22 - .../CiphernodeRegistryOwnable.spec.ts | 5 +- .../NaiveRegistryFilter.spec.ts | 3 +- packages/evm/test/Enclave.spec.ts | 7 +- .../MockCiphernodeRegistry.fixture.ts | 2 +- .../evm/test/fixtures/PoseidonT3.fixture.ts | 1 + packages/evm/tsconfig.json | 24 +- packages/evm/tsup.config.mjs | 10 + pnpm-lock.yaml | 1812 ++++-- pnpm-workspace.yaml | 4 +- templates/default/Cargo.lock | 2143 +----- templates/default/Cargo.toml | 1 - templates/default/client/package.json | 8 +- .../client/src/hooks/useWebAssembly.tsx | 42 - .../default/client/src/pages/WizardSDK.tsx | 26 +- templates/default/client/vite.config.ts | 24 +- templates/default/client/wasm/Cargo.lock | 5777 ----------------- templates/default/client/wasm/Cargo.toml | 33 - templates/default/client/wasm/README.md | 35 - templates/default/client/wasm/build.sh | 47 - templates/default/client/wasm/src/lib.rs | 39 - templates/default/package.json | 8 +- templates/default/scripts/dev_server.sh | 2 +- templates/default/scripts/test_integration.sh | 2 +- templates/default/server/index.ts | 6 +- templates/default/tests/integration.spec.ts | 14 +- templates/default/tsconfig.json | 2 +- 69 files changed, 1998 insertions(+), 8768 deletions(-) create mode 100644 crates/wasm/.npmignore create mode 100644 crates/wasm/README.md create mode 100644 crates/wasm/init.d.ts create mode 100644 crates/wasm/init_node.js create mode 100644 crates/wasm/init_web.js create mode 100644 packages/enclave-config/.gitignore create mode 100644 packages/enclave-config/dom.tsconfig.json create mode 100644 packages/enclave-config/index.js create mode 100644 packages/enclave-config/package.json create mode 100644 packages/enclave-config/tsconfig.json create mode 100644 packages/enclave-config/tsup.config.js create mode 100644 packages/enclave-react/tsup.config.js create mode 100644 packages/enclave-sdk/.gitignore rename packages/{evm/src/sdk => enclave-sdk}/README.md (88%) create mode 100644 packages/enclave-sdk/package.json rename packages/{evm/src/sdk => enclave-sdk/src}/contract-client.ts (97%) rename packages/{evm/src/sdk => enclave-sdk/src}/enclave-sdk.ts (99%) rename packages/{evm/src/sdk => enclave-sdk/src}/event-listener.ts (97%) rename packages/{evm/src/sdk => enclave-sdk/src}/index.ts (99%) rename packages/{evm/src/sdk => enclave-sdk/src}/types.ts (97%) rename packages/{evm/src/sdk => enclave-sdk/src}/utils.ts (100%) rename packages/{evm/src/sdk => enclave-sdk/src}/wasm.ts (53%) create mode 100644 packages/enclave-sdk/tests/fixtures/pubkey.bin rename packages/{evm/test/sdk.spec.ts => enclave-sdk/tests/sdk.test.ts} (73%) create mode 100644 packages/enclave-sdk/tsconfig.json create mode 100644 packages/enclave-sdk/tsup.config.js rename packages/evm/{hardhat.config.ts => hardhat.config.cts} (98%) delete mode 100644 packages/evm/src/tsconfig.json create mode 100644 packages/evm/tsup.config.mjs delete mode 100644 templates/default/client/src/hooks/useWebAssembly.tsx delete mode 100644 templates/default/client/wasm/Cargo.lock delete mode 100644 templates/default/client/wasm/Cargo.toml delete mode 100644 templates/default/client/wasm/README.md delete mode 100755 templates/default/client/wasm/build.sh delete mode 100644 templates/default/client/wasm/src/lib.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 322e193136..4c72f9fa83 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,6 +66,7 @@ jobs: - name: Run tests run: "pnpm ciphernode:test" + build: name: Compile and push Support Dockerfile runs-on: ubuntu-latest @@ -184,6 +185,7 @@ jobs: run: | echo "## Network test results" >> $GITHUB_STEP_SUMMARY echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + integration_prebuild: name: Prebuild Integration Tools runs-on: "ubuntu-latest" @@ -230,6 +232,7 @@ jobs: target/debug/fake_encrypt target/debug/pack_e3_params if-no-files-found: error + ciphernode_integration_test: name: Ciphernode Integration Test needs: [integration_prebuild, build_enclave_cli, build_sdk] @@ -292,6 +295,7 @@ jobs: run: | echo "## Test results for ${{ matrix.test-suite }}" >> $GITHUB_STEP_SUMMARY echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + build_enclave_cli: name: Build Enclave CLI runs-on: ubuntu-latest @@ -329,6 +333,7 @@ jobs: name: enclave-binary path: ~/.cargo/bin/enclave retention-days: 1 + build_support_scripts: name: Build Support Scripts runs-on: ubuntu-latest @@ -362,6 +367,7 @@ jobs: path: templates/default/target/ retention-days: 1 if-no-files-found: error + build_sdk: name: Build SDK runs-on: ubuntu-latest @@ -402,18 +408,13 @@ jobs: - name: Install node dependencies run: pnpm install - name: Build the sdk - run: pnpm evm:build - - name: List built artifacts for debugging - run: | - echo "Checking for built artifacts:" - ls -la packages/evm/ || echo "packages/evm/ not found" - ls -la crates/wasm/ || echo "crates/wasm/ not found" - find . -name "dist" -type d || echo "No dist directories found" + run: pnpm sdk:build - name: Upload SDK artifacts uses: actions/upload-artifact@v4 with: name: sdk-artifacts path: | + packages/enclave-sdk/dist packages/evm/dist packages/evm/artifacts packages/evm/cache @@ -421,6 +422,7 @@ jobs: crates/wasm/dist retention-days: 1 if-no-files-found: warn + template_integration: name: Template Integration runs-on: ubuntu-latest diff --git a/crates/Dockerfile b/crates/Dockerfile index 242070981b..95bdd4b4e7 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -3,6 +3,8 @@ FROM node:22 AS evm-builder WORKDIR /build COPY crates/wasm/package.json ./crates/wasm/package.json COPY packages/enclave-react ./packages/enclave-react +COPY packages/enclave-sdk ./packages/enclave-sdk +COPY packages/enclave-config ./packages/enclave-config COPY packages/evm ./packages/evm COPY pnpm-workspace.yaml . COPY pnpm-lock.yaml . diff --git a/crates/wasm/.npmignore b/crates/wasm/.npmignore new file mode 100644 index 0000000000..d8dcb746e2 --- /dev/null +++ b/crates/wasm/.npmignore @@ -0,0 +1,6 @@ +src/ +scripts/ +*.ts +tsconfig.json +.gitignore +node_modules/ diff --git a/crates/wasm/README.md b/crates/wasm/README.md new file mode 100644 index 0000000000..f535017ac9 --- /dev/null +++ b/crates/wasm/README.md @@ -0,0 +1,32 @@ +# Wasm bundle for enclave + +Here we export wasm funcionality for consumption in typescript to enable use to share code between Rust and Typescript. + +## Usage + +This package exposes an `init` subpackage default function which should be used to universally load the wasm module instead of exporting the default loader. + +This is because in modern node there is no need for preloading however in the browser we still need to load the wasm bundle. + +##### ❌ DONT USE THE DEFAULT INIT + +```ts +// Bad! Because this uses the raw loader which doesn't exist in node contexts +import init, { encrypt_number } from "@gnosis-guild/e3-wasm"; +``` + +##### ✅ DO USE THE EXPORTED SUBMODULE + +```ts +// Good! Use the universal loader +import init from "@gnosis-guild/e3-wasm/init"; +import { encrypt_number } from "@gnosis-guild/e3-wasm"; + +export async function encryptNumber( + data: bigint, + public_key: Uint8Array, +): Promise { + await init(); + return encrypt_number(data, public_key); +} +``` diff --git a/crates/wasm/init.d.ts b/crates/wasm/init.d.ts new file mode 100644 index 0000000000..b386967696 --- /dev/null +++ b/crates/wasm/init.d.ts @@ -0,0 +1,3 @@ +type Params = { module_or_path?: any }; +declare function init(param?: Params): Promise; +export default init; diff --git a/crates/wasm/init_node.js b/crates/wasm/init_node.js new file mode 100644 index 0000000000..ba586cf322 --- /dev/null +++ b/crates/wasm/init_node.js @@ -0,0 +1,3 @@ +export default async function init() { + // Node does not need to be loaded async +} diff --git a/crates/wasm/init_web.js b/crates/wasm/init_web.js new file mode 100644 index 0000000000..dce893170f --- /dev/null +++ b/crates/wasm/init_web.js @@ -0,0 +1,4 @@ +import init from "./dist/web/e3_wasm.js"; +export default async function init(initParams) { + return await init(initParams); +} diff --git a/crates/wasm/package.json b/crates/wasm/package.json index b6bacd0a37..d5f67280a7 100644 --- a/crates/wasm/package.json +++ b/crates/wasm/package.json @@ -4,23 +4,40 @@ "description": "Wasm modules for enclave.", "main": "index.js", "files": [ - "dist" + "dist/", + "dist/**/*" ], "scripts": { "build": "./scripts/build.sh" }, "exports": { - "node": { - "types": "./dist/nodejs/e3_wasm.d.ts", - "default": "./dist/nodejs/e3_wasm.js" + ".": { + "node": { + "types": "./dist/nodejs/e3_wasm.d.ts", + "default": "./dist/nodejs/e3_wasm.js" + }, + "browser": { + "types": "./dist/web/e3_wasm.d.ts", + "default": "./dist/web/e3_wasm.js" + }, + "default": { + "types": "./dist/web/e3_wasm.d.ts", + "default": "./dist/web/e3_wasm.js" + } }, - "browser": { - "types": "./dist/web/e3_wasm.d.ts", - "default": "./dist/web/e3_wasm.js" - }, - "default": { - "types": "./dist/web/e3_wasm.d.ts", - "default": "./dist/web/e3_wasm.js" + "./init": { + "node": { + "types": "./init.d.ts", + "default": "./init_node.js" + }, + "browser": { + "types": "./init.d.ts", + "default": "./init_web.js" + }, + "default": { + "types": "./init.d.ts", + "default": "./init_web.js" + } } }, "keywords": [], diff --git a/docs/pages/setting-up-server.mdx b/docs/pages/setting-up-server.mdx index 907c61be50..e8a891710a 100644 --- a/docs/pages/setting-up-server.mdx +++ b/docs/pages/setting-up-server.mdx @@ -5,7 +5,9 @@ description: 'Build client applications and coordination servers using the Encla # Setting Up the Client and Server -Building E3 applications involves creating client-side interfaces for users and coordination logic for managing the E3 lifecycle. The Enclave SDK provides powerful TypeScript and React tools to streamline this development process. +Building E3 applications involves creating client-side interfaces for users and coordination logic +for managing the E3 lifecycle. The Enclave SDK provides powerful TypeScript and React tools to +streamline this development process. ## Overview @@ -17,6 +19,7 @@ Modern E3 applications typically consist of: 4. **Contract Interactions**: Type-safe smart contract communication The Enclave SDK handles much of this complexity for you, providing: + - Type-safe contract interactions - Real-time event listening - React hooks for easy frontend integration @@ -43,44 +46,44 @@ pnpm add @gnosis-guild/enclave @gnosis-guild/enclave-react Create a type-safe client that can interact with Enclave contracts: ```typescript -import { EnclaveSDK, EnclaveEventType } from "@gnosis-guild/enclave/sdk"; -import { createPublicClient, createWalletClient, http, custom } from "viem"; +import { EnclaveSDK, EnclaveEventType } from '@gnosis-guild/enclave-sdk' +import { createPublicClient, createWalletClient, http, custom } from 'viem' // Initialize clients const publicClient = createPublicClient({ - transport: http("http://localhost:8545"), // Your RPC URL -}); + transport: http('http://localhost:8545'), // Your RPC URL +}) const walletClient = createWalletClient({ transport: custom(window.ethereum), -}); +}) // Create SDK instance const sdk = new EnclaveSDK({ publicClient, walletClient, contracts: { - enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + enclave: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + ciphernodeRegistry: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', }, chainId: 31337, // Hardhat local network -}); +}) // Initialize the SDK -await sdk.initialize(); +await sdk.initialize() // Request a new E3 computation const hash = await sdk.requestE3({ - filter: "0x0000000000000000000000000000000000000000", + filter: '0x0000000000000000000000000000000000000000', threshold: [2, 3], startWindow: [BigInt(0), BigInt(100)], duration: BigInt(3600), - e3Program: "0x9A676e781A523b5d0C0e43731313A708CB607508", - e3ProgramParams: "0x", - computeProviderParams: "0x", -}); + e3Program: '0x9A676e781A523b5d0C0e43731313A708CB607508', + e3ProgramParams: '0x', + computeProviderParams: '0x', +}) -console.log("E3 requested with hash:", hash); +console.log('E3 requested with hash:', hash) ``` ### React Application with Hooks @@ -93,7 +96,7 @@ import { useEnclaveSDK } from '@gnosis-guild/enclave-react'; function E3Dashboard() { const [e3Data, setE3Data] = useState(null); - + const { sdk, isInitialized, @@ -186,35 +189,35 @@ The SDK provides comprehensive event handling for the entire E3 lifecycle: ```typescript // Listen to key E3 lifecycle events sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, (event) => { - console.log("New E3 computation requested:", event.data); -}); + console.log('New E3 computation requested:', event.data) +}) sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, (event) => { - console.log("E3 environment activated:", event.data); -}); + console.log('E3 environment activated:', event.data) +}) sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, (event) => { - console.log("Input data published:", event.data); -}); + console.log('Input data published:', event.data) +}) sdk.onEnclaveEvent(EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED, (event) => { - console.log("Computation result available:", event.data); -}); + console.log('Computation result available:', event.data) +}) ``` ### Registry Events ```typescript -import { RegistryEventType } from '@gnosis-guild/enclave/sdk'; +import { RegistryEventType } from '@gnosis-guild/enclave/sdk' // Monitor ciphernode network changes sdk.onEnclaveEvent(RegistryEventType.CIPHERNODE_ADDED, (event) => { - console.log("New ciphernode joined:", event.data); -}); + console.log('New ciphernode joined:', event.data) +}) sdk.onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, (event) => { - console.log("Committee selection complete:", event.data); -}); + console.log('Committee selection complete:', event.data) +}) ``` ## Server-Side Coordination @@ -222,76 +225,73 @@ sdk.onEnclaveEvent(RegistryEventType.COMMITTEE_PUBLISHED, (event) => { For server-side applications, you can create automated coordination services: ```typescript -import { EnclaveSDK } from "@gnosis-guild/enclave/sdk"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; +import { EnclaveSDK } from '@gnosis-guild/enclave-sdk' +import { createPublicClient, createWalletClient, http } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' class E3CoordinationServer { - private sdk: EnclaveSDK; + private sdk: EnclaveSDK constructor(privateKey: string, rpcUrl: string) { - const account = privateKeyToAccount(privateKey as `0x${string}`); - + const account = privateKeyToAccount(privateKey as `0x${string}`) + const publicClient = createPublicClient({ transport: http(rpcUrl), - }); + }) const walletClient = createWalletClient({ account, transport: http(rpcUrl), - }); + }) this.sdk = new EnclaveSDK({ publicClient, walletClient, contracts: { - enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + enclave: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + ciphernodeRegistry: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', }, - }); + }) } async start() { - await this.sdk.initialize(); - this.setupEventListeners(); - console.log("E3 Coordination Server started"); + await this.sdk.initialize() + this.setupEventListeners() + console.log('E3 Coordination Server started') } private setupEventListeners() { // Auto-activate E3s when they become available this.sdk.onEnclaveEvent(EnclaveEventType.E3_REQUESTED, async (event) => { - const { e3Id } = event.data; - console.log(`Auto-activating E3 ${e3Id}`); - + const { e3Id } = event.data + console.log(`Auto-activating E3 ${e3Id}`) + try { // In a real implementation, you'd generate/retrieve the public key - const publicKey = "0x..."; // Your FHE public key - await this.sdk.activateE3(e3Id, publicKey); + const publicKey = '0x...' // Your FHE public key + await this.sdk.activateE3(e3Id, publicKey) } catch (error) { - console.error(`Failed to activate E3 ${e3Id}:`, error); + console.error(`Failed to activate E3 ${e3Id}:`, error) } - }); + }) // Handle input aggregation this.sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, async (event) => { - console.log("Input published:", event.data); + console.log('Input published:', event.data) // Implement your input aggregation logic here - }); + }) } async stop() { - this.sdk.cleanup(); - console.log("E3 Coordination Server stopped"); + this.sdk.cleanup() + console.log('E3 Coordination Server stopped') } } // Usage -const server = new E3CoordinationServer( - process.env.PRIVATE_KEY!, - process.env.RPC_URL! -); +const server = new E3CoordinationServer(process.env.PRIVATE_KEY!, process.env.RPC_URL!) -server.start(); +server.start() ``` ## Error Handling @@ -299,29 +299,29 @@ server.start(); The SDK includes comprehensive error handling: ```typescript -import { SDKError } from "@gnosis-guild/enclave/sdk"; +import { SDKError } from '@gnosis-guild/enclave-sdk' try { - await sdk.requestE3(params); + await sdk.requestE3(params) } catch (error) { if (error instanceof SDKError) { - console.error(`SDK Error (${error.code}): ${error.message}`); - + console.error(`SDK Error (${error.code}): ${error.message}`) + switch (error.code) { - case "MISSING_PUBLIC_CLIENT": + case 'MISSING_PUBLIC_CLIENT': // Handle missing client - break; - case "INVALID_ADDRESS": + break + case 'INVALID_ADDRESS': // Handle invalid contract address - break; - case "TRANSACTION_FAILED": + break + case 'TRANSACTION_FAILED': // Handle transaction failure - break; + break default: - console.error("Unknown SDK error:", error); + console.error('Unknown SDK error:', error) } } else { - console.error("Unexpected error:", error); + console.error('Unexpected error:', error) } } ``` @@ -335,12 +335,12 @@ For local development with the default template: ```typescript const devConfig = { contracts: { - enclave: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - ciphernodeRegistry: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + enclave: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + ciphernodeRegistry: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', }, chainId: 31337, - rpcUrl: "http://localhost:8545", -}; + rpcUrl: 'http://localhost:8545', +} ``` ### Production Configuration @@ -355,7 +355,8 @@ const prodConfig = { }, chainId: 1, // Mainnet rpcUrl: process.env.RPC_URL!, -}; +} ``` -The Enclave SDK abstracts away much of the complexity, allowing you to focus on your application's unique business logic while ensuring robust, type-safe interaction with the Enclave protocol. +The Enclave SDK abstracts away much of the complexity, allowing you to focus on your application's +unique business logic while ensuring robust, type-safe interaction with the Enclave protocol. diff --git a/examples/CRISP/apps/client/package.json b/examples/CRISP/apps/client/package.json index b829c20d3e..d2f0cb411e 100644 --- a/examples/CRISP/apps/client/package.json +++ b/examples/CRISP/apps/client/package.json @@ -59,7 +59,7 @@ "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.13", "tailwindcss": "^3.4.2", - "typescript": "^5.2.2", + "typescript": "^5.8.3", "vite": "^5.2.0", "vite-plugin-wasm": "^3.3.0" }, diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index a63ef62a38..efc4fad224 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -54,8 +54,8 @@ "solidity-coverage": "^0.8.1", "ts-node": "^10.9.2", "typechain": "^8.3.0", - "typescript": "^5.5.4", + "typescript": "5.8.3", "wait-on": "^8.0.3" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" -} \ No newline at end of file +} diff --git a/package.json b/package.json index 51135037d1..3fa212a618 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ }, "scripts": { "clean": "cd packages/evm && pnpm clean", - "compile": "pnpm evm:build && pnpm react:build && pnpm ciphernode:build", + "compile": "pnpm evm:build && pnpm sdk:build && pnpm react:build && pnpm ciphernode:build", "lint": "pnpm evm:lint && pnpm ciphernode:lint", "typechain": "pnpm evm:typechain", - "test": "pnpm evm:test && pnpm ciphernode:test", + "test": "pnpm evm:test && pnpm ciphernode:test && pnpm sdk:test", "test:integration": "cd ./tests/integration && ./test.sh", "coverage": "pnpm evm:coverage", "prepare": "husky", @@ -38,6 +38,8 @@ "evm:coverage": "cd packages/evm && pnpm coverage", "evm:release": "cd packages/evm && pnpm release", "react:build": "cd packages/enclave-react && pnpm build", + "sdk:build": "cd packages/enclave-sdk && pnpm build", + "sdk:test": "cd packages/enclave-sdk && pnpm test", "react:release": "cd packages/enclave-react && pnpm release", "npm:release": "pnpm build && pnpm evm:release && pnpm react:release", "support:build": "cd crates/support && ./scripts/build.sh", @@ -60,6 +62,10 @@ }, "pnpm": { "overrides": { + "@types/node": "22.7.5", + "tsup": "8.5.0", + "typescript": "5.8.3", + "undici-types": "6.19.8", "viem": "2.30.6" } } diff --git a/packages/enclave-config/.gitignore b/packages/enclave-config/.gitignore new file mode 100644 index 0000000000..64a826e5a2 --- /dev/null +++ b/packages/enclave-config/.gitignore @@ -0,0 +1 @@ +dist/.tsbuildinfo diff --git a/packages/enclave-config/dom.tsconfig.json b/packages/enclave-config/dom.tsconfig.json new file mode 100644 index 0000000000..f187be5868 --- /dev/null +++ b/packages/enclave-config/dom.tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "lib": ["es2022", "dom", "dom.iterable"] + } +} diff --git a/packages/enclave-config/index.js b/packages/enclave-config/index.js new file mode 100644 index 0000000000..b0cf55060f --- /dev/null +++ b/packages/enclave-config/index.js @@ -0,0 +1 @@ +console.log("This is not designed to be run like this."); diff --git a/packages/enclave-config/package.json b/packages/enclave-config/package.json new file mode 100644 index 0000000000..917405a8d8 --- /dev/null +++ b/packages/enclave-config/package.json @@ -0,0 +1,19 @@ +{ + "name": "@gnosis-guild/enclave-config", + "version": "0.0.0", + "description": "", + "module": true, + "main": "index.js", + "type": "module", + "exports": { + "./tsup": "./tsup.config.js", + "./tsconfig.json": "./tsconfig.json", + "./dom.tsconfig.json": "./dom.tsconfig.json" + }, + "keywords": [], + "author": "", + "license": "LGPL-3.0-only", + "peerDependencies": { + "tsup": "^8.5.0" + } +} diff --git a/packages/enclave-config/tsconfig.json b/packages/enclave-config/tsconfig.json new file mode 100644 index 0000000000..685fd21b54 --- /dev/null +++ b/packages/enclave-config/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "outDir": "dist", + "noEmit": true + } +} diff --git a/packages/enclave-config/tsup.config.js b/packages/enclave-config/tsup.config.js new file mode 100644 index 0000000000..7cee180c23 --- /dev/null +++ b/packages/enclave-config/tsup.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from "tsup"; + +export const baseConfig = defineConfig({ + entry: ["src/index.ts"], + splitting: false, + sourcemap: true, + clean: true, + format: ["esm"], + dts: true, +}); diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index e4f782eed9..225126bdbd 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -2,16 +2,20 @@ "name": "@gnosis-guild/enclave-react", "version": "0.0.5-test.22", "description": "React hooks and utilities for Enclave SDK", - "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, "sideEffects": false, "files": [ "dist" ], "scripts": { - "build": "tsc", - "dev": "tsc --watch", + "build": "tsup", + "dev": "tsup --watch", "clean": "rm -rf dist", "prepublishOnly": "pnpm run clean && pnpm run build", "release": "pnpm publish" @@ -31,19 +35,21 @@ "license": "LGPL-3.0-only", "peerDependencies": { "react": "^18.2.0", - "wagmi": "^2.14.16", - "viem": "2.30.6" + "wagmi": "^2.14.16" }, "publishConfig": { "access": "public", "git-checks": false }, "dependencies": { - "@gnosis-guild/enclave": "workspace:*" + "@gnosis-guild/enclave-sdk": "workspace:*", + "viem": "2.30.6" }, "devDependencies": { + "@gnosis-guild/enclave-config": "workspace:*", "@types/react": "^18.2.0", - "typescript": "^5.8.3" + "tsup": "^8.5.0", + "typescript": "5.8.3" }, "repository": { "type": "git", diff --git a/packages/enclave-react/src/index.ts b/packages/enclave-react/src/index.ts index 6fd0f2548c..f7a747c111 100644 --- a/packages/enclave-react/src/index.ts +++ b/packages/enclave-react/src/index.ts @@ -1,26 +1,26 @@ /** * @gnosis-guild/enclave-react - * + * * React hooks and utilities for Enclave SDK */ -export { useEnclaveSDK } from './useEnclaveSDK'; -export type { UseEnclaveSDKConfig, UseEnclaveSDKReturn } from './useEnclaveSDK'; +export { useEnclaveSDK } from "./useEnclaveSDK"; +export type { UseEnclaveSDKConfig, UseEnclaveSDKReturn } from "./useEnclaveSDK"; // Re-export commonly used types from the main SDK for convenience export type { - AllEventTypes, - EventCallback, - EnclaveEvent, - E3RequestedData, - E3ActivatedData, - InputPublishedData, - CiphertextOutputPublishedData, - PlaintextOutputPublishedData, - CiphernodeAddedData, - CiphernodeRemovedData, - CommitteeRequestedData, - CommitteePublishedData -} from '@gnosis-guild/enclave/sdk'; + AllEventTypes, + EventCallback, + EnclaveEvent, + E3RequestedData, + E3ActivatedData, + InputPublishedData, + CiphertextOutputPublishedData, + PlaintextOutputPublishedData, + CiphernodeAddedData, + CiphernodeRemovedData, + CommitteeRequestedData, + CommitteePublishedData, +} from "@gnosis-guild/enclave-sdk"; -export { EnclaveEventType, RegistryEventType } from '@gnosis-guild/enclave/sdk'; \ No newline at end of file +export { EnclaveEventType, RegistryEventType } from "@gnosis-guild/enclave-sdk"; diff --git a/packages/enclave-react/src/useEnclaveSDK.ts b/packages/enclave-react/src/useEnclaveSDK.ts index 1d621fc294..f6259e9b0e 100644 --- a/packages/enclave-react/src/useEnclaveSDK.ts +++ b/packages/enclave-react/src/useEnclaveSDK.ts @@ -8,7 +8,7 @@ import { EnclaveEventType, RegistryEventType, SDKError, -} from "@gnosis-guild/enclave/sdk"; +} from "@gnosis-guild/enclave-sdk"; export interface UseEnclaveSDKConfig { contracts?: { @@ -95,7 +95,7 @@ export const useEnclaveSDK = ( const sdkConfig: SDKConfig = { publicClient, - walletClient: walletClient || undefined, + walletClient, contracts: config.contracts || { enclave: "0x0000000000000000000000000000000000000000", ciphernodeRegistry: "0x0000000000000000000000000000000000000000", @@ -105,7 +105,6 @@ export const useEnclaveSDK = ( const newSdk = new EnclaveSDK(sdkConfig); await newSdk.initialize(); - setSdk(newSdk); sdkRef.current = newSdk; setIsInitialized(true); diff --git a/packages/enclave-react/tsconfig.json b/packages/enclave-react/tsconfig.json index f121560a34..e55c5bb253 100644 --- a/packages/enclave-react/tsconfig.json +++ b/packages/enclave-react/tsconfig.json @@ -1,35 +1,9 @@ { - "compilerOptions": { - "target": "ES2020", - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": false, - "jsx": "react-jsx", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "declaration": true, - "declarationMap": true, - "outDir": "dist", - "rootDir": "src", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true - }, - "include": [ - "src" - ], - "exclude": [ - "dist", - "node_modules" - ] -} \ No newline at end of file + "extends": "@gnosis-guild/enclave-config/dom.tsconfig.json", + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo" + } +} diff --git a/packages/enclave-react/tsup.config.js b/packages/enclave-react/tsup.config.js new file mode 100644 index 0000000000..21d41b63ae --- /dev/null +++ b/packages/enclave-react/tsup.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from "tsup"; +import { baseConfig } from "@gnosis-guild/enclave-config/tsup"; + +export default defineConfig({ + ...baseConfig, + include: ["./src/**/*.ts"], +}); diff --git a/packages/enclave-sdk/.gitignore b/packages/enclave-sdk/.gitignore new file mode 100644 index 0000000000..1521c8b765 --- /dev/null +++ b/packages/enclave-sdk/.gitignore @@ -0,0 +1 @@ +dist diff --git a/packages/evm/src/sdk/README.md b/packages/enclave-sdk/README.md similarity index 88% rename from packages/evm/src/sdk/README.md rename to packages/enclave-sdk/README.md index 1d4a0da4a0..5fb59c0329 100644 --- a/packages/evm/src/sdk/README.md +++ b/packages/enclave-sdk/README.md @@ -19,7 +19,7 @@ methods, and comprehensive error handling. ## Installation ```bash -pnpm add @gnosis-guild/enclave +pnpm add @gnosis-guild/enclave-sdk ``` ## Quick Start @@ -29,7 +29,7 @@ import { EnclaveSDK, EnclaveEventType, RegistryEventType, -} from "@gnosis-guild/enclave/sdk"; +} from "@gnosis-guild/enclave-sdk"; import { createPublicClient, createWalletClient, http, custom } from "viem"; // Initialize clients @@ -76,6 +76,31 @@ const hash = await sdk.requestE3({ }); ``` +## Usage within a browser + +Usage within a typescript project should work out of the box, however in order to use wasm related functionality of the SDK within the browser vite you must do the following: + +- Use `vite` +- Use the `vite-plugin-top-level-await` plugin +- Use the `vite-plugin-wasm` plugin +- Exclude the `@gnosis-guild/e3-wasm` package from bundling optimization. + +This will enable `vite` to correctly bundle and serve the wasm bundle we use effectively. + +``` +import { defineConfig } from 'vite' +import wasm from 'vite-plugin-wasm' +import topLevelAwait from 'vite-plugin-top-level-await' + +export default defineConfig({ + // other config ... + optimizeDeps: { + exclude: ['@gnosis-guild/e3-wasm'], + }, + plugins: [wasm(), topLevelAwait()], +}) +``` + ## Event System The SDK uses a unified event system with TypeScript enums for type safety: @@ -260,7 +285,7 @@ interface SDKConfig { The SDK includes comprehensive error handling: ```typescript -import { SDKError } from "@gnosis-guild/enclave/sdk"; +import { SDKError } from "@gnosis-guild/enclave-sdk"; try { await sdk.requestE3(params); diff --git a/packages/enclave-sdk/package.json b/packages/enclave-sdk/package.json new file mode 100644 index 0000000000..b70810044b --- /dev/null +++ b/packages/enclave-sdk/package.json @@ -0,0 +1,36 @@ +{ + "name": "@gnosis-guild/enclave-sdk", + "version": "0.0.0", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "scripts": { + "prebuild": "cd ../evm && pnpm compile:ts && cd ../../crates/wasm && pnpm build", + "build": "tsup", + "dev": "tsup --watch", + "clean": "rm -rf dist", + "test": "vitest --run" + }, + "devDependencies": { + "@gnosis-guild/enclave-config": "workspace:*", + "concurrently": "^9.1.2", + "tsup": "^8.5.0", + "typescript": "5.8.3", + "vite": "^6.2.0", + "vite-plugin-dts": "^4.5.3" + }, + "dependencies": { + "@gnosis-guild/e3-wasm": "workspace:*", + "@gnosis-guild/enclave": "workspace:*", + "comlink": "^4.4.2", + "viem": "2.30.6", + "vite-plugin-top-level-await": "^1.5.0", + "vite-plugin-wasm": "^3.4.1", + "vitest": "^1.6.1", + "web-worker": "^1.5.0" + } +} diff --git a/packages/evm/src/sdk/contract-client.ts b/packages/enclave-sdk/src/contract-client.ts similarity index 97% rename from packages/evm/src/sdk/contract-client.ts rename to packages/enclave-sdk/src/contract-client.ts index e88850fdba..18500fd48a 100644 --- a/packages/evm/src/sdk/contract-client.ts +++ b/packages/enclave-sdk/src/contract-client.ts @@ -9,7 +9,7 @@ import { import { CiphernodeRegistryOwnable__factory, Enclave__factory, -} from "../../types"; +} from "@gnosis-guild/enclave/types"; import { type E3 } from "./types"; import { SDKError, isValidAddress } from "./utils"; @@ -26,9 +26,9 @@ export class ContractClient { enclave: `0x${string}`; ciphernodeRegistry: `0x${string}`; } = { - enclave: "0x0000000000000000000000000000000000000000", - ciphernodeRegistry: "0x0000000000000000000000000000000000000000", - }, + enclave: "0x0000000000000000000000000000000000000000", + ciphernodeRegistry: "0x0000000000000000000000000000000000000000", + }, ) { if (!isValidAddress(addresses.enclave)) { throw new SDKError("Invalid Enclave contract address", "INVALID_ADDRESS"); diff --git a/packages/evm/src/sdk/enclave-sdk.ts b/packages/enclave-sdk/src/enclave-sdk.ts similarity index 99% rename from packages/evm/src/sdk/enclave-sdk.ts rename to packages/enclave-sdk/src/enclave-sdk.ts index 0b558746fd..9e3311d89b 100644 --- a/packages/evm/src/sdk/enclave-sdk.ts +++ b/packages/enclave-sdk/src/enclave-sdk.ts @@ -14,7 +14,7 @@ import { hardhat, mainnet, monadTestnet, sepolia } from "viem/chains"; import { CiphernodeRegistryOwnable__factory, Enclave__factory, -} from "../../types"; +} from "@gnosis-guild/enclave/types"; import { ContractClient } from "./contract-client"; import { EventListener } from "./event-listener"; import { @@ -94,6 +94,8 @@ export class EnclaveSDK { value?: bigint; gasLimit?: bigint; }): Promise { + console.log(">>> REQUEST"); + if (!this.initialized) { await this.initialize(); } diff --git a/packages/evm/src/sdk/event-listener.ts b/packages/enclave-sdk/src/event-listener.ts similarity index 97% rename from packages/evm/src/sdk/event-listener.ts rename to packages/enclave-sdk/src/event-listener.ts index 11275f382a..1bd13b05f6 100644 --- a/packages/evm/src/sdk/event-listener.ts +++ b/packages/enclave-sdk/src/event-listener.ts @@ -22,7 +22,7 @@ export class EventListener implements SDKEventEmitter { constructor( private publicClient: PublicClient, private config: EventListenerConfig = {}, - ) {} + ) { } /** * Listen to specific contract events @@ -58,14 +58,18 @@ export class EventListener implements SDKEventEmitter { onLogs(logs: Log[]) { for (let i = 0; i < logs.length; i++) { const log = logs[i]; + if (!log) { + console.log("warning: Log was falsy when a log was expected!"); + break; + } const event: EnclaveEvent = { type: eventType, data: (log as unknown as { args: unknown }) .args as T extends EnclaveEventType ? EnclaveEventData[T] : T extends RegistryEventType - ? RegistryEventData[T] - : unknown, + ? RegistryEventData[T] + : unknown, log, timestamp: new Date(), blockNumber: log.blockNumber ?? BigInt(0), diff --git a/packages/evm/src/sdk/index.ts b/packages/enclave-sdk/src/index.ts similarity index 99% rename from packages/evm/src/sdk/index.ts rename to packages/enclave-sdk/src/index.ts index e51ffab0c1..94563e11cc 100644 --- a/packages/evm/src/sdk/index.ts +++ b/packages/enclave-sdk/src/index.ts @@ -7,6 +7,7 @@ export { ContractClient } from "./contract-client"; // Types and interfaces export type { + E3, SDKConfig, EventListenerConfig, ContractInstances, diff --git a/packages/evm/src/sdk/types.ts b/packages/enclave-sdk/src/types.ts similarity index 97% rename from packages/evm/src/sdk/types.ts rename to packages/enclave-sdk/src/types.ts index 21e343646b..c8058a7c83 100644 --- a/packages/evm/src/sdk/types.ts +++ b/packages/enclave-sdk/src/types.ts @@ -4,7 +4,7 @@ import { type CiphernodeRegistryOwnable, type Enclave, type MockCiphernodeRegistry, -} from "../../types"; +} from "@gnosis-guild/enclave/types"; export interface SDKConfig { publicClient: PublicClient; @@ -182,10 +182,10 @@ export interface RegistryEventData { export interface EnclaveEvent { type: T; data: T extends EnclaveEventType - ? EnclaveEventData[T] - : T extends RegistryEventType - ? RegistryEventData[T] - : unknown; + ? EnclaveEventData[T] + : T extends RegistryEventType + ? RegistryEventData[T] + : unknown; log: Log; timestamp: Date; blockNumber: bigint; diff --git a/packages/evm/src/sdk/utils.ts b/packages/enclave-sdk/src/utils.ts similarity index 100% rename from packages/evm/src/sdk/utils.ts rename to packages/enclave-sdk/src/utils.ts diff --git a/packages/evm/src/sdk/wasm.ts b/packages/enclave-sdk/src/wasm.ts similarity index 53% rename from packages/evm/src/sdk/wasm.ts rename to packages/enclave-sdk/src/wasm.ts index 33416645da..066ad242b0 100644 --- a/packages/evm/src/sdk/wasm.ts +++ b/packages/enclave-sdk/src/wasm.ts @@ -1,8 +1,10 @@ import { encrypt_number } from "@gnosis-guild/e3-wasm"; +import init from "@gnosis-guild/e3-wasm/init"; -export function encryptNumber( +export async function encryptNumber( data: bigint, public_key: Uint8Array, -): Uint8Array { +): Promise { + await init(); return encrypt_number(data, public_key); } diff --git a/packages/enclave-sdk/tests/fixtures/pubkey.bin b/packages/enclave-sdk/tests/fixtures/pubkey.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecc1d2934151137ed56581bc7224a9df26d27513 GIT binary patch literal 27676 zcmV(xK7SH@>38;+pv8|cUJTn^>ADH zrw6EQKzB)ad9YkRbbH>0P8rL|y2_H*=-IYd;4N zC6g}~M5kvKMN0Q7)zUkwj9ww%L2=1Ryvg0RR=>BIV81k>V$wKwbRpz0tb#{<(}06? zH=b&FfELL!1)Wsz@+1{xwYfsE25j2(NxQ`AzqgXc{~#-MSv+ z`KQ-;#~NJ~K7yK~ryEg8>X=6wVi*E}GKN1exCuKW#Eamwn-M1qKOtql9*f1*lSDsH zI0Dogzw(iNFG=A?C?Q-$i7wKcOo}H{_7H1+u-k21%9p}}LXFXBbm;OG4c4(^wAQ%} zUWozh{uoHtKiNnpA#zB`ddq<((K zv*0bn4Sgg*%-rF$fXXsk$#ubl&dSHkbA9j5(CL}9SDMxk_6&#`myNsAMa*@!6pzux!L(ti_dY2$L zM`1z+j6^iCNpdC*$|5~d8GmM{3vzF{b5*^fK=z;&7o52z_X#%%*85Bp;tH_)0-AHx1? zmF9-)IJeCy99x|+uilcWSEh(Th&tubpWPyp9>dqT-MpCbRz<;SPk8;$ z@hu%#iEn!TxrOoGOclV>^@rDc4r#m(KL6s~p`syDMIK4yW{t0c7+5wL>Y8q3zgf-7 zPPdMzAxhMXok9S>T3?q!$_Hfp^l8b3AOYP;P4oY0Sq`_$NIoJsVK-@Ynfn_^WM9=( z!Iecu=r(mN4{kGPTq*rmYjIZ-^isK74e2NRN-TJgS@LGQq10v^tU4<%Wudf~pZ|YK z^mDhJR0BfA6U13=NGT?TQ)Qwfrk8~Omk+j91eZONfw^S|9~ql&uf4YeB?zHC7rEzl zIIatCYQnx9MAzTgEC$XQFKKS&X(g%B8?SFAbF|j;lDO7exmXY^5YWa^ct~n-vl#bi z7#2s0o=}a{41eszyEo*|;qeszQAfT^g(@c$yRx#LAalssTHJjEM_Je0i~`oHu)gZM z@l2^cJx{2g(1_4ZPvas??A$^<=3=O%W(bRK$E@Q~T?rr)^_y+H+~eFnQr4Lp&Nei! zUY7oz<}oAko6VpBXJ7{l?-#_Xd_cne5|x{K{QZG$iM}RW_nJL7X7$rXYd$Lad6Vd~ z0BuL-6zGHG)1sYZ92)F%+J#&E(9>Y9WqHj1q(J{jJBHN*APvah-#dv5#)-xSOpm@O zs&UBnSAAvaNBibCqcVp47Dbmbk_v99{VYy+zovwYd`JsiuY}M-AG`@L zI8Li0U$$pyp|Wm@(+9!ANt;v0pIUX;CcgI~2^cer1xXwxOT*RWA12BY0QB%4z;8Tu zN##!ZjKQD`58^5%unke=f{JK7p4Y>J)DrXlpF{ms7a82LY~#nJV|v#KK2=8WNvR6{ zL2GecXnH~67qAt?b31kXQA8$w!n`2Z(MQ}1HiQ9oPTG-x9=3tXwEhbbqF0m!ZoNWW zT6dXMG|y)8=Maxt0!=VMi}9RF8=2`L0BWh`mpz6vdb9PMN7|kiXchd(zyjW&pi=`ZH z{Qc8!qomEwvJ#e)22jetdT~$ycn0An3l7%~p%cg7M>#XL%{@SC_gZJT3i@9hnO{?F zIEDph>~Be$T}7zU9oMS@i$Z;TkjOVkm)qP`Z-z;dK>x%#?i{`(9gw#E^IH6y5{4}v zQ?j)4ZNZ9wJL9*DN=3)4l7R*;2~NZhYNwgGcbqn$_ZC^$HDw*#sDr3h=+a|A%e-$V z7{!EIp+Erro+LBwx2?~VPnO{;_4}gzclX#&$POceoD|!)_YGbuDT+^X25PUY{3y4f zF9~*oNC#!7sMR9H2fVYMDExj*#L9hX0~tb*d<4|)1AqrU-JpV_JgoJ9M*v#!miPsx z)Fwmm3k{5xv5SDK42<}_8b_Sm&k;W2@4r`*mD^iz)D;%U87-r$l~RQJk^pXcPEu(3 z+Xn^+?b-rG=x>Bh(H~1tz1lotls#HBwjdZiPsqp!z*br1h!2Tp#pyBINamSet3=`M?!rWlh@$|qyDT|#$1>T;Sas*{Olc{4mex~=ZgS2`C}(#z1T8?9vh zMvYpj)fCmeIRWYDwXJN=x3aRCNW5e6uxe%S91*?77#3C~+}O6NoPl`<*J}>Z|F!|2 znXt2Y@o__aa2$`H@kf!^SvgvAy|BGS$P|c_P48h214aZXcAadCS~PrhEhB7)X<z6zw{o2%hqU*nLZ zLnS=B$^q3l*0-De>p}=;x;zi*0#SCjSaZT}7V)?mvF2|xp37b+kTf=HM{MpRv(vWT zvT2AnUuVREa|Syl#tvRy4+8Fz=FpEkxc($UXfsQ;jm5By&jPrLP5xC|Dn4GA->_UtqX=yY3U%8&vXnv_qJ06;Vn0U3^enFDQEu{!ilBO_nFJ z52a6M`m;|K&GhH%*kdULH2j5a4^VOtastHPrwRb7tihj3-M!$wQVN&Gq<3PQ?Cvwb z+?&f`S*rR}uIPcJ3;g7h)V>6sN0e&hNB-Kib#I@a<`2NZuW@yXX9t!MhA=#=5u!=z zc)<~IQN2H8ShL78`AcZ{|B{2Wi;~i`LV3r59bD7DsOe$4p)x_S;8lG9w0u1TE*1yg z5aA3T8eIp30wjWzZ7y*W!{aSU-ZaU2-%*A7qWx0>uUs1^FZDS%9Hpl`-pLC zxKF;afrUfe%*I*lP$oBko`Bgh%=|uqHRNuG2gJmz9ev}QCeI(rUK}n!x8G)D7 zj!jK?z$TOPw^89ET*?FW2IXl*4h7S{ z!{f)C-b6fPfgts}c4cy;?IBXdrRV<{`&4XmWv{%f?Lco~O#?xs&4Tfj31FB7M$?w2 zdQNs5R?m>a?47JJr1NlHu#1!Crp;>0!Unml-W9ci);ygyJ305ujRoZJ-K1klr7R=t zs8|=VaPM{PTkK4&!&7YnVB#P5rt`D|AG)4ajB2efG>D41g2OV7#w$eO@tiLj$IaUY z!#-|JIsC!QXbpLoeDuPCI@$9tv!yYiQ9++7{CIZO9p8Gb?NhucK;&XPL!o=7r6qO4 zi{Dwp%>CuR7C?BO(8YTBdBA+@ewGy39Jq8Ch@*2nC1{~>lQW)$5CYKKw+RKN-n7zY zg)k(Uo41z1|6d-t@y>Q1Yw3lrfC%A*nP-foN#Gden>}B)K?2-^sjC5YM;vUqYw+R{ z7Wl0j;DbRiDCy^rY&w8*8^a-HdA2n8FswEy8mM#*bfO6&+SO*^P10vcMr@i764j){ zPD4J`6YYT`ZD|&EjenVLKs-lOcR4F5HypEMk$_f@%Jgvy_HzXEoWb+`#Gc{J&J9P$ zqHs29X=%|gQV;en^k0wnPPTue(CJhGjm1)aT_@G}RXpnnVAiibKEC}+- za1a!G@7Es^D|ERc2wJ?_3$5LYgzvS*(UtyX~hLVo{=(oeHo9XLtA;~f;(e#~5@oE!hP9bt4Y ztqT79+q@o%{wz$HAZDsq;M`weNDPdxPptMIS3-f32KMVDz#Al5lR6i5Vc}! zMSKj=PGEJQI~;Znf5se1;yr<^Gs`&FFhUA-l7PnghZnqKx-K2K!N!E0;OdrW)p^-&Ge;ubJ#^3S>{^&__Tt)@Wwe{*cKUOU~d zb6n0Na5TRwvi~1xZmltE4y&D0|A7oGf*Y{x%JYW^#m~u&+3V{ygegS)1S&!85^$Ap zR5SV z7+jBMRY5lgvd}AI|&tX;1gx%|;cwDpcNT_9>+= zt_+N48yYio+jk^}EIP5~OuJ^sAU3tZV-y_@pfYnQ)8QSOO;DsPRmJkj`BTp|8f0H5 zBJl}P-OSOY&@c+$-777gruCm=^Ly~wfMwP#k0u~`GHUo6WaKP)-7NpqEQmX!yavn| zz&=|DIRueV+qn(ZBmdRun&KORjF~?2$H>Z_ewROwDOsWlkh#xx`Hp0K-D11V4N~I9 z?CzM~We~!RJs)U4L??s?$!3(8>FKHE(_*akw8h=#+P%}Lpdqe4Ln5w3NE5_oCKL>u zMzAfLQqA{Pcp*!i5NdZAmi&k#JNKJKoaQ{Sw%6FBLeL3Uax%2YWBP^Q7$1dJ2bwF^ zNT(tSnPt^Ho;M;MX9FMP@ZDlDTwALgunt^HOtOy3ExN@i*qFwF_4ptw<@?n<_O@w< zZ!UlC1DXfT?yyvVXnl$D5de&w2o)QTE06XNAH1$$5aFbj@z=SFI$oij#CC-`b7~G2%okNw2tEh z2_a67Z)V5yCnK!ZM|mMtJMVdq^H&dB#p;OcKumm{_depIPBLp37cqO(P?JGXdd-ia zVEXTb$(eYyd=zJQv94w&ektmtytad~8qW;_gAqezTDw1iJ6pJ9ycuPm?T9nm-0S{( z!Ail@icHdXaj!rS=M^X;(r{+6Wqqcy%QLab2;rW=?~#aAPURxG>5%N0k?nU3%Gh#5 zuBiaGmqPGuY00d=E*S;TahtrN2wV7`HM~ET?8RxAla42#x+ImKq+bplkFPyLO^E!a zpHLNs@RfP+b$q}v7NhC%&L1y5dznskq{K2(frL8#Zxl@stKkIKmHYu4W**9L3ZbAh&( zk47*!uT-+ivy`d%DIn|9Ob82w+ttgm>!q>a{Kqa%(EQEi2c`hctzE2ujY!RjiHr$E zjs6fcHc$@#G6p!6Z5i_r;S-SRs#f1#^TKvCYX%zTN^V~T#*;g*=2*#0H8Ea*<>J!( zVp1L>DuXmf&bN?f8WUeq&jcK!-CXm~b)2Hfr>4*`mq_#8Q>}o@H)Df~%Q?wF8o-MU z)eF|qzb?M*G>HA;ceYhi5lHIru^3*V0Wi8_ar4YDyRYoQ1G%aGKze9{P1XBo_C5)Q zD{ysUxIRxs+m~a-QED&11Tm&l?3QsX#dO^4{(u$dB3}!Dq-u4{Z~Pl~2oCCl1NudQ zI9F4K=$Zu%Pa3#d7~dLHi_$Hr358aP`(kiU*L%pk_T4*n6z{8SoQGfoA^rlFO?p?y zEs%Furea}jgvcWkS(TdAw5M&g(Rq*f;cb{bXP1Oa@p+8p%1P?^w!VOV2PoqAVninT zI#e$?_p9%E<0vY&n5OPc%*ry+AaTndKL;W}oC<7EO~QPxnbh(^;xvobI@XbML;!aKBIp zDMA5zni9|hI?}8zDtWtt(dKi6wDa!}lOkhXJ8dKQ37XomR+$|%C*Zg;D&l2li+@5E zSB*WWQ>&%a)9x~*vU5hPd~!-s-~Xc_)PlIn3rM4EU1(Z6DlLiVbH7C z9WX)m{|t}65kJp{_P?B$HS2jrl;i2y>#g?ID&x{s61z{M)h4>mE7ozddHoUsoE6v5 zr@L}Ea~Z5lWxO^Th&UVZU6UDaSR6z(Q)>IFWv-{)VS5J(RSXd}>SH6zPSDFG{7hxm z_GYdP!9BP`UP|jgu5ccnb5=zKKDyE=uLZS#JLmtupDi$JP-bC-?xuu8!ZMy30T!fd z^wdO6Vu&cfihO2O)TT(S;je3Q8Bb#~iH?f;sG&W_}-k8bLVKJ@rXxISAC!Fw-ldCUX;i$-+y4~5MQYOriHgWsxHD(-!q zd+TxFtI;IuefOvGZxXD@c^K}c08%u%ylBd)P;3JcDc#I`yr4E-o+B%ov-le$SxG{v z_%yQVY1Dz5JIuQ}+7P_l&C(RA#d)(6mC$)M;1t{}Mt8rTzad9l5^felKv_Da6q(VL z83NzRzTHFq@*8cyB|b^e!~a-CgBxQ#PDtItM6d=bh($ir7k(|gIO`G7#1va%8#UO< z6m40}A{<+9Ts`!`m8vt)d-w`o526A;tV6aUHJHzGxORX^KYl>>D{U2}gzg^GKM|W0KvCu%1A0ehh5RA$rVI{#nBNXmQ{Z-yD(&Us%;HolcIh z?NCfM6N{lX3I8?g7i4E5sp3pFIE$!z{?QD0m4+#*h-hDf1Zb?Kx^_Hwu2!Yx?>)b% z2x?VgyXs93CIvx95w9~etXW%WSnr{Mhlg;0Uh8igQWV?tz^B~;u_*=e(O%2DBD1cW zW8Aqa;@Pz)x@!BvXrLrvMH|uLvALbKUOHdGYM<-0cvYeCSq>7mlQIUsyw7OY$?wDW zL9*nargywL#vKMy8*=NYZAS=~)hc7zq)#F-g7#U#!|mhTPW7y@lRjfMm`PtDdJfQF zDaYsxBd?!NtCV$i+V*v231~t;J$-_)rCG`GtH0mrg2D_&%N=A#+*zHJ0AL+E2qw0y zlBiIt++QW7S2-OEvL*_5peZfHj~ZlfFXxz7cY1Y?LKBk}Ugnh~$x(Pp2--tUVXQ%S zz633&oPe~^NwqmuK~%7li_r%x!!sxyxsb(|T;&I+l+ zq>P!v?H>nKdZ$JavZzAqF66UQ^K)@ z!1hf(cgR1ey}el~U;+?2r>Q95mowFjf4PX8N|`$t^pd4gEdzypC;9AG*_Ib^17GE~ z#Ew8tfZus4LthRS0+lNNX4_d`$Wg(&$Rywr>s@ACVWJEO4~?R1AbvvBwMh~X>E{Og zRZ4v76|PpiAD%jAfbl9I-NJ5wNO9fexuipOKjo^S7KLHgIBB0_`BSvB&nXVg%z^AZ ztCazqJZZ?S-BKl!Ud zH+4d>%DGyau;kMI&Ywng@+kWFHhD-E%GceINM8!b|!ZKXrrf;H%(|8J>{_-PHwz@^o4{3p7epf(Mp92wv5{*N=w z;r?Yg;&WSsm6AET-1puM#rSIOv0yl%h6E2&=cdSlk1<^`6tz-MG6y(cVOl z|14RdWIy0t^#;~iI8mS^IAJpVvpP_&VyhUGl*jJ`&%>W4j?_Xl>q7`yo2%q`a3v1R zh9^sQEm#0zD1fG!W+*7#A{SD{ZQKqqv~3L|1A)OE(sVRXk&XfzpsS!r&@YNFcD_~!{xEPd*}u1OUDAJ~a_C6e zh*S&!DPA7?N&OU354E==k$%RH35nX0DY2fju)mt8=pre5o5<4!NENU%JN;-;^9_M2 zfgRG^euWe_34{+a{;9=S#<<3P6 zKXr69T5b~E{!KtrrL8a3%!-tlZ92O^47v0PAuYRqhU(`t9;AO5z49Cf-EDlcruhJO zVa&9?EH8cmGWPs+!?8=P3C5kw>|LFc3&KG>a=6hE`hsdzBL!ooC#T@_F{xSt=hCB0 z8)u_p-kvLqH7?5e434H3BOI+QSAx zL`aGZAK=M%9Iy}9v2ilha%3OfV2JG31+REtfm0$!*`TX?DL~H^rCd0LPe;+J&t4BY zA)+C-SNjoefIF2lo_(P}b+vbp6V#vgW4#y%f&Io`NP0~3FqIZMxJn=w|7QH`FuBq$ zj|pF1Rr^x3%}npL`I~_lvTXF+_KnElN`q+VGrN}>#3POH1XF*f0^Moh0Z$+q51Fs= z#+W^^i=5$P8?$=c6T0m>JkZleTYcZ4>$**vY!maINR_9HX3iQyn_F=amt$^V%?h-F z(A@*19=c)ZZ(Ws*7gt7tvXdowLk$~q?Ewre9dX0`N@U}id#0(Ah%X87$hb<;dd@yk z{?vUjjg1_?e9X$^%T1z=;fu0k{qlKL=44-vCkbc#Ff*DL(ud63>~_fAcR0vC*E?H0vkloxr~weUECh%lcHGR6>4>#Kg$T-;6R=*}N->s5`SK z9i5I$JPng+_GoFY=n*aPwc_|3W2hm+StQA@=62Yb!LSG$3{I_$l@R4MbxwK3XP@sA zoLAbYt@u{+-td?!d%HbQld>0!h`eetRY~vXafQ||u=CAVzF;2CI}4$y(2n z=Og4tE~8D8OgQNFJ*WGXO$;yImYvHJ8>v$;0Q{&yG8uZ|NYnc8HfA6D13ur-t+$wr zBQV2&^5>>on-gJ_mX)Amy6T^WJGOw9U3xq)c3?8ZhFo5i zlW}pj^xM)u6Us5DO>P&Nq`?To{oS{68p8=_@1*f%S@JY|ar7KZ_Q{i`Xf zjsfdJ6ww;Wyuy&_?c_sNRa#UXWlrn%v5el6+{uk;uiV>3+cP4TDr_DF)s z*C0OaXErg@v}+UABpKZbZZ|Av?LNd4>cLSTl*D3f3Rf}wSA_> zj+Yis9@3eE3iez;5Llo04aoS;H0S5GqnwC0M}$wnjM-Hy(YP$p4ncu3QAnbo-1jn} zAN1g$J$}w&dK3er`N6-cW0+!@kE@SbA)ERTY&cwqRFq|LCSe@LT7)tsM;ka3t`lyG zj?-07qqP3wr8O9`C8!H&3$+rLsB&h4y60!0vNG5&FzqM<}0x%xZCfnjC%@Z`6U~CZPa^EyYoU0(My2?A1dHGan1N?CcAr8=(fd z1&=3EU9y(DU<`u6rG zHhCLw;6bQNRt5_(TQ>4c`U6rh+7OqOy7i<(UGxoK6Mz&&phHO|okclpWzN&MJyzUj zC27ftBD&{_9_K)9!btAr5VSrmIVjzAngU`oKEJ=(@@(Vn>Jy~K^gTGsu@SNWKUe05 zHL0=_I^2Cb8>=|bOu73Z7p#uUs2wI6^%?L9OOXhE{{Ef&er6lYI+&lb2%ogn1dGN1 zo-&w@g+e8UEXfNUI*)9R`r(RmzEiv>69h9u9breSj~U6`l_j1c7h{hB%;qIEZ7zVX z;c{L^X7rn--LLM=)pp|99R3n0&5h7!oLD+cM8BP}CJ`OiV9odOI+H70Pb(d}YOAto^PR`sz;FE|o3~i2yR^xS3@Y zAY5CvI2JmcxG6I&B088%KWXv8pDIV|0Nf?gyl4^TJ_sg2Bh>*i@x<%+EHn)FIZ^~+ zl?r>65XlS(rdPy8Ur32O?cNNNpL7EXqCkayA~>@iv>Ye*bdNq2iJ=D z*wOf|2d@D}^^I~xU5rk*A4gTXLx+##oLWkgxYpd8OvVZd=x?2xl}o+#A=j_iB;dtS zaljHE3jpc=R}OrL+rb=;`pz8*bF=zrTuH%J(oU7154Eh(UAvupl8gMZ-3jnQ{5yez{)9=*FB*v~Zj&bg)07S3wnjxGAew9%K5) z!{NKNL|lS-yPnzB|=|A@bIYUKxv>4^%>VTPNoNfsNR8xof>!eT6DHk`xr*Tb3OPtLWLZa0Seuw{Ev6?RtR?SxIl^?yV zoAE}5VDQNL9#6RBzj3`JDrmZg;n|6c6V?zgLd*P8>c{vXypkVuGaEL+j9La!$8}>& zP%g$vC}p>cgxKXE`dNaL53TpfF?K6eyTHY+J~wAhF*ftEL0_;#(_HHWvIR)i=g}4O z-!Ip}toHUesjnzYqL&`LBQWZm;He6T+)CbI%s*1hVvwii$49pG>FyK!zEnTM1zcr?q@;|DyZK6Jh4fAk z&-=?}ItmBW4d9~eHFh(CFEEYgb!umAcn-QB^sxwwO?9}X@mTa~WqAY!rnIa}?z-$< z0`|Yol`wF@{z4}T8%{ab@dJ(@uaVHZ`Y@O@eax5QZM89C6hakvQ8F>&RgN2zL{nI@ zw9E=`JuHN-qP)Y~+ZRMQ0O#^d!VVAwvdL6{e)Y{A<0d8&`MCA^SJuZ1Y7EGJT&;V2 z0-=QHtY2tCH)h$N-z_bcjm~dKdM&`7U+|m&y>W_46P0TXci~f>;b#=|sRy3F&@k;ybgS-R3x>m639n zN9-I<^Z#H|5nsu~!cFovl~CCP3$%omh>7QfK=~G!|*tq=9gZ!rY$^qC>crDN1-` zMS9=B9AY|&I}ipS>msgly>8HZa1{whUl zZk4a;)<0n~0$h3fReAv2mqT*xxU7vjF;d~dj3Q%T0ecw!1K|Y{X@blC(#-hoOH^(Z zDe&Sb$}1Qd?#vVa?vJUG5izaJ4(R@<%;FGYd!11fwaYn}%YC}g|EwpR5rT4XAcoA&WOO*`f?1)0AhmkT<~UpRS_^KjTNvlH z5*_*D6@@4$5pkL;DTE5(nHwzhy-JQjIv^MSw@e3^-h4$c9gxkZBZ5!nUM&%LYjGY$ znJuUwYA;yJH zd9D{@d48GHk)^p)X$ z}zvw$)S z51fMRzVt=cwfNHcpsHD|D=Kbd_p2XYUrxPWP4^WSySC$s^6lN5ruhn~VAAEIF0Ex3 zmC$Sdb8%65ef)T{`AvW7OxrT{Wd%egOo1|2JU2K?IgFX``Th<#+4ut*=QxnKw3c`Y z8P#r({iW|vtvD$G*ju~junq3o?xczzyx!f_^64^lME!Na7erN0pXqS>0**TjX~Avc z-$=B;h7jmQ3CW@ruH4xMW3ba;JXc$-Pch7yVl){i(*AssKUM3uok2K7A6X8Wqmsie zS!pUYu%V;*;QI68dlC7T&$BQ*=NFtJw4(dp$+fG~yf|}fnwW*RfiCuF#uWuv*d}k1 zM4RH%0TA-oLck{f1KQpfc?-w2W>KbxSyncqS&mUhUGBi%6?LUV_IuTM`Yc?AB1Wh@ z-6Z*#%(#&Kc;v4nR6`1*pcLo|2Dj8BXp5ggr^r;Lf{CYMHal}30a4!^{J5DdgI#`t zTvvUys+K^L0{HetCBYk^7hJ>SL|oD>99ZK_WERoHSj(InEvD?2GprkxTPiVi?bgtK z@!g5GMY=o>@iy}xhQq^=U-A-I>ssEC6!HrQ&7?A_ey3b++d-xjgM8|u3w3ryz6+tz zg;CrgqJU~R*-9Ac9FRiv)@|j9zT7zyHO>>{h+{0D)bbODU3xqc9*gz>1*P=O|LN*Q z;6Kf8dN|dCnoO4#7P$~AZM@}{yoGZ0Q56EmvPSK*)#~6DYk9MwEFb}S-XvW z&Tf61MlR`OBs)Rw4617sV2?ZDLA&zE6#Kod;bn-tcCD~5YF=mNS}X#f2R$j5q z%KwTk3!@@U{t8J9EnHxAmfCc}v)FI;5halwgEh#eAd|pZCdJ0GD+ER|Y9b>U1a9Dh zq3hi(LlQA4>h1%=+3p|#3W#h70uX=@8h~s?c&zfY75kgrE8%Ac)S6j@yBM5F>-;?o z+~x>n?#byPY&EK`OyuHR`qDuV#CRx6@w7Ppqe6jCTh9odsH=S*W!n20mOwnx*R3dq4$# zGeE3vSmv5qY5tleE4wo5smUlUI)~BdiWg}*5q1WMwWn(mJ;JFHT3)8)S7>+ud2`WQ3g@}$8ywokAb4E5Mxvwr2u-DwxLhqNqieW07#*$SS-Jj z{#bIP@YcIzZ=%v9wlKj8O3V(6>@BzE0W_ztp-@}UIeBtB=Mr?Wwna(bmO2g;VZ_H8 z!FY9(Rjigxhyp%D(Xe|INIf{lTDhCk${UZm)ezM{vux2;&8mRrDo}@O~7Ilu-c7QnIGA&_ZPMS8x-*iiV|f z#rs-Y*2gOn>{PzEw|SvavNX7XPBPHnk1k`7BPc$2hrj&0CP;fz za|BI~s6y&`0vHbS5ke+NBN020V+|R@bxbO3cwdZ zcQd#LpP7zjNLO7yJIfhF;&KorFhH|)VWm4)7{iHcuPBT*Y2B7E1zjCUvemru4|cu6 z2VD74oY6c8qs@zhp&!$eh^eS5%ka51zeb>{mGl&0>MR{E#DoV<1Lab0wCCC))G}v? za+X9~?`vaS3Uir5wQ#LQh`Pt+_2n58I$vT9cb}7gp(}0081Vcy`e_oBdasH*A*#8v zu96xy5qWChP9uDmI%C)z2TH7HSW}Vz`T|^lAd8Gk0(K2mqibIuM@*}JWe@=MysG5g zrtN>Qo)3&t99?AsdrC&_%af$j4ax^=n|S=swj+c#Wwi;S3{sRL8E{?Z7~-VtyDVgP zE&_`CV!#D+9$WClin1&4gxws0&=C(w^&+NmR@)IjGPIwhOv6z$^rByWgdJ7GRzpdU zgha3Sp_inNldeD`A+Soaf^qyF!y72F6KN<((gs!U(1*0EiI*V?Y{)RpcrRdZZuaxi z(geC$Y5?%xJ^!6M)qGaMULKkEq9<5h0qA$kE|&^a34$SYR-tM^>zPqF60L5Fg?;-| z?Au-gp^Z-wJ3Y;|Xmy1RQvdVUef!F7*oERqVfe?YESHYnFx8AX7wM8Jlj8l59JLg9 zMj#kJg3P(U40fH&#?j9b6yU*RB+*2i`9EH z*YkX*L*djkCz%P%amPJ+%Ydd#l+mpn)O4*6wPoOIMhghfAWHAtJtIMiX2pEoVuU?3 zH>yuMI^)n0fJn|sAhrfI<8+x5iJ6}(zm!Fu{*7J_X>Sprbn<>f+%DEG9iSMUAvfcm zn=n79R~C~TZ8cu%B^~((n30(!H>Zr<+;JGjIDVO(hncO=!qJ?##4dYwfNx!NO{B)0 z3sBy6X`KvuTcr-?hf;ExcD`-Y6Vjq{!VRL~7J2f>SeRO^_+K*a-xmM3gP%GNiinb< z&m(WSW8AzuFV3Ja@iX8y=FPbnw&L+lvn+-xAa^N6QM`QAetMrGw1p(bB&BQ-1sV~D zz(QU^5$~kIOF#8PqYE|j3KV(QhIFP`jdKq@ir5?J>$5oLKs0HZtHfeDTd%zPoUd)M z&{+!R6;9+VdX!x7;(t&DO4GVL-^Fu|xYT7L@wiK@KD8-vau z&z-Ii8r{Fx@es1Yx|RKEOKHA$r4i(Fm~s|!W9ZjxvjM8|6k!ZguU;!}+n#nxEK}?F z(>Aoz`TH<{J~v<&o_23P!{SOlhNEy7X~rW#34$Dz6!4SW?#5yI2}5!8b-(SV8E+9X z;Snpzlm7XQn*4(=)KtI8jp2~=Dm;52Dm>Yz!S_sbD3&#Jv*h|ciw*WzT5p^@hmT%n z(&!XO{_4azw>Acx4v7)ZmZ$j{wDC96J|rEcn|G@>) zxh@{-&>@V;JDKm;_WqF7`Ick9HSOf% z;TEVGNx#@g7_^+=!=OxT6KuKNLvMc$aU4T_Jb@(*SH9JW83Jkz)YV_F?KlkktD11(U5ImglM?Q~EM&@p) zQgfU3j}964p_o~uzS~HQFX(jMvYJ^W8B0fn;njv1BZ}l}{*NG?vE0Nk{}6%vGkR5r zymj6V{B(?$jN)rnyQ*l;s1|`K)HMd-DhBQII<|;*G-&SXiMmoFgpA zl8I?m3W-o72zBF&hEvv$I2betr4C#R&_23G;i;llh<=8EpYXFW%Z5JWGLCV=RL9_y z`W57k0hL~9b-yN@p%+u3C+*+F1?guSGW3zHF6E3x;K3>)WL#SPM}FmPDgJ8_j;2C7 zjYP<-k4^>>eOUAfw#sfx-Lq#Tj8*<;XXoFj;D^lsBFW_N*#Y%wA{e7(XxIItLvK98CJa ze7Q4Xq@YV9u@SInkvGYi;c3WY*A6d{0{Om8OeTW4B^a;?&Vpd34fh_B<8YEMYSqKB zzKjKXV|Gkf0sw>U8_5|FuRd4)7e?E+v>v)xOjsj_ow(!!3Xc!Ebp$3v|7D0;v#_2b z5P&$;V|2Nz%3UjI8(Piafq-X}()kV=txApzyoXn_zuQ=DuG9VoRv)_Y$ zzY08^6ZxwIL!5Ao1BMeZJ12t%*%>yqu=eqI_jLa8W0@c4m-Ckslw< zT@;4KXq3D8$)XKuhkHO6T*AAGgT#YCwzB?*;XuOdth#0&!WwEWVO8s^Xl4X}H zdla^!oIv0W5SQIj_jo4+B{0L4G*OL+-`j9Z_-=RBf5YTkt6t8)WrO8lwcJP#5px%c zNXE)L7XLKY?ZiJ_Di3bXcBB{8y?=vhnFj5=L78F<5k|Epn?fb3M+JO|JKbjDsl>r6 zXQBhX7M?laK8pX!l~lTP4IuW_ZymZQVG_0<6~TAhu27c!&)fvT#<4$`y_U?R4@Vos zp7@0wVlMsP<(O~K_xKdCMbnS2`V)v!nj=eLioyv6ZTT-tIsXia>P$zU7g=l%I7C4C zQmhl7EvUgv{M3Fhep1CZZ^h))Q+5q}v!AkF1E=C#r5Zf%48eMc;q`YNM;ej?+q z{Cc{rmOk@3F?M9=N4E+hA)dvt-w(AZK;FT%RODw&Cp~r-ww)qs|6-Cd_!mRHFw?*? zKFx#ldZjLhzUxDVQZPs|-~eB6K4IS>OS4FH>n%={;b`v_*3*A)v`i-lm>=uMQXsLH zv(itWO!#wkzAjb{r2Hfg4sDT3eeuTU&!;|6$lSZ>;_(8C5CzA?C?g*~U8F>)W@Nzc zNAoAdk%9P*O|Nqb^T(i$Y%YrZobrJUNX2X>Hrl#I>8sH98F^TEiyoFLB07ff8#H~Ti zOTe8(0T6#}-4f_d*j$Si(d`m5dlfJWiJb&2&`#qgmtANZ0171ZU7#X}7iiVcfr5f0 zH4)d>hIj`zx&$UNOY_!L6UYLuE={f&(zlcp~@<>Nx%(Dho}ua{}$~ zN3IlyuYW`W5O{{MsAP?jt{f~OchzcNw~S+OySx88zc^W94}wHJ-O zZ9WABA^u+_I&4+fN8==^Qd(H>p$M1*S%ZR?(Y$n@o6rGlg6E1}*Af6nLNKHSy#xL5FGu@|dJ_b>VuHvJ-l( z%?Od>%{{b_;+$9Fp;HNHP`&cVF^rKUOz$nyls1Wb8|`v}IT?B`0+a&g(e?Po-#%@p z1~IH*HcL?FtID9QT|}#ZQHE0j6~vl^FL#@8zO4<5WfP=Ns^S~`RLH2=H1~>m5HT=Z zC>4L%o=K{y*XW=Nhu5)8M0k%LLKh_H#2Gu!gegc5oT%Nv$@5a8uoCLjqs<#|&d@s= zK3v%VAKBSn39REW-K?l9V9ddz{CY6J(ql6!rtaRN zNy_3LDS2nknRf10*dKVf6-Run()g-k<`zIHU|U48=6)7Gz;s)(BQB|Eb5ml`BV({j ztZunK_5R#?wZphPk(b+wKD;2u4>gUcD}oPY?*~(drx3o*_cnQ^xfHX|8{ALE8rGe? zYlKHnxOIdxBD-b5D{OHAEwL-dq+6V>?KAwWUKP;+r;nD+PV0}E?TJS7h{-_MM zfN(Mt7E5W}crYGNpB48s9DRAWh5vZrE#UReKA!cRyzpOH5Y1@q{($t-dzI7wQ@Z25#@@K(y(7=}MnG zFL|zTi_qujFJM$FX%4{R3G2?4H*!lvV2|JM;Sf0}g}~7gO=H$dT`Y)PR?XR=i7uHf zNf=Bg#MybO;$m9}z=uyFl+jwvaQ0uR;D`{lF9r9M@?$dwCA%KQ-u8UPGNJba!9fo)xa!l@K&u~Q0rgb#-PE3wmFPR#E!6mw8#4#$AI3nBr4m2UD(xy#n8)#0haH4HDy8~4Y$PWo(GhX9r7aW#i*yzz%JzcV& zAHY&NP}j-Ptpg>YHLSYQPBuLsVD5clf$S`qh5(ZIxpa;DIN`2>V7@6k`p<}9@MTNG zE1C#X|0xgCFGUo+Zpx)->mO+~QgsJACS=%+&mM1)%Wi4V%H@nL4I?}Mwu->OPi{E! z8kt~OkO(UyuZVDyr92#2a0DboVt54}29MF`lHpnIM@?O^p`s!|1c?yYAdO~}}_ zQs0@gP;&PRi^z*ttNPsETwC2K8jEc7r)z`sveiu!C?KPOH)hh$w(vnJ&Zea651`Dk zYwO{y2gg+xd#|{1w%mJ3Fjnzl-uh529oaNVD=pQj2<;H{3pihLfL!hrEj*GR{div_ zvrGdNGCcwt`b~Sw-VthkV+SLY+ojaNxX<qE?A61$NgyWar7Ayi&c_JW7bYNbP=qMKp&ELBrdQW2N z0#^^V^!DGj%8VH6p6ts)k?e;0&T6LYpfB+(SxH_sG-+b{&qf%=1c#=_HBo#^z~dcZ zd*1hg3-Db}K23GBEriBZHT%@{V!Pa-0lPEfq1}Y)w*EQEGPRY2!irD22rTZJ`vD0G z`k>`~getDAw~jLB-x|6Y9a04vdtHny3U;T~6eepRq*@A#jfBHsGGC=7fA3oHY~+fe zTy@RP2rzbPBVcZ@gXVPx*QwSNjHk;fJHS=zOX-rftz6yJaxpex14YE~b^Z}cb7yg6 zo-7hY5xFb^-y$h7ys!UwHWizf9XtvC%##qdQF2%eSR84SvC@zbjC{#W!qg#6BJ9bE zPI+f5=b_)W>yowdoS^R*LV8(=)_hOq?6jy6(arXObI1Imv~_803N_i}+$7;qWzROV zn|JBz*btQ{9iUSArfJa&y) z+y-U0)klmKAb|2q2FkhC`4S9?en3TZBr?dSN6smxhr6&V9CFbub7HQj=%ZPmRzY7A zy<(QZHj_}F`cLD0Y8>og$%e4!U|TA*zTxrcRkqop8_`s9A)?m$T9}(y9Zs#t^kzdg zh56zU#Xb#0l0@Fj0>@rt1HYI4!$FFxukbzr>u}bW)XWx5&S(rUg;+>P{2lno3|SjT zEh6P54O)q64cQ-mrg8y!x9O4SRo9Qtt{?Sz%}xJBxcqD*e<(7PJHTJ=qkyJX+s|pf zw;^Fuu1~zHge1?>n1q5=QUB9D;{qMI>h-dxH(Bu{IJo%G)RGMn(m>q=$m`R+7U~t1 z5OLr%AFuOCQU8%@}4T&N?pwouH%up~yyuS^=o*!v4W@=m7p1j4EA!O425Q4lYa^H%qQZ+ElO6NgcE^fl39c>NlJy&VW?2l( z=%i&5H3ju4OmA55fUI#t{&iR zmlJ-?2z(huR{Bs@P5+1`Zv_W0MRR#~%A?9Ax#En4(;CIYJSixj41bfH6GkQ#vEv{= z0wsL}&bK-O8l5H20KlniBFt1oWhSrQmdeWcAu5iJBU|8$`KCv(;h9(@8Ty{^A~Bg$ zdmpTK^86!OGgX-3p`Q$%b3poL-;otQd&rMCG7?I>n?Zg(w&u2%d7UFWsA%B?@k%t? z<>SF?gerMGekyLs4(gJFN^GAB9}l3*P&2^@fibAk{dkUQ&Au&}_G;cldO zcMat#MK>u58mx+&2{>Ba}J(ec61MmU1W}yW%5nQ0>_(;c*Nb{p9VbYiI^~cAeL1^$Vx?{-#(Z zETve3iL{es+UW}3J%#lc`jlJy@i+h%RgEm+c)P~-w&5m1ST{BRu>L4mmJ_Ce$Ail@ z0+U8|%p!Tfl|yhl?qS+()sk71bgykJWuR)}SY&;@Lzsf<4=X=*$c4I-IFjj|tjYb@70DACZhGW%9cUF5- zyqNv?$Xocc%d9ipBS0w01WTs%5&TtB_S59~_|y|R#G0}UZ-hfg^CK?ddo(0Sxni=2 z@PyTKaLC@MrfPg5gN(zi09}jQs zNh>gQG@uYAQ4fCRMAUkO22;{O4-(9?L|omO^81%JAMK&Zb`cO_0U5ao*C3CaIJ7C6 z>D}%eSMkf*H+Fy1>dsho&;}_gZHVi&2&ojLn$tQ<_SIZJgSt4v@^piS1P>Hr!^c|e zy8Oizb}0ri`3s)}Gg&NQa{PKAyVD_nOsGu08|d@^0`&NXLA$d4sm_I?`!Dy3MoMJ4 zS9j@?*Kp5DlLFrNT_lZis$QM2vGFKtiQ6=-`{cFlu0nkKrE;eg8%t6Z6Gh)obE4X9 zQ0aerHXe#&m7hXk&lQ6A1~ukwzZo*HPyUAg+4^3$yHkQ^c;+TR)i~!-RMNAje=Q1O z`BSCxm|6D}_}6a7dt+YwKtnG+8Sr<7>UVis@Q>7)pj{oSQP8EyfzRW26@8ury?~aX z_vZk|W@%D5MK*Ph2$_1XvlY^d43J<|pRb1VZfZpCt1sYc1M@+F(i>26RHi?BZokd;&IZ#M;@iO{F#Pv)L}Lc2 z7mIT$00#Vvi)!j9Oo|5c4Og>_K%=kZc88iolgzMb zHjhh>-QX0UTnO%TA5+@1d#<4#hUo`k%P_nNM3;^&UaQHL!krWs+ogd`4uX$Jm*-+6 zWiz1<*9|?5nsI_`nvEZZ&fiq(+-*DsKsqbnNA;xYQ@HUWi4y)fm)69mOBWZdzVTsT@z@(xQ*f}8VK-{!nnGLLDbHU> z(G>Eafu-K2#vDYPkxPUJL=*0RBcp&h80jP+IZsg}zycgMkQs#YaTDL4xM)n>>&-o9 zCtM$Y26XjfKMYZ2P0cHuaz32zYRaZ9K&HsTx#fMYxg9d?VTGdw+%aZM;gtCpG`hCe<&VJzVvx?$*Xl6sWNfQv#K7 zd_cSLkRTqQ95c;+>S9x_McIWM{&Lpi6_W!*xr_ooNKBQv*tP?j%%rgf=yU&*UWX5V zFLOdo!N(BE-*w~z%Cf`Z_xEl74UV#oZA4!AMQqTsOs~(bUyQ>coAs%qmQMedY3Q+I zfI-UDmc0H}TAgUhGRLhUMJi{N zL@hO=mG+2+R=NQ@{=Ab@uE;30 zb*7PxBk@!ONkd^>SeNja(9FY&H^1rKs^lMh8=vLu2T-!C(Q0Oe!GePfx1?t`uP)l2 zRgGa|K?zgSX0rfCthtaiJJ^1G4?opfG%gaE32$g{uRpG#E&qAuQjaL!wI!&9dq&BH z1V(Q%B{=;<$*5tlml&eq#q-VS;9CnA=T|OJqC<9a``7cz1x2AJQD|7)AL8$@DEPjZ61ZmLe#qSE`C1tlV= z0(~kv%MEM>vvIa@A+*l3C{Zfu<>jT`=E|9VW2PS6-GOSryaVYP6{;K8lg1j})v9Fq z^09A0m#b_wzSbLv8C>!W-o|*VmslD?+Bx5tf57)yon5iwCQ4g{g-z}r;=v_Zi7o{G z6*oy91f5cfOd1IFC4`sgug63kb}PW~?DfHBJ{&*fV4=LBrX_4|(N#oB3=J=X+6H?&t*1*_2kSHrKA293l; zgu|M7HFX6*ErB**-JdyYv{iS{69i4e*iR2t8-5kSH0R!x2{k=M>`pJ8fa0u(S3;P< zrN*zJZwz3U)|aHy7gl0iNp(G}lTv+;)k8vrbg(vM120r)-E-sN@a%XVzn-}zc4tG~ zZNl~1G77@n9NP;#qh3rMPA6?RWHr$fTaHNyFblAS4K*?WqP+pKcyTTSCU&pHWiP@h zE8W|8=`X<)@v%SqEx5C7@?E#^93EGRD4nI~^J)7TuCpAhI5m$#&?u};6`ZL-YFn^L zMVj$2LkZqGRUddvDlr~X(9KpJ%|u7AS+tcpZx?k`3h5{I|9x)N-wxn41Ku6%tmKGf zJ4Sp}YO8=b&0U8xi?}+%k&`{~u;j&!T>@v+eG!Zq@|L#i!clfmhYvUQcgM*sfTy|% z&o5on!+B{94Li7a^-NV7Y#5(Qan|0a@R7jBe4_FtU&n<)DZkD?&@Ec&W%*&@+M8#* zK(P`)3PMo_%VQzd#B-n`J8~E!$JijK1Q?{9vzIyBDG{gdgY5H%4()jwQk&l^Y?yX1_b#HUBg`4$;7u9^_o22HpY%h zO(B!8#63=>Q!VZKIlLYxmd>I~3J4mV`<51A!lhzN^i3~oTn=|wM1giLmY~MmP(o4I z=4f6_&d8quD+F!d1v7*3AUIW5R1lk4c5Gv33tw^K^wf+P?FU1M*e4lPf&ad(tU$8| z(4|}N!Hb*V@0g=U)aFa|#djvnH7j&u?;O|^RDdkH*O;XuO#>-wMuibE+x+>)qa~ z*U2{YJ%`-wwBk+1!Fan17nRe*dw`XYVpJX-=@AFMMj04n9u?(hUApUs8ZmHn1-nM^ z&7>4P|F?gaW^^ellz>Dco(jzOA4lSD#T4Q5%xE+1h}OOm8|HjEtsnBNy5h8^y$O_& z(<~2gQ*u)$0PwXs?(wcT4bywOo#}~u(^$AN9HB!3Klf4DhvHD^g9%bvTIG9G@F<{O z;<69mVLZ_k#sK#Xw#jb7eE`Q{U-#cVsLSw|X&;g{_Hr6yvDYs=Sty3FdMdsjD=2fa zCzaq{WAko!?G}`po^_p~w*pFfOp=&BEd|^!5)}AzWn3m+ODD|EXrnGFlg6`rZ10iI zA~Opifp2qL&g(Y_({48uQZOb$GW*rdS8Qc@NCIr&fGZ(ktT7Qgn1FEfYpMQc3K#$j zu?*tFnrZ9YqHD0yG{|p^PRLaR6 zQH+#rAUN+z8G|iwZ~>dz+H6@)H4s45+*tY_zZ1rO0<9Y;HBTnhQhj;^{EMI5p*7)3 zZoTHbDY%}6a~!%J#H#=gr}mpT(k$XD98kyENQo5lrtYRTq9?HOrWkHBXR=0-v`$@> z;cP;1EaK0Zm|U0LNKTG(o%N|*?HkR+IK-35s%z^75n zyZ`i9tXNLPOJO<-TIoJ)@ySfweropFCHHkwM-NDn=wQFHE^521BFw@6)@?a}g82W9 zPhkGk?^Z}fAKLAmQohTWP5cOu`-dY2TnHs%+x<;jWwny@+b9ZF*y*EJ5M2GgsBPJ< zEaLJir3cG0T*r+fFWJgr_K6 zU{cEP6S+hD3~h~@49(p^vv@j>Kj&Y{)s+~#+WO)7gF~Yw6gE!{xmTFttdrPLmpe3+ zk$R+q&2)ZS3GUD`Ls7Qd=kqy50Duoeac<`hts{@d*F%_2xxf&*6WHiT4chU9E+Nx6 z?yZx}GNWH}82#Dc2J8yeFXB5?bSrg3Y>aWVWSciT9oBwsdJIHieEoZWtmV(!B+ zsjw^ulU`>w7g(Tvw6ZL-=Z{XLFU>a#I;5R)YoV|`*X3Jatxjwx7D-ZiQ zq3wrcZOE#P$b%+-tY9M54bo<`>y~NIJGmas<^P0r<@Pj6tTJ)*{O}> zRdJPla<-uL9C74^qZ#e+cyNVGDmI*8gvsC2#+dbBzygDy>@AF%a@m8MCXJ<>qR`BO z)}_u1nvjZdHU+vy-4l2b z47mee6a6UIB1dOs6x!N>P@W2Z>Z6C~Mz+DBU`n+&mG-H^J^qgRh;|ow)F>G` zLb1rnNKCiaXW#OpY*62+RA8cWW{*hF|NUK+K_UIJ)dxUp)^l=&AN|nPJTn`!l+RH+ zt-jAsap~OM@1?JQGs<_lWAo0rIfbkAKX_2&U&%7jiY~li1cz&6PoPU| zmEKjAWsrW{4AV)IM5g7#z~SKgvO!x>he7i6*)K5ukT!nEe|>`VL+DUoXz{W_b9${8 z1)9@9MNnBn249JsGu1bWqj=Q>wfO%?6%2O0|tXDSGTt z%FU@BRiv`C?>c9=EzAZr=`893+;ekh1xO<*acdyf z#n3B6$}(j4C&$$8M{VGa5Xk@qTsPYKBt?*zSNrR1xQzGt5L%!lrOSt-n|Q?AslO;` z&rX#H-v9pH35mK2HIftm*j=(UCm|>WO|c~li-Z;;HS3?tbzJs->iB?NKfWP>2AE$huN``vKDkmi&W$qty$zwRgY6$=E;yP0K{v&*PamUJ zsHQ(nH>Z*`1w^*iRXmZ_8H%`ezwkM^q2M91vbd}$y$qmy2~^MH4JvF_}CDA5?OSG`*NC#e3<0{l6PV>hCft6d!P93C&p;e@q6v9A=|sY zi*NKvH;Ox=zPD2GQFlj*@mbPJQh3?&aQA|SEXCpfxe*6i^r}s*8bGy-os_Mylnn5> z(>^t&A5-RCwll2m%$e?FUDN)sQ|D0ud%)$>oLirn^kT%_(~(bOu|RL8eAb z*dq!DDxyMF;`s{cKbR~^w~- z;|;Gwq@n;#NcmQ3>4WM?8L7+Aat_t5aEpWxr;crCES<)6lpth=LTKD)@-B*r`*tPd_itNS&-#vdh*A(#e!o_2L*5OXtj7Li7)-CeWwn(mD zxrX@fR#(xy5o~UgM#Dg`b%NaazFsJE5v`#7&@OIohb_61z5j&u^MnZvaFa+LWYbYn z(d<<>>t<_}nS7PLVb?CFC`!fZfAG)JXg%DtDpo_Zf;x?^a^(&hCvyU*pXnj%@8Dq# z=WCk+X?`77!@bL5m-zMSgJnI;MX>KDM?t2%x6UAhA3t_~4MQwPEq5gex1-+)NImVUJSQVk<*n=UXZ=qAoZh#S=DUPtK-xG${SV3=CUr z)f|qtx?t-5h7$0h9;u#*d+V988BNzwzFhu0jqNgj)*v78fCc6#$xrtY^KYNjitQCJ zS1io=vK?j&zy?0)@Ogvxu@1pHtIX#5=6YCpWf|8JKxn$35?+p`*nobcW1%@X9xnT< zm~(g;IkJ>bhJFc1^M1v7l;`q)qCFi@`L)VH$i`wVF9h4k+mFhnZB;cg7Scu-*z5LZ zFSU=TG1b2#(ACvoI|^4@>tBy)VaM#1BiLYQ(?$D)xi*g&_-lDWb4vAyW(XYEIos|hQnk%w=Fzo+|Nt@WM1}+ bco9C3!%!1_PAAwSh10P literal 0 HcmV?d00001 diff --git a/packages/evm/test/sdk.spec.ts b/packages/enclave-sdk/tests/sdk.test.ts similarity index 73% rename from packages/evm/test/sdk.spec.ts rename to packages/enclave-sdk/tests/sdk.test.ts index a47057d0fe..20703c2732 100644 --- a/packages/evm/test/sdk.spec.ts +++ b/packages/enclave-sdk/tests/sdk.test.ts @@ -1,15 +1,15 @@ -import { expect } from "chai"; +import { describe, expect, it } from "vitest"; import fs from "fs/promises"; import path from "path"; -import { encryptNumber } from "../src/sdk"; +import { encryptNumber } from "../src"; describe("encryptNumber", () => { it("should encrypt a number without crashing in a node environent", async () => { const buffer = await fs.readFile( path.resolve(__dirname, "./fixtures/pubkey.bin"), ); - const value = encryptNumber(10n, Uint8Array.from(buffer)); + const value = await encryptNumber(10n, Uint8Array.from(buffer)); expect(value).to.be.an.instanceof(Uint8Array); expect(value.length).to.equal(27_674); // TODO: test the encryption is correct diff --git a/packages/enclave-sdk/tsconfig.json b/packages/enclave-sdk/tsconfig.json new file mode 100644 index 0000000000..0ab9246f05 --- /dev/null +++ b/packages/enclave-sdk/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@gnosis-guild/enclave-config/tsconfig.json", + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo" + } +} diff --git a/packages/enclave-sdk/tsup.config.js b/packages/enclave-sdk/tsup.config.js new file mode 100644 index 0000000000..21d41b63ae --- /dev/null +++ b/packages/enclave-sdk/tsup.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from "tsup"; +import { baseConfig } from "@gnosis-guild/enclave-config/tsup"; + +export default defineConfig({ + ...baseConfig, + include: ["./src/**/*.ts"], +}); diff --git a/packages/evm/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/evm/contracts/registry/CiphernodeRegistryOwnable.sol index cc79d02edf..3a3c25677b 100644 --- a/packages/evm/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/evm/contracts/registry/CiphernodeRegistryOwnable.sol @@ -24,7 +24,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { uint256 public numCiphernodes; LeanIMTData public ciphernodes; - mapping(uint256 e3Id => IRegistryFilter filter) public filters; + mapping(uint256 e3Id => IRegistryFilter filter) public registryFilters; mapping(uint256 e3Id => uint256 root) public roots; mapping(uint256 e3Id => bytes32 publicKeyHash) public publicKeyHashes; @@ -80,10 +80,10 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { uint32[2] calldata threshold ) external onlyEnclave returns (bool success) { require( - filters[e3Id] == IRegistryFilter(address(0)), + registryFilters[e3Id] == IRegistryFilter(address(0)), CommitteeAlreadyRequested() ); - filters[e3Id] = IRegistryFilter(filter); + registryFilters[e3Id] = IRegistryFilter(filter); roots[e3Id] = root(); IRegistryFilter(filter).requestCommittee(e3Id, threshold); @@ -97,7 +97,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { bytes calldata publicKey ) external { // only to be published by the filter - require(address(filters[e3Id]) == msg.sender, OnlyFilter()); + require(address(registryFilters[e3Id]) == msg.sender, OnlyFilter()); publicKeyHashes[e3Id] = keccak256(publicKey); emit CommitteePublished(e3Id, publicKey); @@ -167,7 +167,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { } function getFilter(uint256 e3Id) public view returns (IRegistryFilter) { - return filters[e3Id]; + return registryFilters[e3Id]; } function treeSize() public view returns (uint256) { diff --git a/packages/evm/deploy/enclave.ts b/packages/evm/deploy/enclave.ts index 837d24faff..6c1a1789f7 100644 --- a/packages/evm/deploy/enclave.ts +++ b/packages/evm/deploy/enclave.ts @@ -1,4 +1,6 @@ +import "@nomicfoundation/hardhat-ethers"; import { ethers } from "ethers"; +import "hardhat-deploy"; import { DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { PoseidonT3, proxy } from "poseidon-solidity"; @@ -10,12 +12,16 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { deployer } = await hre.getNamedAccounts(); const { deploy } = hre.deployments; + if (!deployer) { + throw new Error("Deployer not found from getNamedAccounts()"); + } + // First check if the proxy exists if ((await hre.ethers.provider.getCode(proxy.address)) === "0x") { // probably on the hardhat network // fund the keyless account const [sender] = await hre.ethers.getSigners(); - await sender.sendTransaction({ + await sender!.sendTransaction({ to: proxy.from, value: proxy.gas, }); @@ -28,7 +34,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { // Then deploy the hasher, if needed if ((await hre.ethers.provider.getCode(PoseidonT3.address)) === "0x") { const [sender] = await hre.ethers.getSigners(); - await sender.sendTransaction({ + await sender!.sendTransaction({ to: proxy.address, data: PoseidonT3.data, }); @@ -92,14 +98,14 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await hre.ethers.getSigner(deployer), ); - const registryAddress = await enclaveContract.ciphernodeRegistry(); + const registryAddress = await enclaveContract.ciphernodeRegistry!(); if (registryAddress === cypherNodeRegistry.address) { console.log(`Enclave contract already has registry`); return; } - const result = await enclaveContract.setCiphernodeRegistry( + const result = await enclaveContract.setCiphernodeRegistry!( cypherNodeRegistry.address, ); await result.wait(); diff --git a/packages/evm/deploy/mocks.ts b/packages/evm/deploy/mocks.ts index fb6760978e..083d2a6dc6 100644 --- a/packages/evm/deploy/mocks.ts +++ b/packages/evm/deploy/mocks.ts @@ -1,9 +1,13 @@ +import "@nomicfoundation/hardhat-ethers"; +import "hardhat-deploy"; import { DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { deployer } = await hre.getNamedAccounts(); const { deploy } = hre.deployments; + if (!deployer) + throw new Error("Deployer not returned from getNamedAddresses()"); const computeProvider = await deploy("MockComputeProvider", { from: deployer, @@ -52,7 +56,7 @@ MockE3Program:${mockE3Program.address} ); try { - const tx = await enclaveContract.setDecryptionVerifier( + const tx = await enclaveContract.setDecryptionVerifier!( encryptionSchemeId, mockDecryptionVerifier.address, ); diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.cts similarity index 98% rename from packages/evm/hardhat.config.ts rename to packages/evm/hardhat.config.cts index 33c08d1ac5..036b4c3445 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.cts @@ -1,3 +1,7 @@ +import "./tasks/accounts"; +import "./tasks/ciphernode"; +import "./tasks/enclave"; +import "@nomicfoundation/hardhat-chai-matchers"; import "@nomicfoundation/hardhat-toolbox"; import dotenv from "dotenv"; import "hardhat-deploy"; @@ -5,10 +9,6 @@ import type { HardhatUserConfig } from "hardhat/config"; import { vars } from "hardhat/config"; import type { NetworkUserConfig } from "hardhat/types"; -import "./tasks/accounts"; -import "./tasks/ciphernode"; -import "./tasks/enclave"; - dotenv.config(); const { INFURA_KEY, MNEMONIC, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env; diff --git a/packages/evm/package.json b/packages/evm/package.json index 86cb65dd0e..2f01432893 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -9,29 +9,40 @@ }, "exports": { "./deploy/enclave": { - "types": "./dist/deploy/enclave.d.ts", - "import": "./dist/deploy/enclave.js", - "require": "./dist/deploy/enclave.js" + "import": { + "types": "./dist/deploy/enclave.d.mts", + "default": "./dist/deploy/enclave.mjs" + }, + "require": { + "types": "./dist/deploy/enclave.d.ts", + "default": "./dist/deploy/enclave.js" + } }, "./deploy/mocks": { - "types": "./dist/deploy/mocks.d.ts", - "import": "./dist/deploy/mocks.js", - "require": "./dist/deploy/mocks.js" + "import": { + "types": "./dist/deploy/mocks.d.mts", + "default": "./dist/deploy/mocks.mjs" + }, + "require": { + "types": "./dist/deploy/mocks.d.ts", + "default": "./dist/deploy/mocks.js" + } }, "./contracts/*": "./contracts/*", "./artifacts/*": "./artifacts/*", - "./sdk": { - "types": "./dist/src/sdk/index.d.ts", - "import": "./dist/src/sdk/index.js", - "require": "./dist/src/sdk/index.js" - }, - "./sdk/*": { - "types": "./dist/src/sdk/*.d.ts", - "import": "./dist/src/sdk/*", - "require": "./dist/src/sdk/*" + "./types": { + "import": { + "types": "./dist/types/index.d.mts", + "default": "./dist/types/index.mjs" + }, + "require": { + "types": "./dist/types/index.d.ts", + "default": "./dist/types/index.js" + } } }, "devDependencies": { + "@gnosis-guild/enclave-config": "workspace:*", "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.5", "@nomicfoundation/hardhat-network-helpers": "^1.0.10", @@ -45,7 +56,7 @@ "@types/chai": "^4.3.11", "@types/fs-extra": "^11.0.4", "@types/mocha": "^10.0.6", - "@types/node": "^20.10.4", + "@types/node": "^22.7.5", "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.11.0", "@zk-kit/lean-imt": "^2.1.0", @@ -71,9 +82,9 @@ "solhint-plugin-prettier": "^0.1.0", "solidity-coverage": "^0.8.5", "ts-generator": "^0.1.1", - "ts-node": "^10.9.2", + "tsup": "^8.5.0", "typechain": "^8.3.2", - "typescript": "^5.8.3" + "typescript": "5.8.3" }, "files": [ "contracts", @@ -98,12 +109,9 @@ "scripts": { "clean": "rimraf ./artifacts ./cache ./coverage ./types ./dist ./coverage.json && pnpm typechain", "build": "pnpm compile", - "compile": "pnpm compile:contracts && pnpm compile:scripts && pnpm compile:sdk", + "compile": "pnpm compile:contracts && pnpm compile:ts", "compile:contracts": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", - "compile:scripts": "tsc -p tsconfig.json --noEmitOnError false --noCheck", - "precompile:sdk": "cd ../../crates/wasm && pnpm build", - "compile:sdk": "tsc -p ./src/tsconfig.json --noEmitOnError false --noCheck", - "precoverage": "pnpm compile:sdk", + "compile:ts": "pnpm typechain && tsup", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && pnpm typechain", "deploy": "hardhat deploy --tags enclave", "deploy:mocks": "hardhat deploy --tags enclave,mocks", @@ -126,8 +134,7 @@ "dependencies": { "@excubiae/contracts": "^0.4.0", "@gnosis-guild/e3-wasm": "workspace:*", - "solady": "^0.1.13", - "viem": "2.30.6" + "solady": "^0.1.13" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" } diff --git a/packages/evm/src/tsconfig.json b/packages/evm/src/tsconfig.json deleted file mode 100644 index 231a4bbf09..0000000000 --- a/packages/evm/src/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": ["es2020"], - "module": "nodenext", - "moduleResolution": "nodenext", - "noImplicitAny": true, - "outDir": "../dist", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "es2020" - }, - "exclude": ["node_modules"], - "include": ["sdk/**/*"] -} diff --git a/packages/evm/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.ts b/packages/evm/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.ts index c426da6410..b6ef6eb81f 100644 --- a/packages/evm/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.ts +++ b/packages/evm/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.ts @@ -21,7 +21,9 @@ const hash = (a: bigint, b: bigint) => poseidon2([a, b]); describe("CiphernodeRegistryOwnable", function () { async function setup() { const [owner, notTheOwner] = await ethers.getSigners(); - + if (!owner) throw new Error("getSigners() did not return expected output"); + if (!notTheOwner) + throw new Error("getSigners() did not return expected output"); const poseidon = await PoseidonT3Fixture(); const registry = await deployCiphernodeRegistryOwnableFixture( owner.address, @@ -58,6 +60,7 @@ describe("CiphernodeRegistryOwnable", function () { const poseidonFactory = await ethers.getContractFactory("PoseidonT3"); const poseidonDeployment = await poseidonFactory.deploy(); const [deployer] = await ethers.getSigners(); + if (!deployer) throw new Error("Bad getSigners() output"); const ciphernodeRegistryFactory = await ethers.getContractFactory( "CiphernodeRegistryOwnable", { diff --git a/packages/evm/test/CiphernodeRegistry/NaiveRegistryFilter.spec.ts b/packages/evm/test/CiphernodeRegistry/NaiveRegistryFilter.spec.ts index ec11e0ef09..1dd1f5d595 100644 --- a/packages/evm/test/CiphernodeRegistry/NaiveRegistryFilter.spec.ts +++ b/packages/evm/test/CiphernodeRegistry/NaiveRegistryFilter.spec.ts @@ -18,7 +18,8 @@ const hash = (a: bigint, b: bigint) => poseidon2([a, b]); describe("NaiveRegistryFilter", function () { async function setup() { const [owner, notTheOwner] = await ethers.getSigners(); - + if (!owner) throw new Error("Bad getSigners output"); + if (!notTheOwner) throw new Error("Bad getSigners output"); const poseidon = await PoseidonT3Fixture(); const registry = await deployCiphernodeRegistryOwnableFixture( owner.address, diff --git a/packages/evm/test/Enclave.spec.ts b/packages/evm/test/Enclave.spec.ts index 115caaa79b..3b104c375c 100644 --- a/packages/evm/test/Enclave.spec.ts +++ b/packages/evm/test/Enclave.spec.ts @@ -1,3 +1,4 @@ +import "@nomicfoundation/hardhat-chai-matchers"; import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; import { loadFixture, @@ -48,7 +49,8 @@ const hash = (a: bigint, b: bigint) => poseidon2([a, b]); describe("Enclave", function () { async function setup() { const [owner, notTheOwner] = await ethers.getSigners(); - + if (!owner) throw new Error("Bad getSigners() output"); + if (!notTheOwner) throw new Error("Bad getSigners() output"); const poseidon = await PoseidonT3Fixture(); const registry = await deployCiphernodeRegistryFixture(); const decryptionVerifier = await deployDecryptionVerifierFixture(); @@ -224,8 +226,7 @@ describe("Enclave", function () { const { enclave } = await loadFixture(setup); await enclave.setE3ProgramsParams(encodedE3ProgramsParams); - - expect(await enclave.e3ProgramsParams(encodedE3ProgramsParams[0])).to.be + expect(await enclave.e3ProgramsParams(encodedE3ProgramsParams[0]!)).to.be .true; }); diff --git a/packages/evm/test/fixtures/MockCiphernodeRegistry.fixture.ts b/packages/evm/test/fixtures/MockCiphernodeRegistry.fixture.ts index 4e960cbccb..632762545d 100644 --- a/packages/evm/test/fixtures/MockCiphernodeRegistry.fixture.ts +++ b/packages/evm/test/fixtures/MockCiphernodeRegistry.fixture.ts @@ -10,6 +10,6 @@ export async function deployCiphernodeRegistryFixture(name?: string) { return MockCiphernodeRegistry__factory.connect( await deployment.getAddress(), - signer.provider, + signer!.provider, ); } diff --git a/packages/evm/test/fixtures/PoseidonT3.fixture.ts b/packages/evm/test/fixtures/PoseidonT3.fixture.ts index 471339c970..57f1c07b7e 100644 --- a/packages/evm/test/fixtures/PoseidonT3.fixture.ts +++ b/packages/evm/test/fixtures/PoseidonT3.fixture.ts @@ -4,6 +4,7 @@ import { PoseidonT3__factory } from "../../types"; export async function PoseidonT3Fixture(name?: string) { const [signer] = await ethers.getSigners(); + if (!signer) throw new Error("Bad getSigners output"); const deployment = await ( await ethers.getContractFactory(name || "PoseidonT3") ).deploy(); diff --git a/packages/evm/tsconfig.json b/packages/evm/tsconfig.json index 2a5d6a23f3..a8d06e7401 100644 --- a/packages/evm/tsconfig.json +++ b/packages/evm/tsconfig.json @@ -1,23 +1,11 @@ { + "extends": "@gnosis-guild/enclave-config/tsconfig.json", + "include": ["tasks/**/*", "test/**/*", "deploy/**/*", "types/**/*"], + "exclude": ["node_modules", "dist"], "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": ["es2020"], "module": "commonjs", "moduleResolution": "node", - "outDir": "dist", - "noImplicitAny": true, - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "es2020" - }, - "exclude": ["node_modules"], - "files": ["hardhat.config.ts"], - "include": ["tasks/**/*", "test/**/*", "deploy/**/*", "types/"] + "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo" + } } diff --git a/packages/evm/tsup.config.mjs b/packages/evm/tsup.config.mjs new file mode 100644 index 0000000000..954a7c4939 --- /dev/null +++ b/packages/evm/tsup.config.mjs @@ -0,0 +1,10 @@ +import { baseConfig } from "@gnosis-guild/enclave-config/tsup"; +import { defineConfig } from "tsup"; + +export default defineConfig({ + ...baseConfig, + entry: ["deploy/enclave.ts", "deploy/mocks.ts", "types/index.ts"], + include: ["./deploy/**/*.ts", "./types/**/*.ts"], + external: [/^mocha/, /^ts-node/, "hardhat-deploy"], + format: ["esm", "cjs"], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1cf8cdd13..a8143a7cb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: + '@types/node': 22.7.5 + tsup: 8.5.0 + typescript: 5.8.3 + undici-types: 6.19.8 viem: 2.30.6 importers: @@ -42,8 +46,8 @@ importers: version: 0.34.2 devDependencies: '@types/node': - specifier: 20.10.4 - version: 20.10.4 + specifier: 22.7.5 + version: 22.7.5 '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -54,8 +58,8 @@ importers: specifier: ^3.5.3 version: 3.6.1 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.8.3 + version: 5.8.3 examples/CRISP: dependencies: @@ -110,10 +114,10 @@ importers: version: 1.52.0 '@synthetixio/synpress': specifier: ^4.1.0 - version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10) '@synthetixio/synpress-cache': specifier: ^0.0.12 - version: 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) + version: 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3) '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) @@ -151,7 +155,7 @@ importers: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) typescript: - specifier: ^5.5.4 + specifier: 5.8.3 version: 5.8.3 wait-on: specifier: ^8.0.3 @@ -197,7 +201,7 @@ importers: version: 1.10.0 connectkit: specifier: ^1.9.0 - version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) ethers: specifier: ^6.12.0 version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -221,20 +225,20 @@ importers: version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) + version: 0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.7.5)) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) + version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -252,7 +256,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.6.0(vite@5.4.19(@types/node@22.15.33)) + version: 4.6.0(vite@5.4.19(@types/node@22.7.5)) add: specifier: ^2.0.6 version: 2.0.6 @@ -279,22 +283,28 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1))(prettier@3.6.1) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)) typescript: - specifier: ^5.2.2 + specifier: 5.8.3 version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.19(@types/node@22.15.33) + version: 5.4.19(@types/node@22.7.5) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.15.33)) + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) + + packages/enclave-config: + dependencies: + tsup: + specifier: 8.5.0 + version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.7.5))(@swc/core@1.12.7)(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) packages/enclave-react: dependencies: - '@gnosis-guild/enclave': + '@gnosis-guild/enclave-sdk': specifier: workspace:* - version: link:../evm + version: link:../enclave-sdk react: specifier: ^18.2.0 version: 18.3.1 @@ -305,13 +315,65 @@ importers: specifier: ^2.14.16 version: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) devDependencies: + '@gnosis-guild/enclave-config': + specifier: workspace:* + version: link:../enclave-config '@types/react': specifier: ^18.2.0 version: 18.3.23 + tsup: + specifier: 8.5.0 + version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.7.5))(@swc/core@1.12.7)(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) typescript: - specifier: ^5.8.3 + specifier: 5.8.3 version: 5.8.3 + packages/enclave-sdk: + dependencies: + '@gnosis-guild/e3-wasm': + specifier: workspace:* + version: link:../../crates/wasm + '@gnosis-guild/enclave': + specifier: workspace:* + version: link:../evm + comlink: + specifier: ^4.4.2 + version: 4.4.2 + viem: + specifier: 2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + vite-plugin-top-level-await: + specifier: ^1.5.0 + version: 1.5.0(rollup@4.44.1)(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)) + vite-plugin-wasm: + specifier: ^3.4.1 + version: 3.4.1(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)) + vitest: + specifier: ^1.6.1 + version: 1.6.1(@types/node@22.7.5) + web-worker: + specifier: ^1.5.0 + version: 1.5.0 + devDependencies: + '@gnosis-guild/enclave-config': + specifier: workspace:* + version: link:../enclave-config + concurrently: + specifier: ^9.1.2 + version: 9.2.0 + tsup: + specifier: 8.5.0 + version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.7.5))(@swc/core@1.12.7)(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + typescript: + specifier: 5.8.3 + version: 5.8.3 + vite: + specifier: ^6.2.0 + version: 6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0) + vite-plugin-dts: + specifier: ^4.5.3 + version: 4.5.4(@types/node@22.7.5)(rollup@4.44.1)(typescript@5.8.3)(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)) + packages/evm: dependencies: '@excubiae/contracts': @@ -323,25 +385,25 @@ importers: solady: specifier: ^0.1.13 version: 0.1.22 - viem: - specifier: 2.30.6 - version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) devDependencies: + '@gnosis-guild/enclave-config': + specifier: workspace:* + version: link:../enclave-config '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.2 - version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(7701bdab18209f25884c4218d60ddb07) + version: 4.0.0(21df6d106862ca26965fedef68f78cbb) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.3.0 @@ -356,7 +418,7 @@ importers: version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -367,8 +429,8 @@ importers: specifier: ^10.0.6 version: 10.0.10 '@types/node': - specifier: ^20.10.4 - version: 20.10.4 + specifier: 22.7.5 + version: 22.7.5 '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -404,13 +466,13 @@ importers: version: 11.3.0 hardhat: specifier: ^2.22.0 - version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^2.2.0 - version: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + version: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -440,18 +502,18 @@ importers: version: 0.1.0(prettier-plugin-solidity@1.4.3(prettier@3.6.1))(prettier@3.6.1) solidity-coverage: specifier: ^0.8.5 - version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-generator: specifier: ^0.1.1 version: 0.1.1 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) + tsup: + specifier: 8.5.0 + version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.7.5))(@swc/core@1.12.7)(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.3) typescript: - specifier: ^5.8.3 + specifier: 5.8.3 version: 5.8.3 templates/default: @@ -459,6 +521,9 @@ importers: '@gnosis-guild/enclave': specifier: workspace:* version: link:../../packages/evm + '@gnosis-guild/enclave-sdk': + specifier: workspace:* + version: link:../../packages/enclave-sdk '@types/yargs': specifier: ^17.0.33 version: 17.0.33 @@ -471,19 +536,19 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 - version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(f317dad92bdeb5154737798b9f2a79cc) + version: 4.0.0(79e6a2bdb20712d3f04f2697b228668d) '@nomicfoundation/hardhat-verify': specifier: ^2.0.2 - version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 5.3.0 version: 5.3.0 @@ -495,7 +560,7 @@ importers: version: 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -506,8 +571,8 @@ importers: specifier: '>=9.1.0' version: 10.0.10 '@types/node': - specifier: '>=18.0.0' - version: 20.10.4 + specifier: 22.7.5 + version: 22.7.5 '@zk-kit/lean-imt': specifier: ^2.1.0 version: 2.2.3 @@ -528,22 +593,25 @@ importers: version: 5.1.0 hardhat: specifier: ^2.22.10 - version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) poseidon-lite: specifier: ^0.3.0 version: 0.3.0 solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3) + tsx: + specifier: ^4.20.3 + version: 4.20.3 typechain: specifier: ^8.3.0 version: 8.3.2(typescript@5.8.3) @@ -551,7 +619,7 @@ importers: specifier: ^6.1.1 version: 6.1.1 typescript: - specifier: '>=4.5.0' + specifier: 5.8.3 version: 5.8.3 wait-on: specifier: ^8.0.3 @@ -565,6 +633,9 @@ importers: '@gnosis-guild/enclave-react': specifier: workspace:* version: link:../../../packages/enclave-react + '@gnosis-guild/enclave-sdk': + specifier: workspace:* + version: link:../../../packages/enclave-sdk '@phosphor-icons/react': specifier: ^2.1.4 version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -576,7 +647,7 @@ importers: version: 2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)) connectkit: specifier: ^1.9.0 - version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) + version: 1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)) react: specifier: ^18.2.0 version: 18.3.1 @@ -592,7 +663,7 @@ importers: devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))) '@types/react': specifier: ^18.2.66 version: 18.3.23 @@ -607,7 +678,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.6.0(vite@5.4.19(@types/node@22.15.33)) + version: 4.6.0(vite@5.4.19(@types/node@22.7.5)) autoprefixer: specifier: ^10.4.19 version: 10.4.21(postcss@8.5.6) @@ -628,22 +699,22 @@ importers: version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.1))(prettier@3.6.1) tailwindcss: specifier: ^3.4.2 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)) typescript: - specifier: ^5.2.2 + specifier: 5.8.3 version: 5.8.3 vite: specifier: ^5.2.0 - version: 5.4.19(@types/node@22.15.33) + version: 5.4.19(@types/node@22.7.5) vite-plugin-top-level-await: specifier: ^1.4.1 - version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)) + version: 1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.7.5)) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.4.1(vite@5.4.19(@types/node@22.15.33)) + version: 3.4.1(vite@5.4.19(@types/node@22.7.5)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)) wasm-pack: specifier: ^0.13.1 version: 0.13.1 @@ -1422,12 +1493,6 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.20.0': resolution: {integrity: sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==} engines: {node: '>=12'} @@ -1440,11 +1505,11 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.20.0': resolution: {integrity: sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==} @@ -1458,10 +1523,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] os: [android] '@esbuild/android-arm@0.20.0': @@ -1476,10 +1541,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] os: [android] '@esbuild/android-x64@0.20.0': @@ -1494,11 +1559,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.20.0': resolution: {integrity: sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==} @@ -1512,10 +1577,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.20.0': @@ -1530,11 +1595,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.20.0': resolution: {integrity: sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==} @@ -1548,10 +1613,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.20.0': @@ -1566,11 +1631,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.20.0': resolution: {integrity: sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==} @@ -1584,10 +1649,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.20.0': @@ -1602,10 +1667,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.20.0': @@ -1620,10 +1685,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.20.0': @@ -1638,10 +1703,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.20.0': @@ -1656,10 +1721,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.20.0': @@ -1674,10 +1739,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.20.0': @@ -1692,10 +1757,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.20.0': @@ -1710,10 +1775,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.20.0': @@ -1728,10 +1793,16 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.20.0': @@ -1746,10 +1817,16 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.20.0': @@ -1764,11 +1841,17 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] '@esbuild/sunos-x64@0.20.0': resolution: {integrity: sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==} @@ -1782,11 +1865,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.20.0': resolution: {integrity: sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==} @@ -1800,10 +1883,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.20.0': @@ -1818,10 +1901,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.20.0': @@ -1836,6 +1919,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2158,6 +2247,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2268,6 +2361,19 @@ packages: resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} engines: {node: '>=16.0.0'} + '@microsoft/api-extractor-model@7.30.6': + resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} + + '@microsoft/api-extractor@7.52.8': + resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@motionone/animation@10.18.0': resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} @@ -2604,7 +2710,7 @@ packages: '@typechain/hardhat': ^9.0.0 '@types/chai': ^4.2.0 '@types/mocha': '>=9.1.0' - '@types/node': '>=16.0.0' + '@types/node': 22.7.5 chai: ^4.2.0 ethers: ^6.4.0 hardhat: ^2.11.0 @@ -2612,7 +2718,7 @@ packages: solidity-coverage: ^0.8.1 ts-node: '>=8.0.0' typechain: ^8.3.0 - typescript: '>=4.5.0' + typescript: 5.8.3 '@nomicfoundation/hardhat-toolbox@5.0.0': resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} @@ -2626,7 +2732,7 @@ packages: '@typechain/hardhat': ^9.0.0 '@types/chai': ^4.2.0 '@types/mocha': '>=9.1.0' - '@types/node': '>=18.0.0' + '@types/node': 22.7.5 chai: ^4.2.0 ethers: ^6.4.0 hardhat: ^2.11.0 @@ -2634,7 +2740,7 @@ packages: solidity-coverage: ^0.8.1 ts-node: '>=8.0.0' typechain: ^8.3.0 - typescript: '>=4.5.0' + typescript: 5.8.3 '@nomicfoundation/hardhat-verify@2.0.14': resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} @@ -2890,6 +2996,28 @@ packages: cpu: [x64] os: [win32] + '@rushstack/node-core-library@5.13.1': + resolution: {integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==} + peerDependencies: + '@types/node': 22.7.5 + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.15.3': + resolution: {integrity: sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==} + peerDependencies: + '@types/node': 22.7.5 + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.0.1': + resolution: {integrity: sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==} + '@safe-global/safe-apps-provider@0.18.6': resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} @@ -2996,6 +3124,9 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -3261,7 +3392,7 @@ packages: peerDependencies: ethers: 6.x typechain: ^8.3.2 - typescript: '>=4.7.0' + typescript: 5.8.3 '@typechain/hardhat@9.1.0': resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} @@ -3274,6 +3405,9 @@ packages: '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3388,24 +3522,12 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node@10.17.60': - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.10.4': - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - '@types/node@22.15.33': resolution: {integrity: sha512-wzoocdnnpSxZ+6CjW4ADCK1jVmd1S/J3ArNWfn8FDDQtRm8dkDg7TA+mvek2wNrfCgwuZxqEOiB9B1XCJ6+dbw==} '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - '@types/node@8.10.66': - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3541,11 +3663,55 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@volar/language-core@2.4.18': + resolution: {integrity: sha512-G3yYV85ekH4TV0EDS6DsS/dUJWrz675H9UgsxFz5pQbmas51a0Q2fF6Lb2q4RKgytuLZ4E0MBdT5PlVsJXNalw==} + + '@volar/source-map@2.4.18': + resolution: {integrity: sha512-zaj2V/zo/CHQ/xA75h60jBPgrz+Ou9s6aPl7dX0rT46/uill9aB/ZaDk92ROpJsa/9e2xftCeNAU9ZwVyB/egQ==} + + '@volar/typescript@2.4.18': + resolution: {integrity: sha512-xcbsMG8m/yhvO1VIKnTtc+llZxw3YtWkZiV7/F1qNpTORdPExkZRcBxJ5d19MXLpkeiQ+DG5JURHh1SV0bcWRA==} + + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: 5.8.3 + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@wagmi/connectors@5.8.5': resolution: {integrity: sha512-CHh4uYP6MziCMlSVXmuAv7wMoYWdxXliuzwCRAxHNNkgXE7z37ez5XzJu0Sm39NUau3Fl8WSjwKo4a4w9BOYNA==} peerDependencies: '@wagmi/core': 2.17.3 - typescript: '>=5.0.4' + typescript: 5.8.3 viem: 2.30.6 peerDependenciesMeta: typescript: @@ -3555,7 +3721,7 @@ packages: resolution: {integrity: sha512-fgZR9fAiCFtGaosTspkTx5lidccq9Z5xRWOk1HG0VfB6euQGw2//Db7upiP4uQ7DPst2YS9yQN2A1m9+iJLYCw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' + typescript: 5.8.3 viem: 2.30.6 peerDependenciesMeta: '@tanstack/query-core': @@ -3683,7 +3849,7 @@ packages: abitype@1.0.8: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: - typescript: '>=5.0.4' + typescript: 5.8.3 zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: @@ -3730,12 +3896,37 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} @@ -3774,6 +3965,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -4093,11 +4288,11 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bundle-require@4.2.1: - resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' + esbuild: '>=0.18' busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -4413,6 +4608,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -4428,6 +4626,12 @@ packages: engines: {node: '>=18'} hasBin: true + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -4441,6 +4645,10 @@ packages: viem: 2.30.6 wagmi: 2.x + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} @@ -4493,7 +4701,7 @@ packages: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: - typescript: '>=4.9.5' + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true @@ -4738,6 +4946,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -4854,6 +5065,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -5010,11 +5225,6 @@ packages: es-toolkit@1.33.0: resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.20.0: resolution: {integrity: sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==} engines: {node: '>=12'} @@ -5025,6 +5235,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5232,18 +5447,21 @@ packages: resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} engines: {node: '>=4'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -5381,6 +5599,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5551,6 +5772,13 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + gh-pages@6.3.0: resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} engines: {node: '>=10'} @@ -5681,7 +5909,7 @@ packages: hasBin: true peerDependencies: ts-node: '*' - typescript: '*' + typescript: 5.8.3 peerDependenciesMeta: ts-node: optional: true @@ -5850,14 +6078,14 @@ packages: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -5894,6 +6122,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} engines: {node: '>=0.10.0'} @@ -6130,6 +6362,9 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} @@ -6143,6 +6378,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -6247,6 +6485,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} @@ -6288,6 +6529,14 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6377,6 +6626,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -6748,6 +7001,9 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6781,7 +7037,7 @@ packages: mipd@0.0.7: resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: - typescript: '>=5.0.4' + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true @@ -6795,6 +7051,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} @@ -6810,6 +7069,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -6966,10 +7228,6 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7064,7 +7322,7 @@ packages: ox@0.7.1: resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} peerDependencies: - typescript: '>=5.4.0' + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true @@ -7089,6 +7347,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -7200,6 +7462,12 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -7259,6 +7527,12 @@ packages: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + playwright-core@1.52.0: resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} engines: {node: '>=18'} @@ -7318,6 +7592,24 @@ packages: ts-node: optional: true + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -7426,6 +7718,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} @@ -7570,6 +7866,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-markdown@9.1.0: resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==} peerDependencies: @@ -7770,6 +8069,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} @@ -7891,6 +8193,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -7978,6 +8285,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -8102,6 +8412,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stacktrace-parser@0.1.11: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} @@ -8117,6 +8430,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} @@ -8134,6 +8450,10 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} @@ -8186,10 +8506,6 @@ packages: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -8206,6 +8522,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -8342,9 +8661,15 @@ packages: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -8352,6 +8677,14 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + title@3.5.3: resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} hasBin: true @@ -8417,7 +8750,7 @@ packages: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: - typescript: '>=4.2.0' + typescript: 5.8.3 ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} @@ -8433,7 +8766,7 @@ packages: ts-essentials@7.0.3: resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: - typescript: '>=3.7.0' + typescript: 5.8.3 ts-generator@0.1.1: resolution: {integrity: sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==} @@ -8448,8 +8781,8 @@ packages: peerDependencies: '@swc/core': '>=1.2.50' '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + '@types/node': 22.7.5 + typescript: 5.8.3 peerDependenciesMeta: '@swc/core': optional: true @@ -8461,7 +8794,7 @@ packages: engines: {node: ^18 || >=20} hasBin: true peerDependencies: - typescript: ^5.0.0 + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true @@ -8478,15 +8811,15 @@ packages: tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - tsup@8.0.2: - resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} engines: {node: '>=18'} hasBin: true peerDependencies: '@microsoft/api-extractor': ^7.36.0 '@swc/core': ^1 postcss: ^8.4.12 - typescript: '>=4.5.0' + typescript: 5.8.3 peerDependenciesMeta: '@microsoft/api-extractor': optional: true @@ -8497,6 +8830,11 @@ packages: typescript: optional: true + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} @@ -8536,7 +8874,7 @@ packages: resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: - typescript: '>=4.3.0' + typescript: 5.8.3 typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -8548,11 +8886,6 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -8583,15 +8916,9 @@ packages: underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -8842,11 +9169,25 @@ packages: viem@2.30.6: resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} peerDependencies: - typescript: '>=5.0.4' + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: 5.8.3 + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite-plugin-node-polyfills@0.22.0: resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} peerDependencies: @@ -8875,7 +9216,7 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': 22.7.5 less: '*' lightningcss: ^1.21.0 sass: '*' @@ -8901,6 +9242,71 @@ packages: terser: optional: true + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': 22.7.5 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': 22.7.5 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -8910,12 +9316,15 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + wagmi@2.15.6: resolution: {integrity: sha512-tR4tm+7eE0UloQe1oi4hUIjIDyjv5ImQlzq/QcvvfJYWF/EquTfGrmht6+nTYGCIeSzeEvbK90KgWyNqa+HD7Q==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' - typescript: '>=5.0.4' + typescript: 5.8.3 viem: 2.30.6 peerDependenciesMeta: typescript: @@ -8986,6 +9395,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -9151,6 +9565,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -10291,16 +10709,13 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.19.12': - optional: true - '@esbuild/aix-ppc64@0.20.0': optional: true '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/aix-ppc64@0.25.6': optional: true '@esbuild/android-arm64@0.20.0': @@ -10309,7 +10724,7 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/android-arm64@0.25.6': optional: true '@esbuild/android-arm@0.20.0': @@ -10318,7 +10733,7 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/android-arm@0.25.6': optional: true '@esbuild/android-x64@0.20.0': @@ -10327,7 +10742,7 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/android-x64@0.25.6': optional: true '@esbuild/darwin-arm64@0.20.0': @@ -10336,7 +10751,7 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/darwin-arm64@0.25.6': optional: true '@esbuild/darwin-x64@0.20.0': @@ -10345,7 +10760,7 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/darwin-x64@0.25.6': optional: true '@esbuild/freebsd-arm64@0.20.0': @@ -10354,7 +10769,7 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/freebsd-arm64@0.25.6': optional: true '@esbuild/freebsd-x64@0.20.0': @@ -10363,7 +10778,7 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/freebsd-x64@0.25.6': optional: true '@esbuild/linux-arm64@0.20.0': @@ -10372,7 +10787,7 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-arm64@0.25.6': optional: true '@esbuild/linux-arm@0.20.0': @@ -10381,7 +10796,7 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-arm@0.25.6': optional: true '@esbuild/linux-ia32@0.20.0': @@ -10390,7 +10805,7 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-ia32@0.25.6': optional: true '@esbuild/linux-loong64@0.20.0': @@ -10399,7 +10814,7 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-loong64@0.25.6': optional: true '@esbuild/linux-mips64el@0.20.0': @@ -10408,7 +10823,7 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-mips64el@0.25.6': optional: true '@esbuild/linux-ppc64@0.20.0': @@ -10417,7 +10832,7 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/linux-ppc64@0.25.6': optional: true '@esbuild/linux-riscv64@0.20.0': @@ -10426,7 +10841,7 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/linux-riscv64@0.25.6': optional: true '@esbuild/linux-s390x@0.20.0': @@ -10435,7 +10850,7 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-s390x@0.25.6': optional: true '@esbuild/linux-x64@0.20.0': @@ -10444,7 +10859,10 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/linux-x64@0.25.6': + optional: true + + '@esbuild/netbsd-arm64@0.25.6': optional: true '@esbuild/netbsd-x64@0.20.0': @@ -10453,7 +10871,10 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/netbsd-x64@0.25.6': + optional: true + + '@esbuild/openbsd-arm64@0.25.6': optional: true '@esbuild/openbsd-x64@0.20.0': @@ -10462,7 +10883,10 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/openbsd-x64@0.25.6': + optional: true + + '@esbuild/openharmony-arm64@0.25.6': optional: true '@esbuild/sunos-x64@0.20.0': @@ -10471,7 +10895,7 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/sunos-x64@0.25.6': optional: true '@esbuild/win32-arm64@0.20.0': @@ -10480,7 +10904,7 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-arm64@0.25.6': optional: true '@esbuild/win32-ia32@0.20.0': @@ -10489,7 +10913,7 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-ia32@0.25.6': optional: true '@esbuild/win32-x64@0.20.0': @@ -10498,6 +10922,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.25.6': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -10942,7 +11369,7 @@ snapshots: '@inquirer/figures': 1.0.12 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.15.33 + '@types/node': 22.7.5 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -10984,6 +11411,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -11015,7 +11446,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.27.6 - '@types/node': 12.20.55 + '@types/node': 22.7.5 find-up: 4.1.0 fs-extra: 8.1.0 @@ -11212,6 +11643,69 @@ snapshots: transitivePeerDependencies: - supports-color + '@microsoft/api-extractor-model@7.30.6(@types/node@22.15.33)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.33) + transitivePeerDependencies: + - '@types/node' + optional: true + + '@microsoft/api-extractor-model@7.30.6(@types/node@22.7.5)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.7.5) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.52.8(@types/node@22.15.33)': + dependencies: + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.15.33) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.33) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.3(@types/node@22.15.33) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.15.33) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/node' + optional: true + + '@microsoft/api-extractor@7.52.8(@types/node@22.7.5)': + dependencies: + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.7.5) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.7.5) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.3(@types/node@22.7.5) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.7.5) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.10 + + '@microsoft/tsdoc@0.15.1': {} + '@motionone/animation@10.18.0': dependencies: '@motionone/easing': 10.18.0 @@ -11449,15 +11943,15 @@ snapshots: hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 '@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': @@ -11469,11 +11963,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@5.5.0) ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -11507,53 +12001,53 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(7701bdab18209f25884c4218d60ddb07)': + '@nomicfoundation/hardhat-toolbox@4.0.0(21df6d106862ca26965fedef68f78cbb)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.10.4 + '@types/node': 22.7.5 chai: 4.5.0 ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-toolbox@4.0.0(f317dad92bdeb5154737798b9f2a79cc)': + '@nomicfoundation/hardhat-toolbox@4.0.0(79e6a2bdb20712d3f04f2697b228668d)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.9(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.13(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.10.4 + '@types/node': 22.7.5 chai: 4.5.0 ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3) typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 @@ -11578,13 +12072,13 @@ snapshots: typechain: 8.3.2(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -11593,13 +12087,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.1(supports-color@5.5.0) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -12034,6 +12528,72 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true + '@rushstack/node-core-library@5.13.1(@types/node@22.15.33)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.15.33 + optional: true + + '@rushstack/node-core-library@5.13.1(@types/node@22.7.5)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.7.5 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.15.3(@types/node@22.15.33)': + dependencies: + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.33) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.15.33 + optional: true + + '@rushstack/terminal@0.15.3(@types/node@22.7.5)': + dependencies: + '@rushstack/node-core-library': 5.13.1(@types/node@22.7.5) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.7.5 + + '@rushstack/ts-command-line@5.0.1(@types/node@22.15.33)': + dependencies: + '@rushstack/terminal': 0.15.3(@types/node@22.15.33) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + optional: true + + '@rushstack/ts-command-line@5.0.1(@types/node@22.7.5)': + dependencies: + '@rushstack/terminal': 0.15.3(@types/node@22.7.5) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': dependencies: '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) @@ -12230,6 +12790,8 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@5.6.0': {} '@socket.io/component-emitter@3.1.2': {} @@ -12399,7 +12961,7 @@ snapshots: '@depay/web3-mock-evm': 14.19.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@playwright/test': 1.52.0 '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12409,7 +12971,7 @@ snapshots: - utf-8-validate - zod - '@synthetixio/synpress-cache@0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)': + '@synthetixio/synpress-cache@0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)': dependencies: axios: 1.6.7 chalk: 5.3.0 @@ -12420,7 +12982,7 @@ snapshots: gradient-string: 2.0.2 playwright-core: 1.52.0 progress: 2.0.3 - tsup: 8.0.2(@swc/core@1.12.7)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) + tsup: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(postcss@8.5.6)(typescript@5.8.3) unzip-crx-3: 0.2.0 unzipper: 0.10.14 zod: 3.22.4 @@ -12428,19 +12990,21 @@ snapshots: - '@microsoft/api-extractor' - '@swc/core' - debug + - jiti - postcss - supports-color - - ts-node + - tsx - typescript + - yaml '@synthetixio/synpress-core@0.0.12(@playwright/test@1.52.0)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-metamask@0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-metamask@0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -12450,17 +13014,19 @@ snapshots: - '@swc/core' - bufferutil - debug + - jiti - playwright-core - postcss - supports-color - - ts-node + - tsx - typescript - utf-8-validate + - yaml - '@synthetixio/synpress-phantom@0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress-phantom@0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) '@viem/anvil': 0.0.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 11.2.0 @@ -12470,21 +13036,23 @@ snapshots: - '@swc/core' - bufferutil - debug + - jiti - playwright-core - postcss - supports-color - - ts-node + - tsx - typescript - utf-8-validate + - yaml - '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@synthetixio/synpress@4.1.0(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@playwright/test': 1.52.0 '@synthetixio/ethereum-wallet-mock': 0.0.12(@depay/solana-web3.js@1.98.2)(@depay/web3-blockchains@9.8.6)(@playwright/test@1.52.0)(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@synthetixio/synpress-cache': 0.0.12(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3) + '@synthetixio/synpress-cache': 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3) '@synthetixio/synpress-core': 0.0.12(@playwright/test@1.52.0) - '@synthetixio/synpress-metamask': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@synthetixio/synpress-phantom': 0.0.12(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-metamask': 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@synthetixio/synpress-phantom': 0.0.12(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@playwright/test@1.52.0)(@swc/core@1.12.7)(bufferutil@4.0.9)(playwright-core@1.52.0)(postcss@8.5.6)(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@depay/solana-web3.js' - '@depay/web3-blockchains' @@ -12493,25 +13061,27 @@ snapshots: - bufferutil - debug - ethers + - jiti - playwright-core - postcss - supports-color - - ts-node + - tsx - typescript - utf-8-validate + - yaml - zod '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)) '@tanstack/query-core@5.81.2': {} @@ -12587,18 +13157,20 @@ snapshots: hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.8.3) '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.8 + '@types/argparse@1.0.38': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.7 @@ -12622,12 +13194,12 @@ snapshots: '@types/bn.js@5.2.0': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/chai-as-promised@7.1.8': dependencies: @@ -12637,11 +13209,11 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/connect@3.4.38': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/d3-scale-chromatic@3.1.0': {} @@ -12663,7 +13235,7 @@ snapshots: '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -12676,17 +13248,17 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/hast@2.3.10': dependencies: @@ -12704,7 +13276,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/katex@0.16.7': {} @@ -12726,7 +13298,7 @@ snapshots: '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/mocha@10.0.10': {} @@ -12734,31 +13306,21 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.10.4 - - '@types/node@10.17.60': {} - - '@types/node@12.20.55': {} - - '@types/node@20.10.4': - dependencies: - undici-types: 5.26.5 + '@types/node': 22.7.5 '@types/node@22.15.33': dependencies: - undici-types: 6.21.0 + undici-types: 6.19.8 '@types/node@22.7.5': dependencies: undici-types: 6.19.8 - '@types/node@8.10.66': {} - '@types/parse-json@4.0.2': {} '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/prettier@2.7.3': {} @@ -12783,21 +13345,21 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 20.10.4 + '@types/node': 22.7.5 '@types/send': 0.17.5 '@types/snarkjs@0.7.9': {} @@ -12912,7 +13474,7 @@ snapshots: - debug - utf-8-validate - '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@22.15.33))': + '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@22.7.5))': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) @@ -12920,10 +13482,84 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.19(@types/node@22.15.33) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@volar/language-core@2.4.18': + dependencies: + '@volar/source-map': 2.4.18 + + '@volar/source-map@2.4.18': {} + + '@volar/typescript@2.4.18': + dependencies: + '@volar/language-core': 2.4.18 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.17': + dependencies: + '@babel/parser': 7.27.7 + '@vue/shared': 3.5.17 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.17': + dependencies: + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.18 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.17 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/shared@3.5.17': {} + '@wagmi/connectors@5.8.5(@types/react@18.3.23)(@wagmi/core@2.17.3(@tanstack/query-core@5.81.2)(@types/react@18.3.23)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)': dependencies: '@coinbase/wallet-sdk': 4.3.3 @@ -13647,6 +14283,14 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -13654,6 +14298,20 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -13661,6 +14319,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + alien-signals@0.4.14: {} + amdefine@1.0.1: optional: true @@ -13690,6 +14350,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} antlr4@4.13.2: {} @@ -13845,14 +14507,14 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): dependencies: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -14073,9 +14735,9 @@ snapshots: builtin-status-codes@3.0.0: {} - bundle-require@4.2.1(esbuild@0.19.12): + bundle-require@5.1.0(esbuild@0.25.6): dependencies: - esbuild: 0.19.12 + esbuild: 0.25.6 load-tsconfig: 0.2.5 busboy@1.6.0: @@ -14385,6 +15047,8 @@ snapshots: commondir@1.0.1: {} + compare-versions@6.1.1: {} + compute-scroll-into-view@3.1.1: {} concat-map@0.0.1: {} @@ -14406,12 +15070,16 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 + confbox@0.1.8: {} + + confbox@0.2.2: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 @@ -14424,14 +15092,14 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is - connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): + connectkit@1.9.1(@babel/core@7.27.7)(@tanstack/react-query@5.81.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67)): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) buffer: 6.0.3 @@ -14444,13 +15112,15 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) wagmi: 2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67) transitivePeerDependencies: - '@babel/core' - react-is + consola@3.4.2: {} + console-browserify@1.2.0: {} constants-browserify@1.0.0: {} @@ -14803,6 +15473,8 @@ snapshots: dayjs@1.11.13: {} + de-indent@1.0.2: {} + death@1.1.0: {} debug@4.3.7: @@ -14898,6 +15570,8 @@ snapshots: didyoumean@1.2.2: {} + diff-sequences@29.6.3: {} + diff@4.0.2: {} diff@5.2.0: {} @@ -15061,32 +15735,6 @@ snapshots: es-toolkit@1.33.0: {} - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - esbuild@0.20.0: optionalDependencies: '@esbuild/aix-ppc64': 0.20.0 @@ -15139,6 +15787,35 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.6: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -15475,28 +16152,28 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 - execa@5.1.1: + execa@7.2.0: dependencies: cross-spawn: 7.0.6 get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 + npm-run-path: 5.3.0 + onetime: 6.0.0 signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + strip-final-newline: 3.0.0 - execa@7.2.0: + execa@8.0.1: dependencies: cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 4.3.1 + get-stream: 8.0.1 + human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.3.0 onetime: 6.0.0 - signal-exit: 3.0.7 + signal-exit: 4.1.0 strip-final-newline: 3.0.0 express@5.1.0: @@ -15531,6 +16208,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.7: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -15675,6 +16354,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.44.1 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -15847,6 +16532,12 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + gh-pages@6.3.0: dependencies: async: 3.2.6 @@ -16056,11 +16747,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -16068,11 +16759,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -16080,7 +16771,7 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + hardhat-gas-reporter@2.3.0(bufferutil@4.0.9)(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 @@ -16092,7 +16783,7 @@ snapshots: cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.4.5 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 @@ -16105,7 +16796,7 @@ snapshots: - utf-8-validate - zod - hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -16149,14 +16840,14 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -16200,7 +16891,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil @@ -16446,7 +17137,7 @@ snapshots: http-response-object@3.0.2: dependencies: - '@types/node': 10.17.60 + '@types/node': 22.7.5 http2-wrapper@2.2.1: dependencies: @@ -16464,10 +17155,10 @@ snapshots: human-id@4.1.1: {} - human-signals@2.1.0: {} - human-signals@4.3.1: {} + human-signals@5.0.0: {} + husky@9.1.7: {} iconv-lite@0.4.24: @@ -16495,6 +17186,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@4.0.0: {} + imul@1.0.1: {} imurmurhash@0.1.4: {} @@ -16681,6 +17374,8 @@ snapshots: jiti@1.21.7: {} + jju@1.4.0: {} + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -16695,6 +17390,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -16784,6 +17481,8 @@ snapshots: kleur@4.1.5: {} + kolorist@1.8.0: {} + latest-version@7.0.0: dependencies: package-json: 8.1.1 @@ -16828,6 +17527,17 @@ snapshots: load-tsconfig@0.2.5: {} + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.2.0 + quansync: 0.2.10 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -16903,6 +17613,10 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru_map@0.3.3: {} magic-string@0.30.17: @@ -17679,6 +18393,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.12 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -17716,6 +18434,13 @@ snapshots: mkdirp@1.0.4: {} + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mnemonist@0.38.5: dependencies: obliterator: 2.0.5 @@ -17747,6 +18472,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + multiformats@9.9.0: {} murmur-128@0.2.1: @@ -17957,10 +18684,6 @@ snapshots: dependencies: path-key: 2.0.1 - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -18114,6 +18837,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -18227,6 +18954,10 @@ snapshots: path-type@4.0.0: {} + pathe@1.1.2: {} + + pathe@2.0.3: {} + pathval@1.1.1: {} pbkdf2@3.1.3: @@ -18289,6 +19020,18 @@ snapshots: dependencies: find-up: 5.0.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + playwright-core@1.52.0: {} playwright@1.52.0: @@ -18328,13 +19071,22 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.0 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3) + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + tsx: 4.20.3 + yaml: 2.8.0 postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -18391,6 +19143,12 @@ snapshots: prettier@3.6.1: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + prismjs@1.27.0: {} prismjs@1.30.0: {} @@ -18543,6 +19301,8 @@ snapshots: react-is@16.13.1: {} + react-is@18.3.1: {} + react-markdown@9.1.0(@types/react@18.3.23)(react@18.3.1): dependencies: '@types/hast': 3.0.4 @@ -18797,6 +19557,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.1.7: {} resolve@1.17.0: @@ -18956,6 +19718,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.7.2: {} send@1.2.0: @@ -19097,6 +19863,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -19212,7 +19980,7 @@ snapshots: transitivePeerDependencies: - typescript - solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -19223,7 +19991,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -19235,7 +20003,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -19246,7 +20014,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.25.0(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -19307,6 +20075,8 @@ snapshots: sprintf-js@1.0.3: {} + stackback@0.0.2: {} + stacktrace-parser@0.1.11: dependencies: type-fest: 0.7.1 @@ -19319,6 +20089,8 @@ snapshots: statuses@2.0.2: {} + std-env@3.9.0: {} + stream-browserify@3.0.0: dependencies: inherits: 2.0.4 @@ -19337,6 +20109,8 @@ snapshots: strict-uri-encode@2.0.0: {} + string-argv@0.3.2: {} + string-format@2.0.0: {} string-width@2.1.1: @@ -19393,8 +20167,6 @@ snapshots: strip-eof@1.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-hex-prefix@1.0.0: @@ -19405,6 +20177,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -19426,19 +20202,19 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/traverse': 7.27.7(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 16.13.1 + react-is: 18.3.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: @@ -19524,7 +20300,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19543,7 +20319,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -19568,7 +20344,7 @@ snapshots: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 - '@types/node': 8.10.66 + '@types/node': 22.7.5 '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 @@ -19598,8 +20374,12 @@ snapshots: dependencies: setimmediate: 1.0.5 + tinybench@2.9.0: {} + tinycolor2@1.6.0: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -19610,6 +20390,10 @@ snapshots: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + title@3.5.3: dependencies: arg: 1.0.0 @@ -19696,14 +20480,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.12.7)(@types/node@20.10.4)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.10.4 + '@types/node': 22.15.33 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -19716,14 +20500,14 @@ snapshots: optionalDependencies: '@swc/core': 1.12.7 - ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.7.5)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.33 + '@types/node': 22.7.5 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -19748,29 +20532,72 @@ snapshots: tsort@0.0.1: {} - tsup@8.0.2(@swc/core@1.12.7)(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3))(typescript@5.8.3): + tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.15.33))(@swc/core@1.12.7)(postcss@8.5.6)(typescript@5.8.3): dependencies: - bundle-require: 4.2.1(esbuild@0.19.12) + bundle-require: 5.1.0(esbuild@0.25.6) cac: 6.7.14 - chokidar: 3.6.0 + chokidar: 4.0.3 + consola: 3.4.2 debug: 4.4.1(supports-color@5.5.0) - esbuild: 0.19.12 - execa: 5.1.1 - globby: 11.1.0 + esbuild: 0.25.6 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.7)(@types/node@22.15.33)(typescript@5.8.3)) + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) resolve-from: 5.0.0 rollup: 4.44.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@22.15.33) '@swc/core': 1.12.7 postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: + - jiti - supports-color - - ts-node + - tsx + - yaml + + tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.7.5))(@swc/core@1.12.7)(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.6) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1(supports-color@5.5.0) + esbuild: 0.25.6 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.44.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@22.7.5) + '@swc/core': 1.12.7 + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.20.3: + dependencies: + esbuild: 0.25.6 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 tty-browserify@0.0.1: {} @@ -19824,8 +20651,6 @@ snapshots: typedarray@0.0.6: {} - typescript@5.5.4: {} - typescript@5.8.3: {} typical@4.0.0: {} @@ -19845,12 +20670,8 @@ snapshots: underscore@1.12.1: {} - undici-types@5.26.5: {} - undici-types@6.19.8: {} - undici-types@6.21.0: {} - undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -20140,47 +20961,147 @@ snapshots: - utf-8-validate - zod - vite-plugin-node-polyfills@0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)): + vite-node@1.6.1(@types/node@22.7.5): + dependencies: + cac: 6.7.14 + debug: 4.4.1(supports-color@5.5.0) + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19(@types/node@22.7.5) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-dts@4.5.4(@types/node@22.7.5)(rollup@4.44.1)(typescript@5.8.3)(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)): + dependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@22.7.5) + '@rollup/pluginutils': 5.2.0(rollup@4.44.1) + '@volar/typescript': 2.4.18 + '@vue/language-core': 2.2.0(typescript@5.8.3) + compare-versions: 6.1.1 + debug: 4.4.1(supports-color@5.5.0) + kolorist: 1.8.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + typescript: 5.8.3 + optionalDependencies: + vite: 6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-node-polyfills@0.22.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.7.5)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.44.1) node-stdlib-browser: 1.3.1 - vite: 5.4.19(@types/node@22.15.33) + vite: 5.4.19(@types/node@22.7.5) + transitivePeerDependencies: + - rollup + + vite-plugin-top-level-await@1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.7.5)): + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@4.44.1) + '@swc/core': 1.12.7 + uuid: 10.0.0 + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: + - '@swc/helpers' - rollup - vite-plugin-top-level-await@1.5.0(rollup@4.44.1)(vite@5.4.19(@types/node@22.15.33)): + vite-plugin-top-level-await@1.5.0(rollup@4.44.1)(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.44.1) '@swc/core': 1.12.7 uuid: 10.0.0 - vite: 5.4.19(@types/node@22.15.33) + vite: 6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.15.33)): + vite-plugin-wasm@3.4.1(vite@5.4.19(@types/node@22.7.5)): + dependencies: + vite: 5.4.19(@types/node@22.7.5) + + vite-plugin-wasm@3.4.1(vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - vite: 5.4.19(@types/node@22.15.33) + vite: 6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0) - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.33)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: debug: 4.4.1(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 5.4.19(@types/node@22.15.33) + vite: 5.4.19(@types/node@22.7.5) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@22.15.33): + vite@5.4.19(@types/node@22.7.5): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.44.1 optionalDependencies: - '@types/node': 22.15.33 + '@types/node': 22.7.5 + fsevents: 2.3.3 + + vite@6.3.5(@types/node@22.7.5)(jiti@1.21.7)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.7.5 fsevents: 2.3.3 + jiti: 1.21.7 + tsx: 4.20.3 + yaml: 2.8.0 + + vitest@1.6.1(@types/node@22.7.5): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.1(supports-color@5.5.0) + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.19(@types/node@22.7.5) + vite-node: 1.6.1(@types/node@22.7.5) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.7.5 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser vm-browserify@1.1.2: {} @@ -20188,6 +21109,8 @@ snapshots: vscode-textmate@8.0.0: {} + vscode-uri@3.1.0: {} + wagmi@2.15.6(@tanstack/query-core@5.81.2)(@tanstack/react-query@5.81.2(react@18.3.1))(@types/react@18.3.23)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67))(zod@3.25.67): dependencies: '@tanstack/react-query': 5.81.2(react@18.3.1) @@ -20348,6 +21271,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@3.1.0: dependencies: string-width: 4.2.3 @@ -20494,6 +21422,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.2: {} zksync-ethers@5.10.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a207d025b6..af2e0bea74 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,9 +1,11 @@ packages: + - crates/wasm - docs - examples/CRISP - examples/CRISP/apps/client + - packages/enclave-config - packages/enclave-react + - packages/enclave-sdk - packages/evm - - crates/wasm - templates/default - templates/default/client diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index 7769d6f286..e83d224fa4 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -2,23 +2,13 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - [[package]] name = "actix-codec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.1", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -39,12 +29,12 @@ dependencies = [ "actix-rt", "actix-service", "actix-utils", - "base64 0.22.1", - "bitflags 2.9.1", + "base64", + "bitflags", "brotli", "bytes", "bytestring", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "flate2", "foldhash", @@ -65,7 +55,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "zstd 0.13.3", + "zstd", ] [[package]] @@ -159,7 +149,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "foldhash", "futures-core", @@ -210,17 +200,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - [[package]] name = "ahash" version = "0.8.12" @@ -301,7 +280,7 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", "hashbrown 0.15.3", "indexmap", @@ -587,37 +566,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -653,7 +601,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -662,18 +610,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[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 = "base64" version = "0.22.1" @@ -686,57 +622,21 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", -] - [[package]] name = "bit-set" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec 0.8.0", + "bit-vec", ] -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bit-vec" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.9.1" @@ -785,16 +685,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2", - "tinyvec", -] - [[package]] name = "bumpalo" version = "3.18.1" @@ -831,58 +721,6 @@ dependencies = [ "bytes", ] -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "cc" version = "1.2.26" @@ -900,100 +738,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac", - "k256", - "serde", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.7", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror 1.0.69", -] - -[[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", -] - [[package]] name = "const-hex" version = "1.14.1" @@ -1033,12 +777,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "cookie" version = "0.16.2" @@ -1137,21 +875,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - [[package]] name = "der" version = "0.7.10" @@ -1182,33 +905,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "derive_more-impl", ] [[package]] @@ -1244,48 +947,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -1312,7 +973,7 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" +source = "git+https://github.com/gnosisguild/enclave?rev=2ca0aa5f47dd962add5d1d0f74900d9bceb957e5#2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -1325,7 +986,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" +source = "git+https://github.com/gnosisguild/enclave?rev=2ca0aa5f47dd962add5d1d0f74900d9bceb957e5#2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" dependencies = [ "ark-bn254", "ark-ff 0.4.2", @@ -1342,13 +1003,13 @@ dependencies = [ [[package]] name = "e3-program-server" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?rev=906dae86128d64918e32c051cc37eb7b994275d6#906dae86128d64918e32c051cc37eb7b994275d6" +source = "git+https://github.com/gnosisguild/enclave?rev=2ca0aa5f47dd962add5d1d0f74900d9bceb957e5#2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" dependencies = [ "actix-web", "anyhow", "e3-compute-provider", "hex", - "reqwest 0.12.19", + "reqwest", "serde", "serde_json", "tokio", @@ -1416,397 +1077,36 @@ dependencies = [ ] [[package]] -name = "ena" -version = "0.14.3" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "log", + "cfg-if", ] [[package]] -name = "encode_unicode" -version = "1.0.0" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "encoding_rs" -version = "0.8.35" +name = "errno" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ - "cfg-if", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "enr" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" -dependencies = [ - "base64 0.21.7", - "bytes", - "hex", - "k256", - "log", - "rand 0.8.5", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand 0.8.5", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror 1.0.69", - "uuid", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror 1.0.69", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "ethers-etherscan", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest 0.11.27", - "serde", - "serde_json", - "syn 2.0.101", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.101", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "syn 2.0.101", - "tempfile", - "thiserror 1.0.69", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" -dependencies = [ - "chrono", - "ethers-core", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.7", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http 0.2.12", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" -dependencies = [ - "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core", - "glob", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver 1.0.26", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror 1.0.69", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "ethnum" -version = "1.5.2" +name = "ethnum" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "fastrand" version = "2.3.0" @@ -1848,7 +1148,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "doc-comment", "fhe-math", @@ -1871,7 +1171,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "ethnum", "fhe-traits", @@ -1893,7 +1193,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "rand 0.8.5", ] @@ -1901,7 +1201,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" +source = "git+https://github.com/gnosisguild/fhe.rs#11cdd749a8e01c486160d5f62572c4520af5358f" dependencies = [ "itertools 0.12.1", "num-bigint-dig", @@ -1975,37 +1275,12 @@ dependencies = [ "percent-encoding", ] -[[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.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.31" @@ -2013,7 +1288,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -2022,44 +1296,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "futures-sink" version = "0.3.31" @@ -2072,41 +1308,16 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - [[package]] name = "futures-util" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 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]] @@ -2127,10 +1338,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -2151,24 +1360,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "group" version = "0.13.0" @@ -2239,27 +1430,12 @@ dependencies = [ "serde", ] -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - [[package]] name = "hex" version = "0.4.3" @@ -2278,15 +1454,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "http" version = "0.2.12" @@ -2309,17 +1476,6 @@ dependencies = [ "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 = "http-body" version = "1.0.1" @@ -2338,47 +1494,23 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", + "http 1.3.1", + "http-body", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", ] +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.6.0" @@ -2390,7 +1522,7 @@ dependencies = [ "futures-util", "h2 0.4.11", "http 1.3.1", - "http-body 1.0.1", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -2399,20 +1531,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -2420,12 +1538,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.6.0", + "hyper", "hyper-util", - "rustls 0.23.28", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tower-service", ] @@ -2437,7 +1555,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.6.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2451,20 +1569,20 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", "futures-core", "futures-util", "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", "socket2", - "system-configuration 0.6.1", + "system-configuration", "tokio", "tower-service", "tracing", @@ -2593,24 +1711,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.3" @@ -2622,12 +1722,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "indexmap" version = "2.9.0" @@ -2639,24 +1733,6 @@ dependencies = [ "serde", ] -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -2700,15 +1776,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.15" @@ -2735,20 +1802,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.7", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - [[package]] name = "k256" version = "0.13.4" @@ -2760,7 +1813,6 @@ dependencies = [ "elliptic-curve", "once_cell", "sha2", - "signature", ] [[package]] @@ -2782,36 +1834,6 @@ dependencies = [ "sha3-asm", ] -[[package]] -name = "lalrpop" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" -dependencies = [ - "ascii-canvas", - "bit-set 0.5.3", - "ena", - "itertools 0.11.0", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", - "walkdir", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" -dependencies = [ - "regex-automata", -] - [[package]] name = "language-tags" version = "0.3.2" @@ -2824,7 +1846,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.9.8", + "spin", ] [[package]] @@ -2848,16 +1870,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", -] - [[package]] name = "light-poseidon" version = "0.2.0" @@ -2936,16 +1948,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - [[package]] name = "memchr" version = "2.7.4" @@ -2958,16 +1960,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minicov" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" -dependencies = [ - "cc", - "walkdir", -] - [[package]] name = "miniz_oxide" version = "0.8.8" @@ -3025,12 +2017,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "num" version = "0.4.3" @@ -3128,37 +2114,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "object" version = "0.36.7" @@ -3174,38 +2129,13 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl" version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -3243,12 +2173,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -3283,174 +2207,54 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", + "lock_api", + "parking_lot_core", ] [[package]] -name = "phf_generator" -version = "0.11.3" +name = "parking_lot_core" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ - "phf_shared", - "rand 0.8.5", + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", ] [[package]] -name = "phf_macros" -version = "0.11.3" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.101", -] +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "phf_shared" -version = "0.11.3" +name = "percent-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] -name = "pin-project" -version = "1.1.10" +name = "pest" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ - "pin-project-internal", + "memchr", + "thiserror 2.0.12", + "ucd-trie", ] [[package]] -name = "pin-project-internal" -version = "1.1.10" +name = "petgraph" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "fixedbitset", + "indexmap", ] [[package]] @@ -3505,12 +2309,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - [[package]] name = "prettyplease" version = "0.2.33" @@ -3540,9 +2338,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", "uint", ] @@ -3592,9 +2387,9 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.1", + "bit-set", + "bit-vec", + "bitflags", "lazy_static", "num-traits", "rand 0.8.5", @@ -3788,18 +2583,7 @@ version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", + "bitflags", ] [[package]] @@ -3837,63 +2621,22 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", "h2 0.4.11", "http 1.3.1", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "ipnet", @@ -3908,7 +2651,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", "tower", @@ -3930,21 +2673,6 @@ dependencies = [ "subtle", ] -[[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 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.14" @@ -3955,19 +2683,10 @@ dependencies = [ "cfg-if", "getrandom 0.2.16", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] -[[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 = "rlp" version = "0.5.2" @@ -3975,21 +2694,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "ruint" version = "1.15.0" @@ -4065,25 +2772,13 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.1", + "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.28" @@ -4092,20 +2787,11 @@ checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "once_cell", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki", "subtle", "zeroize", ] -[[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 = "rustls-pki-types" version = "1.12.0" @@ -4115,25 +2801,15 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - [[package]] name = "rustls-webpki" version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ - "ring 0.17.14", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -4160,48 +2836,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[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 = "scale-info" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" -dependencies = [ - "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "schannel" version = "0.1.27" @@ -4217,28 +2851,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - [[package]] name = "sec1" version = "0.7.3" @@ -4259,7 +2871,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -4290,9 +2902,6 @@ name = "semver" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] [[package]] name = "semver-parser" @@ -4303,18 +2912,6 @@ dependencies = [ "pest", ] -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - [[package]] name = "serde" version = "1.0.219" @@ -4347,15 +2944,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4435,24 +3023,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.12", - "time", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - [[package]] name = "slab" version = "0.4.9" @@ -4478,26 +3048,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "solang-parser" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" -dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -4526,66 +3076,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "svm-rs" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "sha2", - "thiserror 1.0.69", - "url", - "zip", -] - [[package]] name = "syn" version = "1.0.109" @@ -4620,12 +3116,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -4639,22 +3129,11 @@ dependencies = [ name = "synstructure" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -4663,19 +3142,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", + "bitflags", "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[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", + "system-configuration-sys", ] [[package]] @@ -4707,17 +3176,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -4808,21 +3266,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -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.45.1" @@ -4862,39 +3305,14 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.28", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.12", + "rustls", "tokio", - "tokio-rustls 0.24.1", - "tungstenite", - "webpki-roots", ] [[package]] @@ -4910,26 +3328,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -4938,19 +3341,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", - "serde", - "serde_spanned", "toml_datetime", - "toml_write", "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - [[package]] name = "tower" version = "0.5.2" @@ -4960,7 +3354,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -4972,11 +3366,11 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.1", + "bitflags", "bytes", "futures-util", "http 1.3.1", - "http-body 1.0.1", + "http-body", "iri-string", "pin-project-lite", "tower", @@ -5028,42 +3422,12 @@ dependencies = [ "once_cell", ] -[[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 = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - [[package]] name = "typenum" version = "1.18.0" @@ -5100,24 +3464,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -5135,28 +3487,12 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.16", - "serde", -] - [[package]] name = "valuable" version = "0.1.1" @@ -5184,16 +3520,6 @@ dependencies = [ "libc", ] -[[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" @@ -5289,58 +3615,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-bindgen-test" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" -dependencies = [ - "js-sys", - "minicov", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "wasm-crypto" -version = "0.1.0" -dependencies = [ - "bincode", - "console", - "console_log", - "e3-bfv-helpers", - "ethers", - "fhe", - "fhe-math", - "fhe-traits", - "fhe-util", - "getrandom 0.2.16", - "itertools 0.13.0", - "log", - "ndarray", - "num-bigint", - "num-traits", - "rand 0.8.5", - "rayon", - "serde", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -5351,43 +3625,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-link" version = "0.1.3" @@ -5423,22 +3660,13 @@ dependencies = [ "windows-link", ] -[[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.6", + "windows-targets", ] [[package]] @@ -5447,22 +3675,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[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", + "windows-targets", ] [[package]] @@ -5471,46 +3684,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[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.6" @@ -5523,48 +3718,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[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.6" @@ -5580,23 +3751,13 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen-rt" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.1", + "bitflags", ] [[package]] @@ -5605,25 +3766,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper 0.6.0", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wyz" version = "0.5.1" @@ -5633,12 +3775,6 @@ dependencies = [ "tap", ] -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - [[package]] name = "yoke" version = "0.8.0" @@ -5757,52 +3893,13 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - [[package]] name = "zstd" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "zstd-safe 7.2.4", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml index 9769a978a2..ffd914ce40 100644 --- a/templates/default/Cargo.toml +++ b/templates/default/Cargo.toml @@ -1,6 +1,5 @@ [workspace] members = [ - "client/wasm", "program", ".enclave/support/dev" ] diff --git a/templates/default/client/package.json b/templates/default/client/package.json index fb4bde30e5..a1b2199c21 100644 --- a/templates/default/client/package.json +++ b/templates/default/client/package.json @@ -9,15 +9,15 @@ }, "homepage": "https://github.com/gnosisguild/enclave", "scripts": { - "build-wasm": "./wasm/build.sh", - "dev": "npm run build-wasm && vite --no-open --host", - "build": "npm run build-wasm && tsc && vite build", + "dev": "vite --no-open --host", + "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, "dependencies": { "@gnosis-guild/enclave": "workspace:*", "@gnosis-guild/enclave-react": "workspace:*", + "@gnosis-guild/enclave-sdk": "workspace:*", "@phosphor-icons/react": "^2.1.4", "@tanstack/react-query": "^5.74.3", "@wagmi/core": "^2.14.16", @@ -41,7 +41,7 @@ "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.13", "tailwindcss": "^3.4.2", - "typescript": "^5.2.2", + "typescript": "^5.8.3", "vite": "^5.2.0", "vite-plugin-top-level-await": "^1.4.1", "vite-plugin-wasm": "^3.3.0", diff --git a/templates/default/client/src/hooks/useWebAssembly.tsx b/templates/default/client/src/hooks/useWebAssembly.tsx deleted file mode 100644 index 977aeb3031..0000000000 --- a/templates/default/client/src/hooks/useWebAssembly.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useState, useEffect } from 'react' -import init, { Encrypt } from 'libs/wasm/pkg/wasm_crypto' - -export const useWebAssemblyHook = () => { - const [isLoaded, setIsLoaded] = useState(false) - - useEffect(() => { - const loadWasm = async () => { - try { - await init() - setIsLoaded(true) - console.log('WASM module loaded') - } catch (error) { - console.error('Failed to load WASM module:', error) - } - } - loadWasm() - }, []) - - const encryptInput = async (value: bigint, publicKey: Uint8Array): Promise => { - if (!isLoaded) { - console.error('WASM module not loaded yet') - return null - } - - try { - console.log('Encrypting input') - const encryptor = new Encrypt() - const result = encryptor.encrypt(value, publicKey) - console.log('Encrypted input:', result) - return result - } catch (error) { - console.error('Error encrypting input:', error) - return null - } - } - - return { - isLoaded, - encryptInput - } -} \ No newline at end of file diff --git a/templates/default/client/src/pages/WizardSDK.tsx b/templates/default/client/src/pages/WizardSDK.tsx index 0215417141..f800163032 100644 --- a/templates/default/client/src/pages/WizardSDK.tsx +++ b/templates/default/client/src/pages/WizardSDK.tsx @@ -17,13 +17,11 @@ import { decodePlaintextOutput, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, -} from '@gnosis-guild/enclave/sdk' + encryptNumber, +} from '@gnosis-guild/enclave-sdk' import { HAS_MISSING_ENV_VARS, MISSING_ENV_VARS, getContractAddresses } from '@/utils/env-config' import { formatContractError } from '@/utils/error-formatting' -// WebAssembly hook -import { useWebAssemblyHook } from '@/hooks/useWebAssembly' - // Icons import { Wallet, @@ -198,7 +196,7 @@ const RequestComputationStep: React.FC = ({

Kbrs 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%0DtUzjT1%6*w|7TN9JZ_vF$Q9 zNBEK5O-;*^;o?N03IAClb)AxjT_MX?HX^)A@hJkgJ&r|%IE;EB2Tje6_<ZUxO`yA=076(2 zL~KTG%V@Md1=3dBHw3I#xm%u!{)4;uspv+xII0vOgmkOoRTR$1k}X#24zh+9iBLjhzlK5QUrhhgGc1D+v?j>9w?2Z{C}{S4~N~MB*+k- zC6>6T+s~)pD9$GJ2$RYWnp7r76P?l@=ztq}_{|UNSJiMdpWq`*Fa@UyAYLCo$Hj6MrPy>uy6sofiz3?`9Qg9l z?Uz8d6HO1y;$@-RFM(`l?O&O6f>GB>w_gI;PBi!{H-2Th9f%fBquVcmY~;a+uwAsZrWQ z&}R~ACpsOxI6AG(w~fflKMJS6lGvP*UkG};)Qow;OU<%`uhDthm`ZS;h(b6&_O!Tm zJ2+U4AKDvX82*Lof5tFq@^Q(_Xm(11LX3+XaUl5!$xw2(H)yh z-~P5%ka*=D-Q9)kcs4cgwkTlr*?dYnr7^=T6rn0oQae0joqf7GA{L9 zT4YR1G$*eMia+DbfyI9hqF`#w_dBND)Ecz>Ly5aFa;86q5=Y&_tnfq zHpCxSMa-3iiK}2!W~@oE4-5B_*HRJ%RCz&1BX=vtDy z;>n-=Y!DB`6YnIO_q${OJ;z-f#h3Gf{Rb&n9v|W2bBfDHH_sBwSy=_GSCHV1O>mB0 z)X7O7q1!LA-9;=|sD*p{3cB4=rlOgH)}Gp!t3qzmE$dJXC_{Yo`OmO%A>f7b#K0OS z%aK-WDK+GtE2HXfbU#j+x9nPh7QX0%3_Dtr@dOol%kFe(R|3vVZ zU(3v6!`6JG!wuy-sahs$#f;X9w1yHSA#m`kwQeoDqmWYeN7u$!>>zsqABsI#$JUCx z5$wZz-qCFc3M-SRxxoxUR{74{O6k8E*{J{S?*ZC_d`b9v-k1F;Cl0jC`P77Tk4>A9jrmLGqyzivS-1%!u(3RthJwLN?N*nY{3uC3a03xaZ;BUCGNG zdp9!oksR_Z@_?LLX;vo(wa!)-{u)h}Rwfq+ zZ1Unf(Xe}2GZ1gkv+;MFU~b2DhqE2q9dwrK7=2_VIQTvm0HmE#v4OCK66F<^_Iy|9KnuDnHiCQ!r&vrjg{b4$hTNG({a#0qz7PgYj- zc>jAC#sw%HKW$fk{X=9B{$Ph6l%~jmjhoa`G_rHAZ=?HHj}9%^^d3 z(EW1oM~G!7M+Smj%^1^AB72a=TCpcwjXpq#p3oZSyo{%*4kQ+3G)0uXgzpd*Vu z2gMnt7H{JQ&*%PZ7YdtGQ65e$oKEi&*CqNF6_7q16q!X(a7~-wA7(Nj+7^-}QA=Xa zsgHQ(5ss9^b!AYBCnz&Mz@rnr!?Xf?V@_?s0FD`Mxy}m+{-Z(7qr?z>Img_6ce)a$UFk?7 zOZ4u*tlDxmv$Xfu-4zx}A$Dzk^X_R&SS(r(N-H}Bd@bl5Dljb8C-4x=)*HZUqWuU3 zjJ$o%v4-8!_8dz)l1|QEB-W>2#K|LalZ^g;`2bdl^E_?zODAlYpAx+=`6*juA&bn~ z=PjAw;)9x;bH`z;%7l6I$kSn1o7(X#q9^jERgQxdkY!)u z*5&}r0$aZA4)2XRz;bNqg@<`h`I7A|cDFmE5SouxXzviW$hso4@55{;p?CTBjWEz$ z_I@lXpNz3fVtsT|+Y%b{25rU618pfoJ8hM$Ep@oGT^;7NPBj-l>a1UAZ2l7?zKCK1eZ6n1#P&-Ag%(lwup;ZgJ7aWceH-g(=lNW2Pc$Rdo|PT zq~CcRFCD>cz%Jk6*EbKNedz4JQnKBzS}}&UO@65cw%{ZUxUeG{&~k7kExMX$Q9n)C z1dWx9@)}dt{IF0AL~Nyv>JSRpH5B$Ks07>UyFG!>oW%{Dq}X9$lX!SG9=zX$_o=WG zpcnV*seQ^-m8y(uyKQ1ZjiH zAoWN?ZpCED-eDSET-sZDiz|q3mv*<;+woM?IX5$PosjKPM@ATJ%GyK*C+|E&1_%=r z6LQ8=WV5Wno%%uk3yH0~3@yP*l1v(@7HST-`&2Ebz=P^A61vU<&tiyFMSxnw!VM1b2sT&qks zDLqU%OrrCh*k6)oMmk_L;QS>&U@df4^8>~+K?6qJ7)-}2$CY{QRdasutP8;Kw?hj+ zJ{YzDSUH6|Iv3aqAR1IoX{f<9^2zRIEMsH7*IE&^X;|tiR<5LHcavAh%U?^(2Ux|W>CpU*PmK=XCktumCxcBDo~X>m;g}9 zXdQA_LP`xLXQPh37_edIbB29E6qZi65gf+nI>Z(I6asTeVTHiUB16a`OrRH4G8x21 zGssA0lR*;diuq-l5W;%TB&M0tnJldtL6{~hfdUfc+QbZiKm@RWQ1bc=WaixaQJlVF zT~099n6i(_NvgE^j@1ms9dyr@%pj$?_)PL{rTtiep&A4bs`#moPf)AP{s`Ls4OFGT zdvC`()PrG9Vyw-!VSza3#QQ&!q?Wt`>XJ^~0ZsecnD;_Zox{Fb&C@S}Ewo-)7w!F8 znx^)UeM>AyR*;s5_G%VE1im7h)gk1It|x*Cz!T&r$9!>3bQg|oxqcJ`mtXfwP%yn*i>*WUdjtapQe?&fy}O4 zB`2gtOJ>fDmPiag*oi5x#mKf|Y$UQF5Hkt{y)XZdJnA`M6!BlRKjQ%V=k3oNC-X<` z&zyksc|9kAIo<`*r$5>L!pB++2dIm z4~Z!CahS4aMihP)pB%O!1@F3w+u`~}O?2r=J&|~ z;NnZ~Px3hu*g#GhTr{UA-jl6n3@(By82991-j++XjKdbwQemT#`%>elFt@tKTV-{v z>!KF~e#M^R5oa&SOwNlvZqVLPLWvKt*VNF>mx~1FVI5|@q$?nd+59ZE@c$43sulng zR$D0*Kcl=(typ@~`K4VQ#=HQf9#62e5PLMbwQD`%yM=XKhGyA-7o;}Y1*wg8fp_~f zV>Y&KMWJBY7Ma7eEvzj0rvO%IN2G3wj0_klz;nnK_voR$voo=aEzU$PuLK4Dp0D`Cw#Km*$_D@?g6$;0f+0Pl@ZU8cF_jj*3AkY z=hxEDwXJ?iV>^-UtHcx8oe<^mq6MMf8G{lNTP)NNa9?6 ztuRW8&J%*I&T>0R=(XMI12POTp!{Xm7%zOhx-430v4_0OZk_6ud#@I9XzLLuj{nzx zE-YLqzFD$xXleZGzg=DQsuoG4dE0X`A9?^|Z`r;*QrxJz5Fo7ODO$!)d>lVA z+5_Epbk4VyY4uDR{3pwq?Y7|B3?-Sl+k#TYvPu1>VcTsRE}Ssmh>sFsV81uL@0(bA z>MPx3lj%s2UoVqFP(-!u>-L=+-iPpBWGS)jV@Z#+2H0oHHk}qI!rFYb83wEqB_`Hc zR6f$8z;O2eJbvH5S7b9SW~s!NAG1eM59=V?PmJJdJ$!jPC@4>0V99m|$KUxxsq^ke zJW?l8HNcN-=u_GEthGeQ?j8{?=Q-pVpVh9IQQ4HbJ(3oMu>@qaIr`5pSs_w37 z)o)ep*79~$&Yh6whW5I}qpop^1;8J8`KFk5|4l6%Tj-LjvxOtT5dOthzQDVfw!EA|ZLlQoq@X%#?08~1CEqx@-1BI6mic%Jm1<{?FHyS5-86Lm9 zHc9+KXiJ>vJS#chRw7)wB+kN= zj`5qg(NV6@yK0KrX8)8ZE3+tDt%|U+@WGQB^vMH?9z4OVr1Yn`Qi!Lkm(v|$x*`iH z14_h;>63|yx(is-=)sAkf2t%8W{RIh4 zVPiimrq!v_vvrD5`%Z0~-YH}TV*RG|>TKSrb7`lZ`CseQGqZIHyg2S-9cJ`OojO0Q zQ|I$eJ)3rF@_(&U<%^!X#c^9rC+r=FYEsps-eT}V51@x^tDJXU`Gln{fI8bVOQ zV!$J|wzZh(4-sF6SCQjNWI}|u57PIwtXg=pAvtBFlQI=(smp$*ijw?SC zp+meK+|>f|nyZj#@SD(vw8%92rGm(`-wY4pi)fMGOgu4VP0*qb~se)S+5e(kT zsJ;Sql}!%x5acD>SZ9k{w1~`oRqK=)0#@CIJdnkhYlzCSN3}hsgQ(eBOZcr(RT@j) z!@e23MvN!4ggjN(p+G%OjogT4i=Wz7y2g`YO}RLN;<)rhBf98hb}qH(CWlLx2q90X zCWt2hh|E!Thj?+bzq3d&E5l*Z@}QJrorZ!Gp-+&qNuZ%SY&~W{=sqqwM1 z(e`;vpF=gaXf%ycBf9YWXcQJG#)-?lY!-8AM8g7mqq#a&puIw1;0z^^CIq}`ve!@~ zS3P1K%z~_4R;4xSMW_(OOL3Kyi3ahK=C=DbB$yoHZh?n)zid+y-iYJRw@sJ^-nH57 z7o?Hv*e5gLZ~?J?ifdqN-Kt)$F#Rm@kyqvSMx>-~hi888iw1Og2y5PQ+w<1t9;S!O zT}%&`JD8s38-n{V^YP{$ta%jfVzRhwXR;`~mzWx!wnoX0EJm>^DY~uG=Co)iNq5T; zans!Z`FsxKsvEFy#pwF>?hiHxQq-rr12entA`D<2ST!}6%+?}Saau(B#4E6^#hT+= zt%}X;#c5KJcVy9Z{Y-_R8@vU0?zV;S3H3wTQ z4$f?GWAw_b#g3UR`UX3!!47PO-PmYbQ0;Jhs}{R8KecF=E{*8>asA{FFmK@8V8$h- zz;PSBSygEYNr(`jTH}JQyn4Ew5qR1+?A7FHU8Q^b1yQ1a61_ zo$N@1zA9Fv-%D4F=#VdC<$j;P!^v#G-?>q@+21MonZIM%U+?cA1>f&$hCJ-DJN8U; zT`aAdfUV_r)e+|D2CWvimQQPOuhBkL3HO+ORm$Qf_DM!=IS$#r>}`CV?P{9GQ9qtv zytfHb21%&19J$oAr2dC|M-W8OG`E_L~Ar%XrX%74-A)DlsN;W z2Ft&*5*7`|(1iDkp!AKq&*7AveyL;-;=HZpr+IHZDKSUuNg!@L^^M4NQ>P?riI-v$ z1bn$HU(bc!e+YdH=L4@Xpm}*GN0R@ELB2lKpq-3*L?r7i0FzlX8!)8UY-)#;eMDwY zQ+kj5-KSHxI4U3HLpf&3&9Xwm#cH(ZJ%93r#e}{Og-5H+)YnqxhNim?^56J*>}lix zslwN}9<9PMDjNcc`f^F6(1-+otG<(xqZItY-?kDN$S{|+l|VQu@kCbe1|F2dkiXUJ z1n7zyJXMu-lG~x+Z>pPv|H>`f&i8PE0Bqy}rNa49=!zjjS#)a0w-oUn)Rq=P&s_{j zt6YojJ=?#~mr!TGox&K^Lpj5&m{i>MjEjsmb#WnUS8CvmH*#HY%m zjXi4a=_)AB^;8wY$Ms~Dtpcu0J)V8KJ0?HuY^O!iMfT5m>z#EMpnm&1i99PHRFoJ2 z-Pb5i3A}%ZZjzbY) zrx34*5B~X=YxC zDGbog#EB{|@iVhp5%oP<_1cMi9lgFI#Q=zLVJ}w4bJyKM+(A^3>KBCc7Ucp;ekp(o zC2AJr|Jsqn&pnmnI@#lRkTszg#PTHqcHQ)xblha|ezNVoNgnJyjP8m{7y33p6Tb+Q zQYAkBtLYlxr(T_RX-lA6b4#6CaD9Bhz6rqb`OCXsFAO*k6-2e!VoO&9hBm|?bt&}A zSb&$tA)BNbMA_&Gw7RR7`$_tT`~|g|N^y6(|6KH(L4YxoVhIKeEis2r7CCf_9W=;K zwg>_Lmg0R{O(2=;k>GCRA)fe91|teiWe-OsLo>6BM&q}BgctmNm=;I;!f&-bL*6g9 zJty(S))R!m>)+>!Y!hm_W0)pnrvhK$52|hBXB3+cO?C2w?#=jzX%=ixwbn?zuGwS% z^$Nu76gxDiefUiZqy!8)GlhVGju0?&>uo1s6ZVZ3>MY)>1}Sd837=* z;XwXR!hlKTr5zZJ>mLBGkuX_)JPB*xEFNMble-317bj4w@erJs<X9{kfW-m>#8RoMm=4G?T&x3HP@kM`3G%PvxG*@<6@8)T)x^&sWpt;-} zElXD!lQ4CaX?3(1u9+7gTz;wu{j#Yd8o*B#7flsy1_3!0zL7lZWk#U-7ugo*ldO-T2);Lmhjwk_Zo6k9l?P_qd; zqbn0Op=%ul*OnVe)NC1%M9rr6r2Pt;*OmD?sw?w#L|5jMv}v~59@mxmB5NA+MP60X zrd6afBZOG`AY^mA5Yk%$itIKtBW2Jm!iB+fF51^Nn#(x9h2S_0ry&WLXK)knV^U(p z2Qa-Z=X#E7L(-$cFb#080^BS(vd>=~a3F6EIFFj+m)3>7m5WYY;_XrLqf0NqY^5ZBjqmYLGcp6x`@cTFuo3W9(S#{$DIF;+Jy&kC%+b zzjG38A_z7I62g&@Px73~%#h^K_*nb%ldXqJOqj41vpAU+vz|>=#?yWAI*NuN#<1b(D;x{5mF0*uct(rS_nzA(ITXatlDl@ zvGGSDT_<=SrKp{FNrgEoAYs;slPg*^NU81(78=npv^cfNkTW8P%x?CG98h`WZDRvCY;oTxF+s42$1wBEJ~^Pz}dF zG*(*tMjdf6dq;df@?HQ+Bp2D9WFXe&k2ZpsO3#1Lwb?zaqifeugxj^hdQ1CjjKB5y zLO+&LW=xid;5I`G_H#1x00!0w#g)CRo_1-7C=7Ob%u*$fYA6b7Q5{QrlMZN@b=fzE zq=v}CT92`}6Pm%2(WIlz!}fA*mt6Dp;c!q!^)9~XjGz8ZknL@H9~HiKrM^$;QPvxH z1gNe2V0lMiqv{9}>5Pu}J|L5*!+9SRTdrrSF4QqD@nCnI?+8f?2x2T&fFCoba>Mam5KT@`J)IQK@i$6C;XLUw<|ls8&p| zEV&;?M}e@7v}o_t(90}OhFNwBf<_5Z(S)K43?lA!JL{@ImPbamPbT|7hEr*8XITx& zhf>Q(Bi$OIZ)9cI2kK?ZfJY>_+SDbW+;VH&P;Wp#p=QTKBhKRTc=R}9A?VvjY%gbX7gNUK9e~OnL*5S zZh|LfUD~vywRZEJrzHZbC|LDM^Oi2v7+qHI>XfxQD;ew3p>Nog z+q!@qS|pV&WW5!_aKt7@_L6`Bev;;+@Atz_pzK{_%LW^~lr3 zDNhHr4)rSAg~j+-{v`TyHhYR?pTF4lRErO4q1boA?_=2$Z}!Abw>^>Y>1^9$PyFnZ zr;FJW0*E}k(6aGMmI@wUv`0jB|2SsqBLca9JZz7M;r57ovOKTQ+n=pqh2)ASRxHsi zxmb~6Jse)D;0?m{`3mkJ{4i!aM8o0!YP3`32dmM|DnDFBl;`>JDz+$DXu~7b=1pkn zH--~r%XYWg?bEuw>BjJsuHeoIuEO3Yxyq~b36(1oXhLpx-S4!|4qNe!;UQhYwF6xB z*$XtO&n|OyBlhYg-74`aXS`Y|=g;a2U7O^pub$zmugBCq_D|^s z)j)eD`F^5hb3Uz-Tc1*%g_G8!IM~T9<5Au3wBmzp#bdfBsWERqrw^gHdi%WY3Gh@U zZN*1*U&Jto89+H|F{V)xpRJ9m%NR^_Ijt(Sv&3NhEnXa(!}I>0bS|62XZ`&Jl~1Pk zDu2%3A1!l#!QVfx@{8OHI0xs`gd*q1CTM6sPx1cwZ25>*Bfn0fywnB*u-ud+j1!R3 zGX<<%%P7OE4nME>G?pKELDl)-65-J7F3IlGIE^}J=D!e4Nrq3h4W{gFapWoBQBYCh zU5%kLY@B^n$yY;F3*|iK8$+Gh7LavA=pdzlL%+lL(-^IOGyPpZ;3S}lSM(V>+{jUA zWv-|37$&(A1}tmKgnRi14vN~q%}ViepO_#BOskZR604|$*SabjmOSu6R5+FmE1@WJ zmiP=b)gk<2(J?PL{{resoswyXy7}qo9DAM(886z^+r_0e=T_?);gL0iLN2_&xuFT;( zT%RdNYjizdW}}4b6P0K{*CQ291ZDusT`5{iBOMnG^lIxLRlGsvSUbu=laJ) zYOKNtF~4RrbNi0;{06Y6=x3GvLKLs-cso0PlofYi-e{A&Lu}Rg9aM@Qr)VWb8}nVT z_$WmybSTpetuma!o9ih;UZh!x1yB>67gfBZ#m+4!9*tp^)$I_8KhoPxgkYq%+c}Jb z+xQGs4O0~|URG6np0W*;Azr0rGKEmMkwR!t_M&Qk?Uv$1TIF4w=#<{x%ZXDQz2N%H z>zdH!bD0&x4T7$960=*1!a-mD_*2hq_QTvM>&Ky{^>s=A>ow%KfJv)MA{93 zxE;+H+aLWiYf_LMyhRV&+Jc)hXZqgc$))LLHF3|kcP1!rZp};X{x$agkhSi8q4M4@ zx*Y|UJfEw-+pQmIwZ0;6ecA1}SX5oI_PgEsiB{|D^VYj>xAbe#Xrg?avmxtTh;xmQ zpJ=r{oVVU}J9~mvN5;Myit2Z<^>eM(H{`AN+>QoWl_M#PC-JRw*S1jQJCrTdmiN#s z>(n@x)~UX4U#Dhno3z$t@N*l})`{G0a=c%mJ^)i?`Nqj)PCr;r@ujvWlA?bMY5VsS z?~5~Ke5mbdS$w4JsXIQ=_S6+mv^{Yya{eS)eIa{yETk-wrX8`w>?WkZMBy*=vPzB7mO&h+R^6#RGoEYnnE zqHjHEW4iT3mjCu2<#f>c5hmC6B#7)+E2jR)RVsJiGH9JYn*9b(gr!KCIh8pC!muEM zCompgn%6QD^u@Kr+^vK`ZjmHC6Zk~gMRVsVRc+MMD#lwBAV|ODBNu zKt>YaF$8Rtz|f7vQ3>pK-h4#p0q4y}HM0Y$CxHf^EJ3lQ6L4Ovl=M8N0#mPf0(FfE z=vOOc1RPWGCa_#rbgiss=cDFP>bXi442Qwom7Kvv@-{fZ?$ioRbtt=qFd{2p+u&XS ze8C2W5Eg&A$%BU}jRhRsgs;@2iR=ZAd4!WKk&Pz`ISfwRfW(`Ec$pekkYz5|CnN0) z-=Jchc1G6U!Wpv{WCV6WQ`Wc?4cfw97KZmiuH^ZS)T>x$+*dsMfSA8m5TN3 z|AzHtQ8QhxI9EkD^A;saSreiBmim|>!vc43W%%_-G_=Pda(q^Izp{mnUyh|Da-`W)6ANdBKd> zNgr>{^626Bted^j)8DJpKZP5%Bb9^G2|9i5+@f}{I<0+Jl~uaoH?gJol5;+v(O5`9&JtOyib@v9UYrk{%23YQLC9+c{ zvZHw-^^J+FcPFy0c_RPM7&zhoI|dHS6MS2$(L7=IS)af)Q+X3mR>YRa(VSzyXfW_{ z#=5<*=Xu#bmjqpwe*#($BIYcJp^xCb{qDF40hg%Yle|2Uv6o-Y-M)@SJ3ll$21_>k z@Py~-IOnzU1_Q6)V`ZM6=&(4*!#IcI@g}0YIl;LY;0UiEK!Qi(aT@@3?%>3$N?M6K zHv;4%Vc16qt3w#nkbL(A>$@pFWF8)|+JlI?2dRJKarypSX_l-hlw#GU*z_xqDMwbp zb)%Bi1oqSo$R-S9kF3HAUptl^0?t#8tt=y)@Yu=;;-9DEvt}jm0Fvz1h;Tp|EeOwDK6!{5uAM$**z(>RD1iLf%+@ioy!yhM7D+!3yMUFC^)t*mH9cssN{WVeT}_9CIWOSbJ2DTFMlD$LycztQ8$0SS zuZEz-hH(M48Xe>X7}$`)KC${1HYHhJa8Y+7CE0Vq1unC2UeKTX6 zCtg02sC^@7x{8qXvB%WXYgZ+7$lPLLN3lZ#Mpyz`y@AaV(dQ{aLNG^foOSV7hDmB?_T34KW%|4 zq4?obY{+2M!Fd}AJ1+dPH+5WdDPJH3L$x{*hr?O8$AWxw@I}`gzdAY=$TLtc^73VWSe}^fjXdAc zVC32o17gmM4cpf*4`}?wmkiz^pNLZ@A^WbQW_I}e5dMubh z>i%CYKVaSS(&%mD9$$WIN3q6drUhh(*z7a=Ud6mPNs{Z9amKb!3r+_<9Jy`FmMx*! zJ=>gYY#F`n-dvsWLlj;P?G5BH`|AKnQu~)okqNn z18ImHmcx`-Ng}qwEHDGY$TRUdMWYX_(k@P#OQ!`_$Rfqf%>J0JuP90xo^@)tN> z#@j0w%Xc0ms~B{pP%C`f2%Q0WPAFdhkRL^WhvW7yXmrO&H`WX?A$B}(d!90bId1|Z zaX8k@3^(dL`xJ_YS0}N<2;t^!tw}ijUbrB}w)@4Faq$VXDjM!zWD@&AeSa^ z&S^ZdAk#nPN*`Nk=umhUfm=7YSem^I3InTpR3%Ign$eHc`CXtf5PQ@d-d2~dh2l!# zmAUf8Gj90jgl)Dy4=Fo09P-L{d0yIfEe~UHK$2K+sbB~&1Ik5G^Mv%pUjH)pWb;Y{(vp`AQ zJtkw+Zn78|U~95QSRi<@PC2NdR@yh7> z&zsBW>XTYV*?o4faj=>@u?cU!S;;{a-`t2@fXtv}kzsWZ43&&b`@=DXwjre_6Kt@V z&T$!{5Gy*xnd#x=^YJ}nXGlSjv4gNQlstvv3qtI=QzfYA6iV4FOX}gAnemn7Usyub5Nt zlbzS*glf+bRWV$`!$}x<<_jyroapvifchYRj!%&}5I-NHM(;SgZ zO2XgZkC{8(Rf6Cu{;37c^?YxfuigS*$v<^I?Tce*^r-jo@4ARLKg|J;4bmGgCQ2Th ze}vTpsXvzlX>9#g;UW%5doI@RD{EhKpiWf@dlmaKZoKkFZO0nf^O3|zkWQl=O8jL|3 zPvpEFX-nG!dlz-gM;(qG;q3Pz<`gAqQUcJ+65#2Spe_MbFP99|q;Ezt@BBI>o1s2I z_cZYB4(>RE!1AG@vBg`BNnZgIr(K7>}mo1nHi z3eyB=CFgRj z=x+TI=o~$f}Tso8udg{&164Rs{qI8_^;A=>@w^~u@ z-Ejg4k$C?C(++X~k_*-GICjJ{MiNJ%<8c|z9LFObb8pNH)e9^%6HJInaG{h6C{DZ> zt+csG!-XTf{6u3CIAY*Uwy(qWyR^VC-r*y9oO~tG7RXJ-5j+uUW2T9s9&v3h%wY(= zr$$pTlOHZ&Y?=?Hc#QP%D#YyepRc|v{+ z@Bg5s&FrN<2BHTBqkZI{fFXwmD3yex8?$er4%q|Z(aovyXo;~m!(npswq00tXh^J- zOKLM((9+CROXwtJMd-tf%3N1GFd=a?Lco@Hf(%D`a-4vJ=Aq&~T;Hf_goZ=5<}g zRtdP4Et08rGNU;O7_)RfF>_bN!W;WsEcli+>$3lO#i}D0C?4mLu4)z2Cz=`Jz{>bo ztkaq@zy3o0)3#|a81#8<)7EmGTiK>Cr`@(`E0-1PHcgWwWR7WyH)>=Ze!w?msF}hI zxaLWjBMH2*ZC9*)00y|-Q)wl;fyin6QJ?3)L;%B8g1tXh-y#Q1ATPjfX!L=yiP;m2 z6Jbkx+7sn^04ioK zc*>C;c8+|fo-b+fg#uZ49C2H~kq2*lN<+2D<`t%+dS49tIf%~D4muhgT}J0bP+r*m z{rV^b@9g_1%O!iLoXE%?3Ku(clO9T=I!Zw?3NMiLsgcXz-p zum?kuZcA8TZzS^C^-f2HO_yMAdjAF0we1rJUNr0h_UbobHp-n}m@$;3(V@|fU`f>A zf?Xeb4m8s0*hIYX*9X?Q>Iv95g5~3HoU!GpMS3g_2SSpY88R9#{xm{;_(lWl4TJVZ zAJ|*Yfa)Xsx@rz9izQZdxgMa49 z-B>$M9pfB^5`^#vacKJu6ZcFq2l$^1h}S2XJ!9%Oy)3?(Wag)T#=c6kGO?G>hn<=b zw+_T(Z2}!GF}Q!3cmcfCJSqmZCu}@UA!0(%UpQSHLjA<5Py?Zyn!;rB$ugnf(BbyZ zSN9nqAF_bDH-dFBqV9b2sfp_y-&h%xi4VRf*;|Ni^kx|81fN zFF>Lj8xtL&5*^qi(VPoSd*Ru%DWsSS@p8TvbD**-;Y* z57)tegX0Wt2*^4?e`HnBPQWvkiAWdnqlSURe0FKl^fnA`o4`oJSJ+@pfX+VdILWR# z;fcpzBw=e(9#w7wl;Y)!&F;SY#HSaVc^&GX#C6gAgYVKzgm!}RkcC6nPiZCkTw-1r z#wj2twSA6LW?p71lBc@O5vmjSDQ6U_BX|wK;dRJyMxlD=y$IET_wXJlV?-g_@Oh*f zPM=WDC{zd5$~s^b>~Wk?sE*tcp?b}6YAVQfq?E@uMaYggPEF>bdIw{$t}(|Mg=*uW z2vwcqj6!wrFh0iSFxz`rIiry6JQkta;5egD9Xc7Idd+b*QuWf}wc(bRbc(0fy=07P zsrnzlluSusz2hXa&Zuc_{b{)pm6yRd*O*(%IJ~3;jb<^L(F{8anh|HDfzn`NqeRN( zX1DHGDNgLtRD9PRj1=a`o63p8h@#8QobXTaVN{qdMi7S?(Ls~NODzcGqga;0 zXFq*sgJD03Kf1%_8d-Ld4V{t2y6NaBL3DF!N>-jrMKTR{%{lcj6)DKvW0pvR1j0z; z&1Y}?0zEen+~~t}(P!UBEEZT|ClI;vN+)uOoFcX036V6@?BHMP6Uj5pEZ;|B{7iFX zyFK5$NV8Bzb!S1`JJZbeAAeQ+0+GxE;$^8S#CtQ%ZnV41E6f7_kza`+SD4-UvV2Yn zc5G6Fssu9gIL8-6sJ+U^6-KDt7;)PbX6Mnz-`Xdw34_Nlf*`>9pkJNAV0Jls?Z8^v z^UVvWS^Uv8n}x!nh5mVkxxObpJd@bg=c|+@gzef`dc*PW;tO`n@xfp0ywbed_qj;C z$}DTWNm)hX@e*acz43Xm>MFB`f0bW6ewBHy??dtVRpto)`sc-ftIgF(8$l~|z73z3 zt~Q5v_|V61N^ej+VDWQwJs%hG!xWn&GH03HGasU$JnT!tA}?$~hz(jY6f-dk1K3rw z%pvy6d(mbE_6a%hw}Iq3i10{X163}L1k^z^TL{K=1p7cOUzI;l`Ex; zLknv2qW~L0${sS}=S(!QJv?BX+xL8iq#;PyR>op%3T!zY^5AEpbhi0Q{Aat-swa1g z0Yzr#eyjJ;3Y-v%8G}>hGf=P?SO#iuwyrm3_;?!`Ug$~Aer-UkEi!X_C&j}>W|w3n z9P;f6Cg&uuN!~6pFCTjgMp`6{**Vv>F{_SsHeh4rcZJ|th{?U$lZ|-6qH%eNWpi*R zIOOu4Ip(m$V-Uh%hDzbRIp$r{_v$Q%3@4)n$Y?th0m~Gs2<@;QflYAkWZC;bt^_eI z_y#NiNuVv+v-KFcWqbnSGcMy6k{lqYK*~!kLD)Xp~8MekFRAs6I5K z#Qd56z<+j|rDlJ>|In9W#5^3AI*^a7&4-migUhKxdd-$z`Ht6ddR->H@^s~QhZjD3 zD)Xf49$pi8bPmVa(JXP8cJUw-CM5i(=f>0Qfqiih3ZE8JU+8TYcBiQlXp#+;fX>E& zfJ^{w3R%Kz4#)3;_pt9{CsUOVRS^l~Q+cM_^tjY)(fptv||;p7FmL9^=548xoAl@!@aq`6895FO+SA7;a0_8O?797D|n zc{#fuIJS3v_TjfN#f}fYNYn5X-EmM`N8t#b#_Ol=z#|DBLl)R|aKkV7DkfxVLRw4a zXX3pN6L~v17?#YB5J>^AI$Wx8kW+jlQ2!Ulvv8q(%JJJtKjwmRy9r3sR5J~v>ceUn zhYbkd=e!Lb&q;}iBMhuXHV;IFK!;sXW@d%u%^$wRHmE2&Uru4|x<|Oc*R1lObU1{K zx&F*b+v}$ARZU~emmB~5{;G$6RJR#lwUsueG3F0@o>=qf%Ln)OQWQV@`sJIC z{^i9FFCl?s@#)r+tDgVo>20@!#kw*xH>?zw)Kt<&4Zh-+!wJ=u@_4&x7PmY?fpfTh z^U2$9Z`=IVt2>Yb=IFC~p8ex9k9{mUGd(2%ju`lYQghl3zko(11A8xAw&=aUEbk(# z;0WgJY9dejpRrM+(h7o#<$!cxftj1|tS>PIV?CAI=>_KGPT!`+=PfjQwQ+yrmvRxnWe0RM2sZbe0&?rlfOvD+NIba692GtS-GxlyD&J$u zmE)5xwHAaq25gv=cmuu;CD!ES+5iqiK$cY;sqA>%m&z_tQgV$~h0E~$k2}0!O=_E@zB{;Im=1yzyN&NX|^EP8)b)%f&vAf2qbbg z11EGVhp^Pd?tWjTFKoZ2)=9ef?ET7RVa#urL%l0bRhR`a`)+<&1gp$;sZw3#b9~bJ zQTYBI$cRC6rfOMT#aW?Q(s<9)Z8~F9MwBEsxNOkYR)1qsxJ@vG^aJ2 z`G%QetC=@_c_gVh3vO07_f3lGn;g}*mD?BB6FJq^+U*_j4Mz1%iRzmg)wfMl-!#WJ z+_aU_qY`IC^=%u~m$pyy`e`54H**1w=rt$Kib~ues&B`rzS&WIJ2mt52gA=mnANDt zzKFv%4eT7yyzD8|$iCoXZsfCo>Mi>o(!E8-Yj|GAlYQyHzng?^uYbYeDnoa2M3z16 zV=-s3InKZTOYu=PuJt+G8s>>1UZ^(P`koaZEH*oh-EjH^jv!Efu&bclkjD{@|ucSYR(>d7gUYx#S`F_ z0$#9JrM@MT{ijs+k2hwYBvPkCC7*$W1_ZTs3nXE*0|DrgBw3M- zt@V4qtLdH%xR5t}s_72i-#pd}vRMs#-$ySxE%ig6&nN6!Oi7RbQ(6J4j#Lx$aw@lu zrZZ{}nbcCvgzdre%`mQDL%IG* zqa-&D17}RDn7BC1eCfljg}5xtS8&!E*LCqA9*s#%cjK~h;$VZt+Ho+@Yy&5(#jGBI z_TfO|77Wwzscjgh(gjr|i#8z0h94h8LOYY$~bAh2Vdn4UEh=lX`^>D*r2hx3*(Z=4XgWABBS3!+}kS5JS zYzAS;g4)mi$?N;{)$5$F*gpo|U7n#t_~u5$Z`*0q9~kN7=lqDJ*$qsK=Y7%^*t=9( zn62bMUU-lXcA{*QcBn~dTYj^|%=EwVipW}Omc)PfIpY5FbMeEaW~UB25E-?QVi>GU zb+aI6%pL5{J{K=6HLv#X|6JrOGkc^rQu0+Hbc})avCqZqWoEVi#OLB5Nc^Av^X}zl z-|(-QxqzByIh7)ds4KOF{*C0EK@8TS3eUdQoJgj(Q@{@7VrX{ZMv zpT{c2w;GE(K%H?ZBsUTvta3Qnk1azxiK+!CR2bI66e&Y{+fM>lN>WlkO;jqPOqrg& zA9E8VmTTB|`o%RX%uI7X+Jqc-Z(3pgF*eg@*I^GW!UC@tKE#zGWJcU}otZTRPGpn0 zm!hAT2p1T_aQ5jk?e!&Q%9S`8+PkEv zdRbY8*!sBDKRn9_8s%VeYl304!t>nf>dI<7b+Sx48NeSCB#@3jjkkt72nYd457C!D zx(TU(;@aiarB&6XHKi4`MYUy>74wT~W|bF(uURpxxUzKa+_K^_gwzz3msc*EwX~?Z ztY}Vo>8#qaMWqN|RJBA!s&Ui0-Lq=uS1zd<=nEP#NNg~kvM_k21D}a!2+wQqWWj!j zCo?s@vUT|iT?4lS3?oa7IBB*EBZxnp|2A+>FRHF79aA=MVnwa2qJ?D@B~vRaO5Jp6 zKrX6WRLUfE+zb-nmjhsZwFR^T==yCBH-DNw6Yg`zmQ~F!t*$LyUR%XvOG}E&OP7|G z8(9d{5j()$(S>Kj&7Wq}NzA^dLS{>>lEk{%N)(14c|m6w&s zroW`LxVEyoMugX!lRVP;#(HzkT;uVWpiu!vdEm-+EUq0E>Km&vvt(9vMa{5~F#T>F&Q}fNNGQXU+LgwOdAqaK5MB;7IDiF)`F~-U0=i zvw3i+x@cJl?3R==7big1DLUPPn#u~vt3x1Y=w@a$5ki1s2)lUbb~E345amVxGiHcG zw__=ET|oHmFmrRCL_{eM?31C=isI@ORkdXm^Fm82YfHiUP(Yk}2bM}t1;mOw%q)y` zk_&qPYvLV9`3HcH0DaC@DJ))X4j0coY9?e~85cC_z~+~LZh*690lm_%_!wfBBbMw{ zc;*7M=yrxX55OW{ah0kNI8ib7#@nFU-tsZ~l)Ns0u7F;lf`S4(`O{U{O>DW{ENJD) z76fRJsOw_2xv;3Zx@g7R%IZZ$wFT8Re~%9u?5qM{0}?{L66TmnUXkvp^+%poF&*1<@*7zs~_b_T%DHmOD_PZ#} z3K|O$a|n796-IGURZ($S?TS$4($ea=(2(%cG%#0<{=m;&R8_lTVg)3#tYlo-ys}zP zlF0idi$M1>c$eTwg-u1>D^xSTsH$`%p0(9wC8afRVJxX!QajQZk)Zn2I6T={Q}MK9 zoZ`xgn%YoBN!g;2z^mZTLBf+{q%A~JZ!4i6h)XMKp!#RkRu`4AQH**-Wc77)3hH6d zay2!IX%bdH>%ihNu;}|Oc}VHF3DomIH4jq6VN2ulfv1XH8_c#nN=lc9Mud=AS8y4E zsVUDoe{9C^j3m{JTM?5AfD%mUB6!EtKJeoY2}xj4`T;@!(tn3BRS&7*|H+sdN>*cP zXFREk`{Bs}ZakhLJm=!cj$MtX8dJ+xOs`y4T0KUbd(vzz77BBKN6BB^)|xIpe&6gY z+HW++TxJ;GATB#+I!fOYPmQ++PWgA^R34N?t>yM0?u&qz0pG28l3F)y9`A6@Ud7=Y zk4Uo(AcCK6#(@fr;OBU7s&D=@J;w_EfRB=%gMiGKUy2b0CQn6iDSBh&lJb(!oKpO+ zT~=CJ5$YGh5Ebe-$WyxP)21!n+GwVxcMArMtHEb2fVPUn#p#XaP*26n4tZbDYDdX> z3$d=m^Eaquc502k2D}isC%KmUV!uMGe-0wdzzGI+8komYT+f;TJIkAIUe<^5nhcRAj9jLn`iC(fD_+mB8vWa1xt- zXbwEj{B*`ET#MDb5#qA7X3rFAeEzgdj}jZ;oiiF<7gy9&l@^!HEh{aNHeVt9 zbk*D9@LF?#Z;U8EWp!9tpE{^TghpaQfkF&C=U%Fh@ZP+}J*7tN_y|VEI#LX>PBJ+MBUlsnK^4 zLD*HIN(Og>t z7y|H6x2!xVFFA-Xze7`jIco;geaR;fJEDELG|=87uuUx7pxEBUYTv~%9oKYJS#QB~ zlrg98G~0?TkD1BcI%F&AX{cCQQSR!h0;g*L*LDnwQU5Ztqvato`epA2C+1m?erH`` zPTR(e>(q4GHUpfr0>2pUO8`_){IO^A=SiXIXqkA6cjdu#%ae4qzcj=7s7)YK;tujbEMPw#UA`p z5B(Lusq;1c)xghj;j=yA#lQ!#tLq3Q@Zi9r@wuJ|oPtr!=;z=wzfTX9KP zZE1CW_W~@J)E)!w7PVbrc(`Th3E*y7 zddd^N$HU-h;O+wa!b86oxLcH71Wr-X9W>5a3uh0Vcy?xERYZeGyRp1%j$E(k5;SIk zv7Cg8^{cE5aotwaJUan>#gps(9{kt9-PQVA;BEmu;Gusbf;$3w5FTy;eG9m|UH=q` zpak?C;3H%yzMFu)@8RuoB$u`wtMf1@sf(?t*;bVR#aF z7c|SI09rRx(w9klvrxpyM&$vEd^Noqgu_Zo1Hk1R_mON##$QLQorG!RKbjT=pvdbO3Fn?^1HL7mz%m zz_k~kX6w|i{AtdOv-J$|?A>OyD9p2xGoR@bH1+{r0eI5Q*=Amyd=&l*z~y?h%21KC z!R!^yy2XSbP88f_2D27aQV*}|8#HDk)(3zPK;mM@26N1rVt430rk`48)UzRt=VErm z@k#St26us|d%z4u;}@~D11G?5p*V00-n8wn_INyHl-=iW$jZ;&0D^L`tpa?fp3m-6 z5FF67`)FL7#hzrpgC!b$oZE!-IL;LVI8oO4<8WuX@I7!-m+9~)931&cJiAS3_HURc z#)yGU`?u!!5yIR#;8dQIP#vBI!AW-E>A?HA@NU4{y710$b8!&jMk zVa@S;PYhbt98`4p1;B^7aE^w(ffoVv;3F;gqO$VRl2C1BsJgUdNio)QSA>dJ6qi@l zVq$`d)%-X*B1fZ)GtF(-5NDj*oQ1Rw97JiwrM%rTcEQO743FG2it9lTe1CDBK3IvX z7Eg_DMUqjHZFwTbQEDh6y#t1e@Ql8++-F>6@e=GU)nZ?+x^e-wd29MCtE^rq_H8#W zN!c+3st0ke#FIwERMG1}vvclopdElxIMDr#q@m3;RLl9&!@JqNtg_Fd$`ZMr7y^d{ z;PmG>wY}-7+?KgTbbR_Iu&4uz4CF{kF>&$kqs~EHPv+w&*h#E)|0@xaW|V#RweF4=!N8<6cn^t4|J@lo%q#o_9YzHW6x_(g zlbPy)Cp+3eJelrU*9H~d%*zmqs|H$PSg*QV^mpUT8T}3-4uzxwPzj)$>h`QtZfu9( z=%(!;@iVpqSEmjkRuP`3QQjUd92aOc!S8nCV%tu0Y!@AMGOBKXE9z+Ag&G$LkC}b5 z8*X^PNc3HaW3Q{=_;akMcv>>l!cyRfjfExg#AD_m&rsH~IBL@{f9#n$-I)&-_3OU_ zvDq?uA7nAyx&^D@t^v#k@P`ff*Xv){z2$N9()94-Pq2JJ!+u^m(hw#c?G5`~I{by5 z4Eq!5s&8Z1UrX15c7}b+lL(EeTb*s#_etl0RD?e!ovZ)Q*07(I&eGp>#GN5@#)f8X zNj24Es+K8+rTeBbR~lBVzG|>z-QP@$q!S z{z9VDTYdVM-yg{Y@r^%6@ZsGtzck-y<7qqD#t}1Qz@ZA&S&l>QxN2Mr&{e$z?xlcb zxM$;CFubulh>YdmT?u4AQQ1@pc;v2Sd18kS_pNH$q4ha4%~gxZn7K=F)T(GvDV9no zBK&C+llFh3y)vt$6jOOBJpQP12%MhaEL>RyPfyK)YUb)6mFW*00y3i|FN4aaR>A_1 zw4UO?gqoO((^pPTpx{R=RtG26A~KCdiHl+Hn3s53r{$VZ#!fyK~;hTU{;B|(6 z1e^;|8o%FzKLWh0my6(0cyJ{`N8rj8txJtR2|Uu)@aK}=1Xnn5cM~iJevu9rpS)|% zJZst5dapSk`^DO(y~HDwXO^rSBwV%vI+|Cqk)?MgufXmDJ6JUkCSajf zN}&;aHSje6t2U5i+(t*rp&&J!EjwxY{%(3Bu-JAl1d<4?ieTI0h1akDjomg}0P z3`d2%VVE*v^T%gC5mQ#z^hAutsRs+e#gpllla-z6D7Y;Y&;8xZ^ymO7ODqJ0j2;h1)^fx08^yC{zaG~=`7=|-@_C+Z}op+igetE*ltL|t;z|EBJ9piJNIwSr4DbTr*MQ#v zJaNw~VcDm_&|MHuY%OOg;)^URF|d3snnWaYum%K9!`ViRYGdV!>pnBBjIQ-jl{~V3 zNtX!-W3Rj&z+S0wwkGw1#6{Y_%n9Dw;Yr+xks4@sBfEoKeb@kJ6eS?@%f+&SJs>Ct zZ_eJhSjJzh19#x*E$A_Gf;e!(#LE|kG43W#h7X@GyTwwoiVNz^UhOGpggXKJX=WRE z#Hd@!dgUAOUM=cBH%Dhz+#Hns<2F1QqlIK+6Xo>Z*bcI*#K4ngj;AKH2v{Kyc3-FD zWeOOwGu{QD{$<|pmU|ZGXcA6fF9z_ZOTZ{PoNdpgc!`UF|HcWJcDJZmcs8DqAdpZ( zdudWUX9L)k1%L(*Q{M>Ctf#|$jtgG~H(OtauZEk3lg57sH*_@BP-E@>i08$!h5wY< zJ^3E^CplsFs*_-wcoM8NNZF(sf1YlQi$}gRi!*+6yISM&2rf>JUc?4Jf#4#s^t3rPW&RyO+1}C% zK`G*suW|P7$Z2!v1=^2N%HF7P%1=KJKGB6UbF|(yJ@N4XpRm6++l#ednHk9!--%;D znnpbGl{u^TCV0)zUU;qmB)jmR!97^xV$j#-MalUag3>IPDT%wkHqT40hu5$O)yH3( zgTp!>)$n$ggPM&e;&eE1b~}yV3-=%o&NkHH55vvHI*mU9cTX4oDBP&0SrLNW@Nh@i zs(7T&X8xGy2RlxjRan2OkFfTvrn30;g2z z_|E~)ci~@p@JW7WG0rLCWZ)Rb#Hf>I#yN9UhHDutn!V?5LaiPn_Cdd=9V2XPTtvNLf=&^U#TLh6Zp=9XlhlYWGz6gS0KJySQr z8G@JQ`Jhj2UcMJ&wd$cg525@_h`%$H@4zgpQzs+o9yNLuql&0(JlShn6M;HVJ7fN7 zIL|cZCx`BJjrk(`YO7nuCV1sFPo(8K&?}ew5s`!E6HeJYxf~T|T^54nvPtP=j(^{| zs=18O00z`fk<+LS!Ukf*0t8VnD zhue+c4V>LpN1!md@lC+Hy23f^QafvU4!v%i!*E|$_!b^CquSOHw!-bkZw1bwL5CCX z=)!Mm zO1KAj@B%l^_IGE15!?)}0#3ow2@r4N!mozgonhi`nIV67`0s(!Fwp!m{s5#uz$4o& zcMdrz-FrWKWUBHf{uD0W^NAgL|?E<#$Q;lXyfj=4vrN6V=HVu@dbr5S6tl~%Sc@u>YVHAP zY6mK|;nf-OrzERWx^yChW+sPw71S!(>Y1&B?nTUG1bLEZIl~xUyNO4VtybA9AHd2I zqMi&WL)yc_QAwvkMH5lCzK2Sd<-j~EFS~ZTn$ovMc_?-s!j^MHDM&wt*ql7D+fwKx zE(%&(!&86wpqlyq2+u?WZGW((nQ!tpASnikocW65t8r-iaEuiz8a_7LMw2eSc*HKT z^~X(@StKrA4O+7j20o-li75|>0V&pk)aQV+7rcWfbMxUt;_(!#f4Z?lO>a{1Wbr%W z8825N+BP6pzXZGqcpvb0z`q_0ioQWBO^isjypuCor_5R>;~{XllBqxfzSDppyH?u6 z>{?jwY0ovs+|dAFr;2w!Q3}En23Rl$D z_Nl=8*Go&)bhX{1O4fQJKI>THRQ%+r@nLX>T=)pMIe6&sK5%pJapP=ejZ^JnH#AOp zh`ZCR&f^cEPTmE44EO>NgZw7~_+#%RJW2#VjqilpQ?4_Md0_g^rY-U(;B1k9;K>#_ zwUevB=XTRC{zZ~{41s*}&y(C6$IMG+mOs|Ct;VYDBjYECqm|3!aI5_#!`KD4F2YaY zuHe2@^gSm`887Vzk`6ynEi)8uc2A8DhnqUqldYC(!Lja*?O^B@56y52m{AF9d@9`T z1lbulO6qV9QnVv9UIh0L7f!=voC}`@_fYCm9br1$c`p0{xVclV!$-qSvr^*1-`)xr zq@lhu0bK#-07e7O1K1~U1$5${J9#RDqApIfw}w)LYj>%GuGHDkyJufi>=OLNJpzncBd!R!d4-klud6sPM%^5 zl%|*gGTJY%_?2FK3hpETqy8Mg`Ro>esCwUQPx*NV5%~1*<&sESyumJC{YLOpO3W#N zIUGOIMf^8rX1eyLI*>CH(uo(dt(yM3P_CZ?UIe@WcpLCn0DsI4f1X6OsiIyE&7S^q z)u=5@&NOv?`fDI$`*F~wNJ?Bx4Owl|FWaqNgV!YNmzm2TuI_xw>h2s_2m6K1E_XW(qQH2e$r@TUnMQcJ^om2brRQIVQw z4bL3(i=a^m7z>CdaJYe@o!FIU1#>jN=RAxa0$zgHbH!istigj$!x;xJ|K6aS3+CZT zl_5#+Jcf0NDDol&3yDq7o{k9fL0AE3iBN7~o&cfT!n`zFIzivU9;RmAM#OishH+%- z{v3*n=Vf?Op}zL4(hOe!iDDQ_22fb-*^YIHbCr0mn>9SU&GV{oX?Q}Xcx$j_%}TvI zsxM+KM69g|cwrw> z19N-rQ^Ve1JSkUfEdItWsllP!P=0r~XF6e5;>qx_Iv)XyqI8RT;8v6zB zH5pN|q5_vel`bz^R8PfGGQz^2N z1)$XNr`6xPYJl%oV0qu6)%RGm4qx|*y2s)H#AAGoQ&m!rYn-ao!Zm2?(IfB5(!S42 z-$p7bbSgp}PEAf7rST`>PI2MC3XIzf0ho@exvD^qUeLvyI8WQmxSdQjW>YKJ_qLKFG znd~7}AOD`;h-pKtQ5nY&MBVD)-*RDfU1w$Y`fX62)7p&a9Lvs{MWnvK;0*P3#ysSU zK7*`|9Y?$#lnY<1BKE_-0;U5fQAd>e2oJKNzLFCW`-J2Js^K5=3*V3Mq84J9qUT^M zAzgrx3Uf;73%s0P( zBXkqj47J82p9Txo-#R?2#H&NC^OGn1E-1$x<&`_k>YTA1Ud=U;fFNGb6IZ3+^%N-d z1`y2$tHl5|2M0?}?J$DqG~7zg9&u3VroVuw1Xw*BPqIvc%fcez;aky!EY5YHMN2y(zyxPrMe&~$5c`a8X$D_b8#9k;G zMq7O{=Kt|~v_lT^w*e6s;n~7YT_mq@M%tf{S8=Ei`+^(cJYxgx1cAGOG=3veqH&_} zTOGW`2Kv&r+5{%N9W<&%+8Aqa_yC+;5J`IBITXOYq45cDGXafLeYx>o=tLYSb$D+N z-p_;gZ;FSFJK;fdS~Iw#DS`1J!YGnD{21Ks3@3oToh$rvxM>_{`V$^}dlUQ$^~wfC zR7ci!--&)2GIB{xLdjKi{a+9P=_yv+fCmwM#-uUr!~cKP~%~^+f#P5$7;A) z0*Q-;@mAZg4$`Y<8owH2YDkmfIR`jZj}9*ZPO;PYBH-?{=K|-jp~F{t;@_$0`$PzS z=!x(XCxWN8Bl;s8iP_at4Sz#S3aL)|L*VXeB<{}Yd%)RaG(B;5*53l2?FuK}o&&Is zZ~`7lhTX6agIVDAtb?!P4W|P{((kHyaRQSvg3n){gooJl_L4+=*m9q^V}do@zw2f3 z`UL9-{$0NmlP6lI{k!(>o;1li?ep(?ZTE!9*6EmD`wx=m!ymBS>_bG-EuK(V8rM2q<5H)q&b}Q{&eYk{_d7gw zXP3Arm>GR{oMUF#n0-QxnUA3$6miXCAKX-o8h;aR7D&_gg1e(D{1dp{^gImB?yTcy zc<@Z%t!W=?0=|b#DbaWcc#aFt0nR?B!>0o0Sfp{@Fx1_Jj{!acc+)P_r=Yl~dR}Fp z>e6{-xFA*>UXLB^$XTa??Vl@KL@NYc+7`|SwXFT*47cw|#ceCH5vAc;jt$-E?6dC# z3)*2V?6bGbf|g+pBKG>X64L0e8lQRM+ApvZu^pQz|J3*BCg`ok3`BHylZw)La@*Fq zbvjg3T^g#Wtmw@vkeW7@S_3#f8wUiAg9)v7&O`G7(Fh^XQD;+Z-f+$Qvbo%-`Slm- zW@G9!>Pd|kz)d}=aVEkxn-BV8JhcSC8Cetf2yS<$U;UqGonDHZ`2Bjb9|bKxdn2eg zBo7C0e2P{SZBDlm17=z03|jT2ng*reNohD2Ks!z2r4AmA70!wb2^>bmt3~!4t8GU4 z>1df$Rn4;);W`k^1H++E>|^lM_%Ps{i)nl~@LU(pk;NVU5pddSn!W?{HfvSm7Xasg zu5st=M>yg!)KpEP2`&Im6;*;u(@Nz10~DDYqyDR)w8J#rJm@K^Dvdt~ghQOh<1r}F zZgb<*B&znz$fpM6XuD;x)hqijQm6n0Q*WusK$s_%msr8<*R?W3?*nI0iOL-d$7~sP9!cB3I;o|3Wt-)RMd@1teu#S=f zm5jP?u|m$#MMOMSNu-Dlu8SBgd-533DG+{JIoM9&dBy6EgDSsD=@e4y3efmT56;yB zclg(yaMKgcQ@(EcB;YxX{KH0aQxD@p;8aOE0~dMl8sHpmbvQ3;qs(fYGpigIKEQ+j z7&xn5(O+g5y!5Qm1Lrz`Cq@VigRhRV6X^tg0-WukalYG1yrs6lmyFOBV(K!eoQ-gj zS2SALZ8j~i%)m}iRftCxSOdb+i3pT$_6v=VgPWz+_*%Hxvo-!BxG5wW-{`^L1m4#b z{yPtTNa3xc<}}h}0|x`l>2DX}yxuXy_&(?L{-Jh(Z-`6L=k=r$-1K=p6~yy;1v*Hd z*VB0C_^ADWZyFg2~_bKCu=@poN9RUdiL$f&_Zgv}uGf8StjZcNUhYPpi?(V@UBbt5; z++4xZICYkbJ}gh#yA!wp1XS`m!e+QBU>e^BcajT#(1Sk)+@0W)z-eXZ_ziHki{PN# z0fbVn2_A+!C>Mv@E-IkTzM}6{p{}8Rp^+m){UnjtQE83tIwB!O4z?Fo%o{drZdrMG zXs*1UCt3@RsyU^y>r$&nbW!fRN8rQUQ#5s*<^AKf-A^L5_ z67;84R_aLYc?km8g8b=G=M#lS@J~JXaWQJKm6h=!KC#NE(J~-M-BTdoFz~ITZeg`$ zhLKw#~18AJ`#AGzi{y)@(Q-(Nk(cu@tO--xuD!8ecHU0y*$wTAU!;NvfQ^bQZ z1dpiYis+E+<;g0$-!|;)G4Yf`ug640%HLIariWJLf7lq^=*RT-ITfmPsE59jJiQ;6W7()P81F8Yr0dD||wx}V% zC;({)3*p`b_!Z!bwkcxLb=Jh}sw-2Bm4JG{20-(=nUh@KUUjKFv_vbh<)_v;;)1Ys zb;iQX6gf;ak26R-S7&tyYyrV6ak$RPN)BeF$aNCsRaj>Y&KLqOj&dzVF9(4W{T(N| z@-nZt?oZ_va{TFfPWOq$H(2Au<9|03{5v}c>jrD4-|Q$#`7G%uUbw-^oXX`Hcciw! zr!Fa1^@{)}*f`oz4eI*Y4gp#`_*ycTb+UY-`zmW@LWk@WIoj@sRqts%xXQ}*cgPkm zud)XD_hpN(R#{#BC$dGC)z(~pUMF$OYHLo{hdZUn*CE&8Nj3Zv6oYnZ2QUue$x?On ziS#vAfB(8pV&WQX6i*4I$eCpx!uaz8mWOu#XpI#Y(<2)Ziz`b?833n*PH^yxXYSmG zeBxL2R(5I*iSX0am+KQ>)LXd;Uv^HB269}U=yIbqs7FCwirk(WizhRPqe|69)hqhc z)RxFAc5%IPCHEa?=ZQ5pT4TcXprf*==#U~+*R60<54iKt*-0DPO{P!5;!opUfOiG( z7QlP}FF(?i(gSWDbl{#0_hH=e3VfK!_km|$CvZ&Va-Q=E*%d2Bag#0ha>G0oMc812zMG3itz{buL;GFdA?^U1O;5j(-7S&_eA21%RP|X@DyM^8nSI#ll;yN5XYo(4_$z0S^QA0A2z75%4kKB;XrB z>#iwACLj;c4=@}s0Wbql3RnhM1GpFP5a4HkX8j1X{WY2RQ1ssGn&>d|s+(Q6E0mV_irS(n^@#Sq+?&MQF zl&I;oKfY_Kc`QVey76-0^vmms!h&uD0D4rqN5U=Mf5dDfK7Giv{Ih$Cwd<{dtaTuz zWpoLGv97=G50I5LJ|M;@abUew(;>GP3JvrobVz(x^WY&6Y~jq;80`~VZ#R33b+=m` zQ`drwX3$mu4JYvb#qCxP|Gr-0!`rQ4>G8c&zSUn(|lkhaB=8f=QwcGDrt7?PDxRjxw%7Kr!mv_|#U!8G+~ zDrx*hxS4>)zl57zAMvJbu*UoG6nKVp_zHx%<0qo%Zk+wfjk9Xpcr|e9G|g`r@Jn6z zYT$!h_*~$~Pv=O4$?(W^5%9RDN?>>RE^DPf?d!jxNdkqNe)|o+@44;+AU_$lyY)tE zuYb(ObI_9z_gX+YK;sX?O&%J5#DhN?!A0`D)~E|L-Qy8|#g|*RG&*!R3(v~cc%cV> zED~SbcQ2Ix#&g6Qc&2LlKRacEfBGhCP$b;}5I%Q0_|R{Ybjm&WUx80`<>OP}lO!(g z+k|v?3>I%}vI_Y0-Dmahx?^yPoWVWoP;+G^v8H%?4>7_zi-oVfO3 z>l**poW@`R;RiLSO_JseZLv}BE)VeOlW5&0<=FCyuzJKU7l$5)fg5}Nw-~rXK%flV^c`@vLYAc$p4UJClWA)YPUV`ZmU6C_ z&hUx%AGZoJ+D-lz_LD)N*mvCvC)rCc%^pur*{*-my5y3@OG=mUWy2$g!{L%mObw}V zwrF=3J_>HGyXbJ@6p1Lj#WPP>X&pI`UJAGja5-T8loVq*B5?Jki!5{AOnB!3Wx4rD z6aI7^TnYRt04E{+y!W@D1Xm^hbSjJu#P|S^E_m27rq{F-F@1 z8aZuw&K5+iMbyoJ{(!5I39TPy!95#LgiBHPZF$*9ye|OEnBx;gpP0kWS^yzJ{qt8% zR~7HQw^#e?chf}TZfjawBl`l_Y)H#fBJ8M)7035lZN}j9%T=W%vuewo1K(AMuow}j z?zOJcm0OHlmjGH|mK88BMBR#6d$6pjX~8DaIN#MzvO|2%d%EKy*9TE`uW|#$D8(O+ z^aM?{9_}oJ$=q3I`L*nRU6U?S6{;()3~Y46Er5F=ph%i(?Zok)TUlcCPpylxGiRj8 zQLU5n^i)a95+j$NU*BrA3J*loD&+TlX!JBZ-FS`*e+%JmycErmhj4reuQtSw=!Vd} zoNRpLJl!Lfaj_b)FrY+6v9ya*+DPQP=X+E>___1##+grz>wKSe5hdybBKJ%Ttm zYrM{b*8?A;!^JDL+&i4-y?C~%k1{7Av~F~O69BPt@AI?<>l;>Rvfo9$(>LO_Y%NTj1mpIq3T)z zF*x5@4p;%-L-Y;P_Zs~90br&0QG?Yf;Y*}MBQ54i@nVBj5KhBl9Y# zr2EhwaPh@JpVHBv6EfBxf1HeIH|HYS&75dA=1=yXrxDX1gzErZaSXc{*kS3vNGy86 HdhY)KX}+8+ delta 224173 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%0A0ZMD#2 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 O!JUH)88^t>_x}Kjg)$%j diff --git a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts index 2fc8ccb1c8..ae5de9e5ff 100644 --- a/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts +++ b/examples/CRISP/apps/client/libs/wasm/pkg/crisp_wasm_crypto_bg.wasm.d.ts @@ -27,7 +27,7 @@ export const __wbindgen_exn_store: (a: number) => void; export const __wbindgen_export_5: WebAssembly.Table; export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __externref_table_dealloc: (a: number) => void; -export const closure281_externref_shim: (a: number, b: number, c: any) => void; -export const closure197_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; -export const closure201_externref_shim: (a: number, b: number, c: any, d: any) => void; +export const closure335_externref_shim: (a: number, b: number, c: any) => void; +export const closure257_externref_shim: (a: number, b: number, c: any, d: number, e: any) => void; +export const closure261_externref_shim: (a: number, b: number, c: any, d: any) => void; export const __wbindgen_start: () => void; diff --git a/examples/CRISP/apps/server/.env.example b/examples/CRISP/apps/server/.env.example index dd144d8111..49c725d46a 100644 --- a/examples/CRISP/apps/server/.env.example +++ b/examples/CRISP/apps/server/.env.example @@ -18,7 +18,7 @@ E3_PROGRAM_ADDRESS="0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE" # CRISPProgram C E3_WINDOW_SIZE=40 E3_THRESHOLD_MIN=1 E3_THRESHOLD_MAX=2 -E3_DURATION=40 +E3_DURATION=160 # E3 Compute Provider Config E3_COMPUTE_PROVIDER_NAME="RISC0" diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index c18fa4f86a..fa8239d951 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -558,6 +558,56 @@ dependencies = [ "tracing", ] +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" version = "1.0.98" @@ -688,6 +738,12 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -881,6 +937,19 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq 0.3.1", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -1042,6 +1111,46 @@ dependencies = [ "inout", ] +[[package]] +name = "clap" +version = "4.5.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "coins-bip32" version = "0.8.7" @@ -1094,6 +1203,12 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "console" version = "0.15.11" @@ -1162,6 +1277,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1204,6 +1325,7 @@ dependencies = [ "console", "console_log", "e3-bfv-helpers", + "e3-greco-generator", "ethers", "fhe", "fhe-math", @@ -1473,6 +1595,37 @@ dependencies = [ "fhe-traits", ] +[[package]] +name = "e3-greco-generator" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/greco#072bdfbbf6f4c49920fbce72c71cc884ea7423e3" +dependencies = [ + "blake3", + "clap", + "e3-greco-polynomial", + "fhe", + "fhe-math", + "fhe-traits", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "rand 0.8.5", + "rayon", + "serde", + "serde_json", + "toml", +] + +[[package]] +name = "e3-greco-polynomial" +version = "0.1.0" +source = "git+https://github.com/gnosisguild/greco#072bdfbbf6f4c49920fbce72c71cc884ea7423e3" +dependencies = [ + "num-bigint", + "num-traits", + "serde", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -2735,6 +2888,12 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -2771,6 +2930,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -3079,6 +3247,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "serde", ] [[package]] @@ -3213,6 +3382,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "open-fastrlp" version = "0.1.4" @@ -4548,6 +4723,12 @@ dependencies = [ "precomputed-hash", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.26.3" @@ -5166,6 +5347,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "0.8.2" @@ -5736,7 +5923,7 @@ dependencies = [ "aes", "byteorder", "bzip2", - "constant_time_eq", + "constant_time_eq 0.1.5", "crc32fast", "crossbeam-utils", "flate2", diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.toml b/examples/CRISP/apps/wasm-crypto/Cargo.toml index 9f3fbc4bec..39d63f1397 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.toml +++ b/examples/CRISP/apps/wasm-crypto/Cargo.toml @@ -6,6 +6,7 @@ repository = "https://github.com/gnosisguild/enclave" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +greco = { package = "e3-greco-generator", git = "https://github.com/gnosisguild/greco" } web-sys = { version = "0.3", features = ["console"] } console = "0.15.7" fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } diff --git a/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs b/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs deleted file mode 100644 index d0581e007c..0000000000 --- a/examples/CRISP/apps/wasm-crypto/src/greco/greco.rs +++ /dev/null @@ -1,673 +0,0 @@ -use std::ops::Deref; -use std::sync::Arc; - -use fhe_math::rq::{Poly, Representation}; -use fhe_math::zq::Modulus; -use fhe_rs::bfv::{BfvParameters, Ciphertext, Plaintext, PublicKey}; -use serde_json::json; - -use crate::greco::poly::*; -use itertools::izip; -use num_bigint::BigInt; -use num_traits::*; -use rayon::iter::{ParallelBridge, ParallelIterator}; - -/// Set of vectors for input validation of a ciphertext -#[derive(Clone, Debug)] -pub struct InputValidationVectors { - pk0is: Vec>, - pk1is: Vec>, - ct0is: Vec>, - ct1is: Vec>, - r1is: Vec>, - r2is: Vec>, - p1is: Vec>, - p2is: Vec>, - k0is: Vec, - u: Vec, - e0: Vec, - e1: Vec, - k1: Vec, -} - -impl InputValidationVectors { - /// Create a new `InputValidationVectors` with the given number of moduli and degree. - /// - /// # Arguments - /// - /// * `num_moduli` - The number of moduli, which determines the number of inner vectors in 2D vectors. - /// * `degree` - The size of each inner vector in the 2D vectors. - /// - /// # Returns - /// - /// Returns a new instance of `InputValidationVectors` with all fields initialized to zero. - pub fn new(num_moduli: usize, degree: usize) -> Self { - InputValidationVectors { - pk0is: vec![vec![BigInt::zero(); degree]; num_moduli], - pk1is: vec![vec![BigInt::zero(); degree]; num_moduli], - ct0is: vec![vec![BigInt::zero(); degree]; num_moduli], - ct1is: vec![vec![BigInt::zero(); degree]; num_moduli], - r1is: vec![vec![BigInt::zero(); 2 * (degree - 1) + 1]; num_moduli], - r2is: vec![vec![BigInt::zero(); degree - 1]; num_moduli], - p1is: vec![vec![BigInt::zero(); 2 * (degree - 1) + 1]; num_moduli], - p2is: vec![vec![BigInt::zero(); degree - 1]; num_moduli], - k0is: vec![BigInt::zero(); num_moduli], - u: vec![BigInt::zero(); degree], - e0: vec![BigInt::zero(); degree], - e1: vec![BigInt::zero(); degree], - k1: vec![BigInt::zero(); degree], - } - } - - /// Assign and return all of the centered input validation vectors to the ZKP modulus `p`. - /// - /// # Arguments - /// - /// * `p` - ZKP modulus - /// - /// # Returns - /// - /// Returns a new `InputValidationVectors` struct with all coefficients reduced modulo `p`. - pub fn standard_form(&self, p: &BigInt) -> Self { - InputValidationVectors { - pk0is: reduce_coefficients_2d(&self.pk0is, p), - pk1is: reduce_coefficients_2d(&self.pk1is, p), - ct0is: reduce_coefficients_2d(&self.ct0is, p), - ct1is: reduce_coefficients_2d(&self.ct1is, p), - r1is: reduce_coefficients_2d(&self.r1is, p), - r2is: reduce_coefficients_2d(&self.r2is, p), - p1is: reduce_coefficients_2d(&self.p1is, p), - p2is: reduce_coefficients_2d(&self.p2is, p), - k0is: self.k0is.clone(), - u: reduce_coefficients(&self.u, p), - e0: reduce_coefficients(&self.e0, p), - e1: reduce_coefficients(&self.e1, p), - k1: reduce_coefficients(&self.k1, p), - } - } - - /// Convert the `InputValidationVectors` to a JSON object. - /// - /// # Returns - /// - /// Returns a `serde_json::Value` representing the JSON serialization of the `InputValidationVectors`. - pub fn to_json(&self) -> serde_json::Value { - json!({ - "pk0is": to_string_2d_vec(&self.pk0is), - "pk1is": to_string_2d_vec(&self.pk1is), - "u": to_string_1d_vec(&self.u), - "e0": to_string_1d_vec(&self.e0), - "e1": to_string_1d_vec(&self.e1), - "k1": to_string_1d_vec(&self.k1), - "r2is": to_string_2d_vec(&self.r2is), - "r1is": to_string_2d_vec(&self.r1is), - "p2is": to_string_2d_vec(&self.p2is), - "p1is": to_string_2d_vec(&self.p1is), - "ct0is": to_string_2d_vec(&self.ct0is), - "ct1is": to_string_2d_vec(&self.ct1is), - }) - } - - /// Check whether all members of `self` have the correct length based on the provided `degree` and `num_moduli`. - /// - /// # Arguments - /// - /// * `num_moduli` - The expected number of moduli (outer vector length). - /// * `degree` - The expected degree (inner vector length). - /// - /// # Returns - /// - /// Returns `true` if all vectors have the correct lengths, `false` otherwise. - pub fn check_correct_lengths(&self, num_moduli: usize, degree: usize) -> bool { - // Helper function to check 2D vector lengths - let check_2d_lengths = - |vec: &Vec>, expected_outer_len: usize, expected_inner_len: usize| { - vec.len() == expected_outer_len && vec.iter().all(|v| v.len() == expected_inner_len) - }; - - // Helper function to check 1D vector lengths - let check_1d_lengths = |vec: &Vec, expected_len: usize| vec.len() == expected_len; - - // Use all to combine all checks into a single statement - [ - // 2D vector checks - check_2d_lengths(&self.pk0is, num_moduli, degree), - check_2d_lengths(&self.pk1is, num_moduli, degree), - check_2d_lengths(&self.ct0is, num_moduli, degree), - check_2d_lengths(&self.ct1is, num_moduli, degree), - check_2d_lengths(&self.r1is, num_moduli, 2 * (degree - 1)), - check_2d_lengths(&self.r2is, num_moduli, degree - 2), - check_2d_lengths(&self.p1is, num_moduli, 2 * (degree - 1)), - check_2d_lengths(&self.p2is, num_moduli, degree - 2), - // 1D vector checks - check_1d_lengths(&self.k0is, num_moduli), - check_1d_lengths(&self.u, degree), - check_1d_lengths(&self.e0, degree), - check_1d_lengths(&self.e1, degree), - check_1d_lengths(&self.k1, degree), - ] - .iter() - .all(|&check| check) - } - - /// Create the centered validation vectors necessary for creating an input validation proof according to Greco. - /// For more information, please see https://eprint.iacr.org/2024/594. - /// - /// # Arguments - /// - /// * `pt` - Plaintext from fhe.rs. - /// * `u_rns` - Private polynomial used in ciphertext sampled from secret key distribution. - /// * `e0_rns` - Error polynomial used in ciphertext sampled from error distribution. - /// * `e1_rns` - Error polynomioal used in cihpertext sampled from error distribution. - /// * `ct` - Ciphertext from fhe.rs. - /// * `pk` - Public Key from fhe.rs. - pub fn compute( - pt: &Plaintext, - u_rns: &Poly, - e0_rns: &Poly, - e1_rns: &Poly, - ct: &Ciphertext, - pk: &PublicKey, - ) -> Result> { - // Get context, plaintext modulus, and degree - let params = &pk.par; - let ctx = params.ctx_at_level(pt.level())?; - let t = Modulus::new(params.plaintext())?; - let N: u64 = ctx.degree as u64; - - // Calculate k1 (independent of qi), center and reverse - let q_mod_t = (ctx.modulus() % t.modulus()) - .to_u64() - .ok_or_else(|| "Cannot convert BigInt to u64.".to_string())?; // [q]_t - let mut k1_u64 = pt.value.deref().to_vec(); // m - - t.scalar_mul_vec(&mut k1_u64, q_mod_t); // k1 = [q*m]_t - - let mut k1: Vec = k1_u64.iter().map(|&x| BigInt::from(x)).rev().collect(); - reduce_and_center_coefficients_mut(&mut k1, &BigInt::from(t.modulus())); - - // Extract single vectors of u, e1, and e2 as Vec, center and reverse - let mut u_rns_copy = u_rns.clone(); - let mut e0_rns_copy = e0_rns.clone(); - let mut e1_rns_copy = e1_rns.clone(); - - u_rns_copy.change_representation(Representation::PowerBasis); - e0_rns_copy.change_representation(Representation::PowerBasis); - e1_rns_copy.change_representation(Representation::PowerBasis); - - let u: Vec = unsafe { - ctx.moduli_operators()[0] - .center_vec_vt( - u_rns_copy - .coefficients() - .row(0) - .as_slice() - .ok_or_else(|| "Cannot center coefficients.".to_string())?, - ) - .iter() - .rev() - .map(|&x| BigInt::from(x)) - .collect() - }; - - let e0: Vec = unsafe { - ctx.moduli_operators()[0] - .center_vec_vt( - e0_rns_copy - .coefficients() - .row(0) - .as_slice() - .ok_or_else(|| "Cannot center coefficients.".to_string())?, - ) - .iter() - .rev() - .map(|&x| BigInt::from(x)) - .collect() - }; - - let e1: Vec = unsafe { - ctx.moduli_operators()[0] - .center_vec_vt( - e1_rns_copy - .coefficients() - .row(0) - .as_slice() - .ok_or_else(|| "Cannot center coefficients.".to_string())?, - ) - .iter() - .rev() - .map(|&x| BigInt::from(x)) - .collect() - }; - - // Extract and convert ciphertext and plaintext polynomials - let mut ct0 = ct.c[0].clone(); - let mut ct1 = ct.c[1].clone(); - ct0.change_representation(Representation::PowerBasis); - ct1.change_representation(Representation::PowerBasis); - - let mut pk0: Poly = pk.c.c[0].clone(); - let mut pk1: Poly = pk.c.c[1].clone(); - pk0.change_representation(Representation::PowerBasis); - pk1.change_representation(Representation::PowerBasis); - - // Create cyclotomic polynomial x^N + 1 - let mut cyclo = vec![BigInt::from(0u64); (N + 1) as usize]; - - cyclo[0] = BigInt::from(1u64); // x^N term - cyclo[N as usize] = BigInt::from(1u64); // x^0 term - - // Initialize matrices to store results - let num_moduli = ctx.moduli().len(); - let mut res = InputValidationVectors::new(num_moduli, N as usize); - - // Perform the main computation logic - let results: Vec<( - usize, - Vec, - Vec, - BigInt, - Vec, - Vec, - Vec, - Vec, - Vec, - Vec, - )> = izip!( - ctx.moduli_operators(), - ct0.coefficients().rows(), - ct1.coefficients().rows(), - pk0.coefficients().rows(), - pk1.coefficients().rows() - ) - .enumerate() - .par_bridge() - .map( - |(i, (qi, ct0_coeffs, ct1_coeffs, pk0_coeffs, pk1_coeffs))| { - // --------------------------------------------------- ct0i --------------------------------------------------- - - // Convert to vectors of bigint, center, and reverse order. - let mut ct0i: Vec = - ct0_coeffs.iter().rev().map(|&x| BigInt::from(x)).collect(); - let mut ct1i: Vec = - ct1_coeffs.iter().rev().map(|&x| BigInt::from(x)).collect(); - let mut pk0i: Vec = - pk0_coeffs.iter().rev().map(|&x| BigInt::from(x)).collect(); - let mut pk1i: Vec = - pk1_coeffs.iter().rev().map(|&x| BigInt::from(x)).collect(); - - let qi_bigint = BigInt::from(qi.modulus()); - - reduce_and_center_coefficients_mut(&mut ct0i, &qi_bigint); - reduce_and_center_coefficients_mut(&mut ct1i, &qi_bigint); - reduce_and_center_coefficients_mut(&mut pk0i, &qi_bigint); - reduce_and_center_coefficients_mut(&mut pk1i, &qi_bigint); - - // k0qi = -t^{-1} mod qi - - let koqi_u64 = qi.inv(qi.neg(t.modulus())).unwrap(); - let k0qi = BigInt::from(koqi_u64); // Do not need to center this - - // ki = k1 * k0qi - let ki = poly_scalar_mul(&k1, &k0qi); - - // Calculate ct0i_hat = pk0 * ui + e0i + ki - let ct0i_hat = { - let pk0i_times_u = poly_mul(&pk0i, &u); - assert_eq!((pk0i_times_u.len() as u64) - 1, 2 * (N - 1)); - let e0_plus_ki = poly_add(&e0, &ki); - assert_eq!((e0_plus_ki.len() as u64) - 1, N - 1); - - poly_add(&pk0i_times_u, &e0_plus_ki) - }; - assert_eq!((ct0i_hat.len() as u64) - 1, 2 * (N - 1)); - - // Check whether ct0i_hat mod R_qi (the ring) is equal to ct0i - let mut ct0i_hat_mod_rqi = ct0i_hat.clone(); - reduce_in_ring(&mut ct0i_hat_mod_rqi, &cyclo, &qi_bigint); - assert_eq!(&ct0i, &ct0i_hat_mod_rqi); - - // Compute r2i numerator = ct0i - ct0i_hat and reduce/center the polynomial - let ct0i_minus_ct0i_hat = poly_sub(&ct0i, &ct0i_hat); - assert_eq!((ct0i_minus_ct0i_hat.len() as u64) - 1, 2 * (N - 1)); - let mut ct0i_minus_ct0i_hat_mod_zqi = ct0i_minus_ct0i_hat.clone(); - reduce_and_center_coefficients_mut(&mut ct0i_minus_ct0i_hat_mod_zqi, &qi_bigint); - - // Compute r2i as the quotient of numerator divided by the cyclotomic polynomial - // to produce: (ct0i - ct0i_hat) / (x^N + 1) mod Z_qi. Remainder should be empty. - let (r2i, r2i_rem) = poly_div(&ct0i_minus_ct0i_hat_mod_zqi, &cyclo); - assert!(r2i_rem.is_empty()); - assert_eq!((r2i.len() as u64) - 1, N - 2); // Order(r2i) = N - 2 - - // Assert that (ct0i - ct0i_hat) = (r2i * cyclo) mod Z_qi - let r2i_times_cyclo = poly_mul(&r2i, &cyclo); - let mut r2i_times_cyclo_mod_zqi = r2i_times_cyclo.clone(); - reduce_and_center_coefficients_mut(&mut r2i_times_cyclo_mod_zqi, &qi_bigint); - assert_eq!(&ct0i_minus_ct0i_hat_mod_zqi, &r2i_times_cyclo_mod_zqi); - assert_eq!((r2i_times_cyclo.len() as u64) - 1, 2 * (N - 1)); - - // Calculate r1i = (ct0i - ct0i_hat - r2i * cyclo) / qi mod Z_p. Remainder should be empty. - let r1i_num = poly_sub(&ct0i_minus_ct0i_hat, &r2i_times_cyclo); - assert_eq!((r1i_num.len() as u64) - 1, 2 * (N - 1)); - - let (r1i, r1i_rem) = poly_div(&r1i_num, &[qi_bigint.clone()]); - assert!(r1i_rem.is_empty()); - assert_eq!((r1i.len() as u64) - 1, 2 * (N - 1)); // Order(r1i) = 2*(N-1) - assert_eq!(&r1i_num, &poly_mul(&r1i, &[qi_bigint.clone()])); - - // Assert that ct0i = ct0i_hat + r1i * qi + r2i * cyclo mod Z_p - let r1i_times_qi = poly_scalar_mul(&r1i, &qi_bigint); - let mut ct0i_calculated = - poly_add(&poly_add(&ct0i_hat, &r1i_times_qi), &r2i_times_cyclo); - - while ct0i_calculated.len() > 0 && ct0i_calculated[0].is_zero() { - ct0i_calculated.remove(0); - } - - assert_eq!(&ct0i, &ct0i_calculated); - - // --------------------------------------------------- ct1i --------------------------------------------------- - - // Calculate ct1i_hat = pk1i * ui + e1i - let ct1i_hat = { - let pk1i_times_u = poly_mul(&pk1i, &u); - assert_eq!((pk1i_times_u.len() as u64) - 1, 2 * (N - 1)); - - poly_add(&pk1i_times_u, &e1) - }; - assert_eq!((ct1i_hat.len() as u64) - 1, 2 * (N - 1)); - - // Check whether ct1i_hat mod R_qi (the ring) is equal to ct1i - let mut ct1i_hat_mod_rqi = ct1i_hat.clone(); - reduce_in_ring(&mut ct1i_hat_mod_rqi, &cyclo, &qi_bigint); - assert_eq!(&ct1i, &ct1i_hat_mod_rqi); - - // Compute p2i numerator = ct1i - ct1i_hat - let ct1i_minus_ct1i_hat = poly_sub(&ct1i, &ct1i_hat); - assert_eq!((ct1i_minus_ct1i_hat.len() as u64) - 1, 2 * (N - 1)); - let mut ct1i_minus_ct1i_hat_mod_zqi = ct1i_minus_ct1i_hat.clone(); - reduce_and_center_coefficients_mut(&mut ct1i_minus_ct1i_hat_mod_zqi, &qi_bigint); - - // Compute p2i as the quotient of numerator divided by the cyclotomic polynomial, - // and reduce/center the resulting coefficients to produce: - // (ct1i - ct1i_hat) / (x^N + 1) mod Z_qi. Remainder should be empty. - let (p2i, p2i_rem) = poly_div(&ct1i_minus_ct1i_hat_mod_zqi, &cyclo.clone()); - assert!(p2i_rem.is_empty()); - assert_eq!((p2i.len() as u64) - 1, N - 2); // Order(p2i) = N - 2 - - // Assert that (ct1i - ct1i_hat) = (p2i * cyclo) mod Z_qi - let p2i_times_cyclo: Vec = poly_mul(&p2i, &cyclo); - let mut p2i_times_cyclo_mod_zqi = p2i_times_cyclo.clone(); - reduce_and_center_coefficients_mut(&mut p2i_times_cyclo_mod_zqi, &qi_bigint); - assert_eq!(&ct1i_minus_ct1i_hat_mod_zqi, &p2i_times_cyclo_mod_zqi); - assert_eq!((p2i_times_cyclo.len() as u64) - 1, 2 * (N - 1)); - - // Calculate p1i = (ct1i - ct1i_hat - p2i * cyclo) / qi mod Z_p. Remainder should be empty. - let p1i_num = poly_sub(&ct1i_minus_ct1i_hat, &p2i_times_cyclo); - assert_eq!((p1i_num.len() as u64) - 1, 2 * (N - 1)); - - let (p1i, p1i_rem) = poly_div(&p1i_num, &[BigInt::from(qi.modulus())]); - assert!(p1i_rem.is_empty()); - assert_eq!((p1i.len() as u64) - 1, 2 * (N - 1)); // Order(p1i) = 2*(N-1) - assert_eq!(&p1i_num, &poly_mul(&p1i, &[qi_bigint.clone()])); - - // Assert that ct1i = ct1i_hat + p1i * qi + p2i * cyclo mod Z_p - let p1i_times_qi = poly_scalar_mul(&p1i, &qi_bigint); - let mut ct1i_calculated = - poly_add(&poly_add(&ct1i_hat, &p1i_times_qi), &p2i_times_cyclo); - - while ct1i_calculated.len() > 0 && ct1i_calculated[0].is_zero() { - ct1i_calculated.remove(0); - } - - assert_eq!(&ct1i, &ct1i_calculated); - (i, r2i, r1i, k0qi, ct0i, ct1i, pk0i, pk1i, p1i, p2i) - }, - ) - .collect(); - - // Merge results into the `res` structure after parallel execution - for (i, r2i, r1i, k0i, ct0i, ct1i, pk0i, pk1i, p1i, p2i) in results.into_iter() { - res.r2is[i] = r2i; - res.r1is[i] = r1i; - res.k0is[i] = k0i; - res.ct0is[i] = ct0i; - res.ct1is[i] = ct1i; - res.pk0is[i] = pk0i; - res.pk1is[i] = pk1i; - res.p1is[i] = p1i; - res.p2is[i] = p2i; - } - - // Set final result vectors - res.u = u; - res.e0 = e0; - res.e1 = e1; - res.k1 = k1; - - Ok(res) - } -} - -/// The `InputValidationBounds` struct holds the bounds for various vectors and polynomials used in the input validation process. -/// These bounds are calculated from a set of BFV encryption parameters and represent limits on the values of different fields -/// to ensure that the inputs remain within valid ranges during operations. -#[derive(Clone, Debug)] -pub struct InputValidationBounds { - u: BigInt, - e: BigInt, - k1_low: BigInt, - k1_up: BigInt, - pk: Vec, - r1_low: Vec, - r1_up: Vec, - r2: Vec, - p1: Vec, - p2: Vec, -} - -impl InputValidationBounds { - /// Checks the constraints of the input validation vectors against the bounds stored in `InputValidationBounds`. - /// - /// # Arguments - /// - /// * `vecs` - A reference to `InputValidationVectors`, which contains the vectors to be validated. - /// * `p` - The prime modulus used in the encryption scheme. - /// - /// This function checks whether the coefficients of the vectors `u`, `e0`, `e1`, `k1`, and others are within - /// the specified ranges, using both centered and standard range checks. It asserts that the vectors stay within - /// these predefined bounds. - pub fn check_constraints(&self, vecs: &InputValidationVectors, p: &BigInt) { - let vecs_std = vecs.standard_form(p); - - // constraint. The coefficients of u, e0, e1 should be in the range [-⌈6σ⌋, ⌈6σ⌋] - // where ⌈6σ⌋ is the upper bound of the discrete Gaussian distribution - assert!(range_check_centered(&vecs.u, &-&self.u, &self.u)); - assert!(range_check_centered(&vecs.e0, &-&self.e, &self.e)); - assert!(range_check_centered(&vecs.e1, &-&self.e, &self.e)); - assert!(range_check_standard(&vecs_std.u, &self.u, &p)); - assert!(range_check_standard(&vecs_std.e0, &self.e, &p)); - assert!(range_check_standard(&vecs_std.e1, &self.e, &p)); - - // constraint. The coefficients of k1 should be in the range [-(t-1)]/2, (t-1)/2] - assert!(range_check_centered(&vecs.k1, &self.k1_low, &self.k1_up)); - assert!(range_check_standard_2bounds( - &vecs_std.k1, - &self.k1_low, - &self.k1_up, - &p - )); - - // Perform asserts for polynomials depending on each qi - for i in 0..self.r2.len() { - // constraint. The coefficients of ct0i and ct1i should be in the range [-(qi-1)/2, (qi-1)/2] - assert!(range_check_centered( - &vecs.ct0is[i], - &-&self.pk[i], - &self.pk[i] - )); - assert!(range_check_centered( - &vecs.ct1is[i], - &-&self.pk[i], - &self.pk[i] - )); - - // constraint. The coefficients of pk0i and pk1i should be in range [-(qi-1)/2 , (qi-1)/2] - assert!(range_check_centered( - &vecs.pk0is[i], - &-&self.pk[i], - &self.pk[i] - )); - assert!(range_check_centered( - &vecs.pk1is[i], - &-&self.pk[i], - &self.pk[i] - )); - assert!(range_check_standard(&vecs_std.pk0is[i], &self.pk[i], &p)); - assert!(range_check_standard(&vecs_std.pk1is[i], &self.pk[i], &p)); - - // constraint. The coefficients of r2i should be in the range [-(qi-1)/2, (qi-1)/2] - assert!(range_check_centered( - &vecs.r2is[i], - &-&self.r2[i], - &self.r2[i] - )); - assert!(range_check_standard(&vecs_std.r2is[i], &self.r2[i], &p)); - - // constraint. The coefficients of (ct0i - ct0i_hat - r2i * cyclo) / qi = r1i should be in the range - // $[ - // \frac{ \frac{-(t - 1)}{2} \cdot |K_{0,i}| - ((N \cdot B +2) \cdot \frac{q_i - 1}{2} + B )}{q_i}, - // \frac{ \frac{t - 1}{2} \cdot |K_{0,i}| + (N \cdot B+2) \cdot \frac{q_i - 1}{2} + B }{q_i} - // ]$ - assert!(range_check_centered( - &vecs.r1is[i], - &self.r1_low[i], - &self.r1_up[i] - )); - assert!(range_check_standard_2bounds( - &vecs_std.r1is[i], - &self.r1_low[i], - &self.r1_up[i], - &p - )); - - // constraint. The coefficients of p2 should be in the range [-(qi-1)/2, (qi-1)/2] - assert!(range_check_centered( - &vecs.p2is[i], - &-&self.p2[i], - &self.p2[i] - )); - assert!(range_check_standard(&vecs_std.p2is[i], &self.p2[i], &p)); - - // constraint. The coefficients of (ct0i - ct0i_hat - p2i * cyclo) / qi = p1i should be in the range - // $[ - // \frac{- ((N \cdot B +2) \cdot \frac{q_i - 1}{2} + B)}{q_i}, - // \frac{ (N \cdot B +2) \cdot \frac{q_i - 1}{2} + B }{q_i} - // ]$ - assert!(range_check_centered( - &vecs.p1is[i], - &-&self.p1[i], - &self.p1[i] - )); - assert!(range_check_standard(&vecs_std.p1is[i], &self.p1[i], &p)); - } - } - - /// Compute the input validation bounds from a set of BFV encryption parameters. - /// - /// # Arguments - /// - /// * `params` - A reference to the BFV parameters. - /// * `level` - The encryption level, which determines the number of moduli used. - /// - /// # Returns - /// - /// A new `InputValidationBounds` instance containing the bounds for vectors and polynomials - /// based on the BFV parameters and the specified level. - pub fn compute( - params: &Arc, - level: usize, - ) -> Result> { - // Get cyclotomic degree and context at provided level - let N = BigInt::from(params.degree()); - let t = BigInt::from(params.plaintext()); - let ctx = params.ctx_at_level(level)?; - - // Note: the secret key in fhe.rs is sampled from a discrete gaussian distribution - // rather than a ternary distribution as in bfv.py. - let gauss_bound = BigInt::from( - f64::ceil(6_f64 * f64::sqrt(params.variance() as f64)) - .to_i64() - .ok_or_else(|| "Failed to convert variance to i64".to_string())?, - ); - let u_bound = gauss_bound.clone(); - let e_bound = gauss_bound.clone(); - - //Note we have two different variables for lower bound and upper bound, as in the case - //where the plaintext modulus is even, the lower bound cannot be calculated by just - //negating the upper bound. For instance, if t = 8, then the lower bound will be -4 and the - //upper bound will be 3 - let ptxt_up_bound = (t.clone() - BigInt::from(1)) / BigInt::from(2); - let ptxt_low_bound = if (t.clone() % BigInt::from(2)) == BigInt::from(1) { - (-&(t.clone() - BigInt::from(1))) / BigInt::from(2) - } else { - ((-&(t.clone() - BigInt::from(1))) / BigInt::from(2)) - BigInt::from(1) - }; - - let k1_low_bound = ptxt_low_bound.clone(); - let k1_up_bound = ptxt_up_bound.clone(); - - // Calculate qi-based bounds - let num_moduli = ctx.moduli().len(); - let mut pk_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut r2_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut r1_low_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut r1_up_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut p2_bounds: Vec = vec![BigInt::zero(); num_moduli]; - let mut p1_bounds: Vec = vec![BigInt::zero(); num_moduli]; - for (i, qi) in ctx.moduli_operators().iter().enumerate() { - let qi_bigint = BigInt::from(qi.modulus()); - let qi_bound = (&qi_bigint - BigInt::from(1)) / BigInt::from(2); - - // Calculate the k0qi for the bounds (these are also constant wrt BFV params) - let k0qi = BigInt::from( - qi.inv(qi.neg(params.plaintext())) - .ok_or_else(|| "Failed to calculate modulus inverse for k0qi".to_string())?, - ); - - pk_bounds[i] = qi_bound.clone(); - r2_bounds[i] = qi_bound.clone(); - - r1_low_bounds[i] = (&ptxt_low_bound * BigInt::abs(&k0qi) - - &((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound)) - / &qi_bigint; - r1_up_bounds[i] = (&ptxt_up_bound * BigInt::abs(&k0qi) - + ((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound)) - / &qi_bigint; - - p2_bounds[i] = qi_bound.clone(); - p1_bounds[i] = ((&N * &gauss_bound + 2) * &qi_bound + &gauss_bound) / &qi_bigint; - } - - Ok(InputValidationBounds { - u: u_bound, - e: e_bound, - k1_low: k1_low_bound, - k1_up: k1_up_bound, - pk: pk_bounds, - r1_low: r1_low_bounds, - r1_up: r1_up_bounds, - r2: r2_bounds, - p1: p1_bounds, - p2: p2_bounds, - }) - } -} - -fn to_string_1d_vec(poly: &Vec) -> Vec { - poly.iter().map(|coef| coef.to_string()).collect() -} - -fn to_string_2d_vec(poly: &Vec>) -> Vec> { - poly.iter().map(|row| to_string_1d_vec(row)).collect() -} diff --git a/examples/CRISP/apps/wasm-crypto/src/greco/mod.rs b/examples/CRISP/apps/wasm-crypto/src/greco/mod.rs deleted file mode 100644 index 2d120a8d70..0000000000 --- a/examples/CRISP/apps/wasm-crypto/src/greco/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod greco; -mod poly; diff --git a/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs b/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs deleted file mode 100644 index 2a7ab07642..0000000000 --- a/examples/CRISP/apps/wasm-crypto/src/greco/poly.rs +++ /dev/null @@ -1,359 +0,0 @@ -/// Provides helper methods that perform modular poynomial arithmetic over polynomials encoded in vectors -/// of coefficients from largest degree to lowest. -use num_bigint::BigInt; -use num_traits::*; - -/// Adds two polynomials represented as vectors of `BigInt` coefficients in descending order of powers. -/// -/// This function aligns two polynomials of potentially different lengths and adds their coefficients. -/// It assumes that polynomials are represented from leading degree to degree zero, even if the -/// coefficient at degree zero is zero. Leading zeros are not removed to keep the order of the -/// polynomial correct, which in Greco's case is necessary so that the order can be checked. -/// -/// # Arguments -/// -/// * `poly1` - Coefficients of the first polynomial, from highest to lowest degree. -/// * `poly2` - Coefficients of the second polynomial, from highest to lowest degree. -/// -/// # Returns -/// -/// A vector of `BigInt` coefficients representing the sum of the two polynomials. -pub fn poly_add(poly1: &[BigInt], poly2: &[BigInt]) -> Vec { - // Determine the new length and create extended polynomials - let max_length = std::cmp::max(poly1.len(), poly2.len()); - let mut extended_poly1 = vec![BigInt::zero(); max_length]; - let mut extended_poly2 = vec![BigInt::zero(); max_length]; - - // Copy original coefficients into extended vectors - extended_poly1[max_length - poly1.len()..].clone_from_slice(poly1); - extended_poly2[max_length - poly2.len()..].clone_from_slice(poly2); - - // Add the coefficients - let mut result = vec![BigInt::zero(); max_length]; - for i in 0..max_length { - result[i] = &extended_poly1[i] + &extended_poly2[i]; - } - - result -} - -/// Negates the coefficients of a polynomial represented as a slice of `BigInt` coefficients. -/// -/// This function creates a new polynomial where each coefficient is the negation of the corresponding -/// coefficient in the input polynomial. -/// -/// # Arguments -/// -/// * `poly` - A slice of `BigInt` representing the coefficients of the polynomial, with the highest -/// degree term at index 0 and the constant term at the end. -/// -/// # Returns -/// -/// A vector of `BigInt` representing the polynomial with negated coefficients, with the same degree -/// order as the input polynomial. -pub fn poly_neg(poly: &[BigInt]) -> Vec { - poly.iter().map(|x| -x).collect() -} - -/// Subtracts one polynomial from another, both represented as slices of `BigInt` coefficients in descending order. -/// -/// This function subtracts the second polynomial (`poly2`) from the first polynomial (`poly1`). It does so -/// by first negating the coefficients of `poly2` and then adding the result to `poly1`. -/// -/// # Arguments -/// -/// * `poly1` - A slice of `BigInt` representing the coefficients of the first polynomial (minuend), with -/// the highest degree term at index 0 and the constant term at the end. -/// * `poly2` - A slice of `BigInt` representing the coefficients of the second polynomial (subtrahend), with -/// the highest degree term at index 0 and the constant term at the end. -/// -/// # Returns -/// -/// A vector of `BigInt` representing the coefficients of the resulting polynomial after subtraction. -pub fn poly_sub(poly1: &[BigInt], poly2: &[BigInt]) -> Vec { - poly_add(poly1, &poly_neg(poly2)) -} - -/// Multiplies two polynomials represented as slices of `BigInt` coefficients naively. -/// -/// Given two polynomials `poly1` and `poly2`, where each polynomial is represented by a slice of -/// coefficients, this function computes their product. The order of coefficients (ascending or -/// descending powers) should be the same for both input polynomials. The resulting polynomial is -/// returned as a vector of `BigInt` coefficients in the same order as the inputs. -/// -/// # Arguments -/// -/// * `poly1` - A slice of `BigInt` representing the coefficients of the first polynomial. -/// * `poly2` - A slice of `BigInt` representing the coefficients of the second polynomial. -/// -/// # Returns -/// -/// A vector of `BigInt` representing the coefficients of the resulting polynomial after multiplication, -/// in the same order as the input polynomials. -pub fn poly_mul(poly1: &[BigInt], poly2: &[BigInt]) -> Vec { - let product_len = poly1.len() + poly2.len() - 1; - let mut product = vec![BigInt::zero(); product_len]; - - for i in 0..poly1.len() { - for j in 0..poly2.len() { - product[i + j] += &poly1[i] * &poly2[j]; - } - } - - product -} - -/// Divides one polynomial by another, returning the quotient and remainder, with both polynomials -/// represented by vectors of `BigInt` coefficients in descending order of powers. -/// -/// Given two polynomials `dividend` and `divisor`, where each polynomial is represented by a vector -/// of coefficients in descending order of powers (i.e., the coefficient at index `i` corresponds -/// to the term of degree `n - i`, where `n` is the degree of the polynomial), this function computes -/// their quotient and remainder. The quotient and remainder are also represented in descending order -/// of powers. -/// -/// # Arguments -/// -/// * `dividend` - A slice of `BigInt` representing the coefficients of the dividend polynomial. -/// * `divisor` - A slice of `BigInt` representing the coefficients of the divisor polynomial. The leading -/// coefficient (highest degree term) must be non-zero. -/// -/// # Returns -/// -/// A tuple containing two vectors of `BigInt`: -/// * The first vector represents the quotient polynomial, with coefficients in descending order of powers. -/// * The second vector represents the remainder polynomial, also in descending order of powers. -/// -/// # Panics -/// -/// This function will panic if the divisor is empty or if the leading coefficient of the divisor is zero. -pub fn poly_div(dividend: &[BigInt], divisor: &[BigInt]) -> (Vec, Vec) { - assert!( - !divisor.is_empty() && !divisor[0].is_zero(), - "Leading coefficient of divisor cannot be zero" - ); - - let mut quotient = vec![BigInt::zero(); dividend.len() - divisor.len() + 1]; - let mut remainder = dividend.to_vec(); - - for i in 0..quotient.len() { - let coeff = &remainder[i] / &divisor[0]; - quotient[i] = coeff.clone(); - - for j in 0..divisor.len() { - remainder[i + j] = &remainder[i + j] - &divisor[j] * &coeff; - } - } - - while remainder.len() > 0 && remainder[0].is_zero() { - remainder.remove(0); - } - - (quotient, remainder) -} - -/// Multiplies each coefficient of a polynomial by a scalar. -/// -/// This function takes a polynomial represented as a vector of `BigInt` coefficients and multiplies each -/// coefficient by a given scalar. -/// -/// # Arguments -/// -/// * `poly` - A slice of `BigInt` representing the coefficients of the polynomial, with the highest degree term -/// at index 0 and the constant term at the end. -/// * `scalar` - A `BigInt` representing the scalar by which each coefficient of the polynomial will be multiplied. -/// -/// # Returns -/// -/// A vector of `BigInt` representing the polynomial with each coefficient multiplied by the scalar, maintaining -/// the same order of coefficients as the input polynomial. -pub fn poly_scalar_mul(poly: &[BigInt], scalar: &BigInt) -> Vec { - poly.iter().map(|coeff| coeff * scalar).collect() -} - -/// Reduces the coefficients of a polynomial by dividing it with a cyclotomic polynomial -/// and updating the coefficients with the remainder. -/// -/// This function performs a polynomial long division of the input polynomial (represented by -/// `coefficients`) by the given cyclotomic polynomial (represented by `cyclo`). It replaces -/// the original coefficients with the coefficients of the remainder from this division. -/// -/// # Arguments -/// -/// * `coefficients` - A mutable reference to a `Vec` containing the coefficients of -/// the polynomial to be reduced. The coefficients are in descending order of degree, -/// i.e., the first element is the coefficient of the highest degree term. -/// * `cyclo` - A slice of `BigInt` representing the coefficients of the cyclotomic polynomial. -/// The coefficients are also in descending order of degree. -/// -/// # Panics -/// -/// This function will panic if the remainder length exceeds the degree of the cyclotomic polynomial, -/// which would indicate an issue with the division operation. -pub fn reduce_coefficients_by_cyclo(coefficients: &mut Vec, cyclo: &[BigInt]) { - // Perform polynomial long division, assuming poly_div returns (quotient, remainder) - let (_, remainder) = poly_div(&coefficients, cyclo); - - let N = cyclo.len() - 1; - let mut out: Vec = vec![BigInt::zero(); N]; - - // Calculate the starting index in `out` where the remainder should be copied - let start_idx = N - remainder.len(); - - // Copy the remainder into the `out` vector starting from `start_idx` - out[start_idx..].clone_from_slice(&remainder); - - // Resize the original `coefficients` vector to fit the result and copy the values - coefficients.clear(); - coefficients.extend(out); -} - -/// Reduces a number modulo a prime modulus and centers it. -/// -/// This function takes an arbitrary number and reduces it modulo the specified prime modulus. -/// After reduction, the number is adjusted to be within the symmetric range -/// [(−(modulus−1))/2, (modulus−1)/2]. If the number is already within this range, it remains unchanged. -/// -/// # Parameters -/// -/// - `x`: A reference to a `BigInt` representing the number to be reduced and centered. -/// - `modulus`: A reference to the prime modulus `BigInt` used for reduction. -/// - `half_modulus`: A reference to a `BigInt` representing half of the modulus used to center the coefficient. -/// -/// # Returns -/// -/// - A `BigInt` representing the reduced and centered number. -pub fn reduce_and_center(x: &BigInt, modulus: &BigInt, half_modulus: &BigInt) -> BigInt { - // Calculate the remainder ensuring it's non-negative - let mut r = x % modulus; - if r < BigInt::zero() { - r += modulus; - } - - // Adjust the remainder if it is greater than half_modulus - if (modulus % BigInt::from(2)) == BigInt::from(1) { - if r > *half_modulus { - r -= modulus; - } - } else if r >= *half_modulus { - r -= modulus; - } - - r -} - -/// Reduces and centers polynomial coefficients modulo a prime modulus. -/// -/// This function iterates over a mutable slice of polynomial coefficients, reducing each coefficient -/// modulo a given prime modulus and adjusting the result to be within the symmetric range -/// [−(modulus−1)/2, (modulus−1)/2]. -/// -/// # Parameters -/// -/// - `coefficients`: A mutable slice of `BigInt` coefficients to be reduced and centered. -/// - `modulus`: A prime modulus `BigInt` used for reduction and centering. -/// -/// # Panics -/// -/// - Panics if `modulus` is zero due to division by zero. -pub fn reduce_and_center_coefficients_mut(coefficients: &mut [BigInt], modulus: &BigInt) { - let half_modulus = modulus / BigInt::from(2); - coefficients - .iter_mut() - .for_each(|x| *x = reduce_and_center(x, modulus, &half_modulus)); -} - -pub fn reduce_and_center_coefficients( - coefficients: &mut [BigInt], - modulus: &BigInt, -) -> Vec { - let half_modulus = modulus / BigInt::from(2); - coefficients - .iter() - .map(|x| reduce_and_center(x, modulus, &half_modulus)) - .collect() -} - -/// Reduces a polynomial's coefficients within a polynomial ring defined by a cyclotomic polynomial and a modulus. -/// -/// This function performs two reductions on the polynomial represented by `coefficients`: -/// 1. **Cyclotomic Reduction**: Reduces the polynomial by the cyclotomic polynomial, replacing -/// the original coefficients with the remainder after polynomial division. -/// 2. **Modulus Reduction**: Reduces the coefficients of the polynomial modulo a given modulus, -/// centering the coefficients within the range [-modulus/2, modulus/2). -/// -/// # Arguments -/// -/// * `coefficients` - A mutable reference to a `Vec` representing the coefficients of the polynomial -/// to be reduced. The coefficients should be in descending order of degree. -/// * `cyclo` - A slice of `BigInt` representing the coefficients of the cyclotomic polynomial (typically x^N + 1). -/// * `modulus` - A reference to a `BigInt` representing the modulus for the coefficient reduction. The coefficients -/// will be reduced and centered modulo this value. -pub fn reduce_in_ring(coefficients: &mut Vec, cyclo: &[BigInt], modulus: &BigInt) { - reduce_coefficients_by_cyclo(coefficients, cyclo); - reduce_and_center_coefficients_mut(coefficients, modulus); -} - -/// Reduces each element in the given slice of `BigInt` by the modulus `p`. -/// -/// This function takes a slice of `BigInt` coefficients and applies the modulus operation -/// on each element. It ensures the result is within the range `[0, p-1]` by adding `p` -/// before applying the modulus operation. The result is collected into a new `Vec`. -/// -/// # Arguments -/// -/// * `coefficients` - A slice of `BigInt` representing the coefficients to be reduced. -/// * `p` - A reference to a `BigInt` that represents the modulus value. -/// -/// # Returns -/// -/// A `Vec` where each element is reduced modulo `p`. -pub fn reduce_coefficients(coefficients: &[BigInt], p: &BigInt) -> Vec { - coefficients.iter().map(|coeff| (coeff + p) % p).collect() -} - -pub fn reduce_coefficients_2d(coefficient_matrix: &[Vec], p: &BigInt) -> Vec> { - coefficient_matrix - .iter() - .map(|coeffs| reduce_coefficients(coeffs, p)) - .collect() -} - -/// Mutably reduces each element in the given slice of `BigInt` by the modulus `p`. -/// -/// This function modifies the given mutable slice of `BigInt` coefficients in place. It adds `p` -/// to each element before applying the modulus operation, ensuring the results are within the range `[0, p-1]`. -/// -/// # Arguments -/// -/// * `coefficients` - A mutable slice of `BigInt` representing the coefficients to be reduced. -/// * `p` - A reference to a `BigInt` that represents the modulus value. -pub fn reduce_coefficients_mut(coefficients: &mut [BigInt], p: &BigInt) { - for coeff in coefficients.iter_mut() { - *coeff += p; - *coeff %= p; - } -} - -pub fn range_check_centered(vec: &[BigInt], lower_bound: &BigInt, upper_bound: &BigInt) -> bool { - vec.iter() - .all(|coeff| coeff >= lower_bound && coeff <= upper_bound) -} - -pub fn range_check_standard_2bounds( - vec: &[BigInt], - low_bound: &BigInt, - up_bound: &BigInt, - modulus: &BigInt, -) -> bool { - vec.iter().all(|coeff| { - (coeff >= &BigInt::from(0) && coeff <= up_bound) - || (coeff >= &(modulus + low_bound) && coeff < modulus) - }) -} -pub fn range_check_standard(vec: &[BigInt], bound: &BigInt, modulus: &BigInt) -> bool { - vec.iter().all(|coeff| { - (coeff >= &BigInt::from(0) && coeff <= bound) - || (coeff >= &(modulus - bound) && coeff < modulus) - }) -} diff --git a/examples/CRISP/apps/wasm-crypto/src/lib.rs b/examples/CRISP/apps/wasm-crypto/src/lib.rs index 8cd685046b..a62d4daf07 100644 --- a/examples/CRISP/apps/wasm-crypto/src/lib.rs +++ b/examples/CRISP/apps/wasm-crypto/src/lib.rs @@ -1,11 +1,10 @@ -mod greco; mod util; use console_log; use e3_bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; use fhe_rs::bfv::{Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, FheEncoder, Serialize}; -use greco::greco::InputValidationVectors; +use greco::InputValidationVectors; use num_bigint::BigInt; use num_traits::Num; use rand::thread_rng; @@ -66,19 +65,20 @@ impl Encrypt { // Create Greco input validation ZKP proof let input_val_vectors = - InputValidationVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk).map_err( - |e| JsValue::from_str(&format!("Error computing input validation vectors: {}", e)), - )?; + InputValidationVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk, ¶ms) + .map_err(|e| { + JsValue::from_str(&format!("Error computing input validation vectors: {}", e)) + })?; - let p = BigInt::from_str_radix( + let zkp_modulus = BigInt::from_str_radix( "21888242871839275222246405745257275088548364400416034343698204186575808495617", 10, ) .unwrap(); - let standard_input_val = input_val_vectors.standard_form(&p); - + let standard_input_val = input_val_vectors.standard_form(&zkp_modulus); self.encrypted_vote = ct.to_bytes(); + Ok(EncryptedVote { encrypted_vote: self.encrypted_vote.clone(), circuit_inputs: standard_input_val.to_json().to_string(), diff --git a/examples/CRISP/circuits/Nargo.toml b/examples/CRISP/circuits/Nargo.toml index 0c5ec63989..637ec18e0f 100644 --- a/examples/CRISP/circuits/Nargo.toml +++ b/examples/CRISP/circuits/Nargo.toml @@ -1,6 +1,9 @@ [package] name = "crisp_circuit" type = "bin" -authors = [""] +version = "0.1.0" +authors = ["Gnosis Guild / Enclave"] +license = "MIT" [dependencies] +greco = { tag = "v0.1.0", git = "https://github.com/gnosisguild/greco", directory = "./circuits" } \ No newline at end of file diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index f8d72ad78f..552436bb54 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -1,14 +1,7 @@ -/// `N` is the degree of the cyclotomic polynomial defining the ring `Rq = Zq[X]/(X^N + 1)`. -pub global N: u32 = 2048; -/// `L` is the dimension size of the polynomials. -pub global L: u32 = 1; -/// Polynomial structure -pub struct Polynomial { - // Coefficients of the polynomial (Biggest degree at the first index) - pub coefficients: [Field; N], -} +use greco::constants::{L, N}; +use greco::crypto::pk_encryption::BfvPkEncryptionCircuit; +use greco::math::polynomial::Polynomial; -/// Main function fn main( pk0is: [Polynomial; L], pk1is: [Polynomial; L], @@ -18,10 +11,24 @@ fn main( e0: Polynomial, e1: Polynomial, k1: Polynomial, - r1is: [Polynomial<2 * N - 1>; L], + r1is: [Polynomial<(2 * N) - 1>; L], r2is: [Polynomial; L], - p1is: [Polynomial<2 * N - 1>; L], + p1is: [Polynomial<(2 * N) - 1>; L], p2is: [Polynomial; L], ) { - assert(1 != 2); + let circuit = BfvPkEncryptionCircuit::new( + pk0is, + pk1is, + ct0is, + ct1is, + u, + e0, + e1, + k1, + r1is, + r2is, + p1is, + p2is, + ); + circuit.correct_encryption(); } diff --git a/examples/CRISP/contracts/CRISPVerifier.sol b/examples/CRISP/contracts/CRISPVerifier.sol index 60ff97087a..d04aab949c 100644 --- a/examples/CRISP/contracts/CRISPVerifier.sol +++ b/examples/CRISP/contracts/CRISPVerifier.sol @@ -2,82 +2,82 @@ // Copyright 2022 Aztec pragma solidity >=0.8.21; -uint256 constant N = 32; -uint256 constant LOG_N = 5; +uint256 constant N = 1048576; +uint256 constant LOG_N = 20; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 0; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ - circuitSize: uint256(32), - logCircuitSize: uint256(5), + circuitSize: uint256(1048576), + logCircuitSize: uint256(20), publicInputsSize: uint256(0), ql: Honk.G1Point({ - x: uint256(0x20db59a578c18c14c48de7886a4e5c1bfc084c0581f1c1d91c168100878025d6), - y: uint256(0x260f4297297d9321d7b538dff892b8358b6f4e399354cd7f4c75de6a473f54b6) + x: uint256(0x10d36906c36e560297d7bc49c7661fbf50a476bea06e780c40d53a45c459599e), + y: uint256(0x1ed002ce45e75474d75d25ef1764280c6f1974b704ae77315baf31726978c175) }), qr: Honk.G1Point({ - x: uint256(0x2cb79af04e31fbbbe2499058cbba862b1a1ef37dfb94964b9226db5ea0ba55ab), - y: uint256(0x0c629054c854ed1ef49bc84d4d52953f3796c15cf71f65b91daa87c2a26c9340) + x: uint256(0x248d6c5782f08a14f794dae5832e8d4a5b42afebf0b248532d725e5d633e7215), + y: uint256(0x266b795b6cf4aa5fff2eb8c3e5a9b9780d6fd5d7170fc2b87f0e6aec8eaa9551) }), qo: Honk.G1Point({ - x: uint256(0x2dedc7148752b9eb2a5ab01f2d8a2dbecc1960a5ccef8d67d5ef6b0c7c6d86a1), - y: uint256(0x1c57a5f59b22ae21dd5aa4ab74084aa76ab74367d8a64bd6baae2d2949abc28c) + x: uint256(0x2137d78eee77dfd53fc4bf2adeacef7b15a94cc050a06fb8f52e5a28e938a78e), + y: uint256(0x1b0888693ee93d8804044d8d5e8d950ed53fbb451da45863f6f768145c7d24b1) }), q4: Honk.G1Point({ - x: uint256(0x207710f769c857fbe624a2333097b24391d81714b7d7ad40642b9308d02258b4), - y: uint256(0x1044cdbbd63806d10426ca4cb77cbc2f767ee4790206ca5c193b742aa672d6d8) + x: uint256(0x00dceb0527695295e8bc90df562acf14d9bdb55e6250ca81034c7f56b9345985), + y: uint256(0x07963d90a20b5fbd22fcb35424b408b2ed41ab59fb2014027d9ec235a5f5905f) }), qm: Honk.G1Point({ - x: uint256(0x2cb79af04e31fbbbe2499058cbba862b1a1ef37dfb94964b9226db5ea0ba55ab), - y: uint256(0x0c629054c854ed1ef49bc84d4d52953f3796c15cf71f65b91daa87c2a26c9340) + x: uint256(0x11a037d3a9259c512f1039f1049fc7541cbbf315ddb90fe2869e6281c12023ef), + y: uint256(0x2d9966faba8461ee70d9db68e1d817fb21b15fb1e09e7476839dc6d07135cc23) }), qc: Honk.G1Point({ - x: uint256(0x2159e845bf925dabb9ed29d357dabbc4192e8bd0e289a7c0dba3cbe434f5b9bb), - y: uint256(0x1c64d0893955560db37a8a4852eb613ac34e67571c74c4c4cd6ebbcdf1705735) + x: uint256(0x1219c094d86699487f09191b809a6be165c9b4808bbcadef831592295a1d7da6), + y: uint256(0x20b99b2dcadc856a88cc731f349aa47893a0569c4e747b4af0d7aae0dc9bdcda) }), qArith: Honk.G1Point({ - x: uint256(0x04fe2586a64265b5c4eb405a3ca69a4f3956f525a29cf508784978b9c7381a33), - y: uint256(0x00f6ef320a244494fe4fa363d7c119c293d3f00d933d0483e6ca3c2c4bf66c86) + x: uint256(0x147b6a393db982d0f0c7764012b6835c95bc0fa7926fda3f8bf684105282d388), + y: uint256(0x25b693e3f55d510c41dde8bd6b0d61b5c39db3888b55aeada5d7622f34254edf) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x2c066d46d386975a57df073e19403bd8019ded441b9e454eb4045069cefee487), - y: uint256(0x1bbf8b9e8c4b2184984b994c744d216bf779063abc501d4102fbfc99d4227c16) + x: uint256(0x2c9e01c750140eb161d24b9ee0fc8984acb60bf4e395b8e6ebbaa91c1be174e9), + y: uint256(0x1bc18c861d47b1f9a988e2e3d3d7a0a6252dc986d614fcca0e4f8ac7457c0892) }), qElliptic: Honk.G1Point({ - x: uint256(0x0e84090add56f2500ab518c655cae63896ea793e6b3f6a14218d476534109610), - y: uint256(0x2b78a584bd6ae88cf4ec7c65c90e0b65df446fdddba972f3c4414ad3c901f4f9) + x: uint256(0x088a610ed8e4090aefcac9ab7277b21fdfb04ce437eb458bdb3696bff53c1cd0), + y: uint256(0x2c5353cedecc1e5f4d84b3ae7f3711e36deebc3071201975bf0fecc655545f5e) }), qAux: Honk.G1Point({ - x: uint256(0x1bd6129f9646aa21af0d77e7b1cc9794e611b5d59a27773f744710b476fbd30f), - y: uint256(0x2f8d492d76a22b6834f0b88e2d4096139a9d1593d56e65e710b2f344756b721e) + x: uint256(0x1baad7c6c4a0f76d721636e31a5b5c28c1062d21f2148339266343c8c1d38996), + y: uint256(0x1eb16da6aed4aa1a55302d002d233fd4dbb885c96431a494683dc97a9275f43b) }), qLookup: Honk.G1Point({ x: uint256(0x1d64341216e323f076ac53aa06192392677f44b67b6947dd6a0a1490fb32a083), y: uint256(0x28d02cea9cc379ace2ae8779011e247ddc4213ef69895a8e634f425844107141) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x056ab50282da428d93b17cbd1c81267dcebcfbabdedb47b2d715b5baa6520bff), - y: uint256(0x10b4e7bd9d6d91a57b0695be166ffd27cbeee602bcb5a9ed32c8d9440912cb72) + x: uint256(0x1e0266510d883b6379b58686bd63642eae499ea68a706cc9e70c14c9c0e8536a), + y: uint256(0x11491f77ce7999d3618f0bac66ef7c4f1ed122f862d1c1465e71ce1262c4d7bd) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x024236bda126650fb5228cf424a0878775499e69e8bd2c39af33bd5fa0b4079a), - y: uint256(0x233cda9292be02cfa2da9d0fc7b0eab0eb1a867b06854066589b967455259b32) + x: uint256(0x22b036a9ca9be4e71743a125c08648843a55f2cf070dafbbda117ca79e071ad5), + y: uint256(0x12fd44e4853d17621023115fbb658d1150aa85fae5a020f07eddd2215812b2f8) }), s1: Honk.G1Point({ - x: uint256(0x1c55cc2fb0b02448a3020640717caff813a9f9c1af24f0d2e9f540c34f5015a7), - y: uint256(0x16a30b6cc2d15f937e4c1f724310ae17876dc0ed3306d5065ef62f3d708a9958) + x: uint256(0x1a18a989b31c09eea3da5ae3faa7680ef410474de274210f9c39ebfe6a798c7d), + y: uint256(0x2108883b1e5364123ffd7c32161f9228987ee6aa31ba3c579765f6096579b8e0) }), s2: Honk.G1Point({ - x: uint256(0x10b983e75301071b6d98d94328181495a2f0e457467ad900ad0e721e72a0028d), - y: uint256(0x2fb1fc310f039ffebc5e95f8769bcfdcbbc450606013be1fb17037848c7cc061) + x: uint256(0x26ddc6264203943a7c31aed2afb7d53fe32a7a38249897fc2a8771c65c414096), + y: uint256(0x0249864a3e742b55386cf6ab4051915fa677a11885e4b0eb04d20d38e9632afe) }), s3: Honk.G1Point({ - x: uint256(0x0527674bd6324b34aaceb7ac5d53ccc8f3ac533174bd19b0bdb576aa23159d9f), - y: uint256(0x0ecb39a068961a5f5da1e52f94aa1a207b7c200140356b551446a38b4ed2c329) + x: uint256(0x250a1f5dd0a1e0ec7ab855db5863a25a567877ef1bd1c19e5bc1ccdb733b2956), + y: uint256(0x2cc285a8d6a6e91d142e2a941e23c0a7aee361316975b582e0370e46c4939d9f) }), s4: Honk.G1Point({ - x: uint256(0x219af920480ed3a86066566e9df75b3fea6f0d87574613cd0974ac9c9ad38b7c), - y: uint256(0x11f246b3e010032289f6651c503f8da2a089dc85fd235cc63351cbbf8e8bc17d) + x: uint256(0x0fc8be2a322d1c45d22b210211992629be0450555321e4a55c2cf2d8f5498c6c), + y: uint256(0x1091f3056debdf6a98ab5e4c6df48dc4fded590c78788baf2b394ff6005df6f6) }), t1: Honk.G1Point({ x: uint256(0x1bf7da4add7c858eb94b75f2e78fbd89c84f5fa43824a0d5534173872ee099c2), @@ -96,28 +96,28 @@ library HonkVerificationKey { y: uint256(0x15f873b33ec9467e1f0c4fb3a0b59a6fcd6f3480515f1ff5506c48f0c521f00f) }), id1: Honk.G1Point({ - x: uint256(0x2ab51544fb6f8fb3c9c64f9c1678fcf8d03243e06fac4213f9849d953bd20e22), - y: uint256(0x16a447632362b910243a63c97a7b4fa993cf26af1623b471af8d947a425d3cfe) + x: uint256(0x0c02225e1d329e09a738ff6a3d1f2eefee2d9c2446f748430a4c9e3db3af493e), + y: uint256(0x22970a47d992efe75e1a9ae8c48617327596f0b9d1536898b516e9dc0d92e351) }), id2: Honk.G1Point({ - x: uint256(0x041d536b560fc382b49dbb005395e138e92740e99db1312a4381bd453ba8a094), - y: uint256(0x237ad790c0d53eb3dd3dd95445b22f29a4dca08c0597f23da91270ea40d7c6cb) + x: uint256(0x025b15baf18a3565112553243b581ab7c1ef2bb7b6cecb6fd3dbcb494f131c1b), + y: uint256(0x0784d79e6aa29c9c710670f3e62df4c3bf99a73a85bb255a009d5566da762426) }), id3: Honk.G1Point({ - x: uint256(0x10b983e75301071b6d98d94328181495a2f0e457467ad900ad0e721e72a0028d), - y: uint256(0x2fb1fc310f039ffebc5e95f8769bcfdcbbc450606013be1fb17037848c7cc061) + x: uint256(0x2f0d8870dfa4fe4f0bcf1e8a8b69f750b15e8315a76dea5965fe82d369e00ffd), + y: uint256(0x0b8a634aa17cb7e29434a052392f7c40e013e37f2dfdcce584ecaa23a3508c89) }), id4: Honk.G1Point({ - x: uint256(0x28f9e61dad3a4eb1c21f4004d1ee21bac259e36c71ce3e87d1ef43e6b2ebecb5), - y: uint256(0x2aa7685354586c0317feb21d69336ce0f32a56b29beb93e92efb26471c65d88b) + x: uint256(0x126143c034d5218ac854d254492806967ae0d23ec5684d341d730cd4dda79f08), + y: uint256(0x1c00c21435080bb1e5b99a42eba611eda1328b0e38e92fcd955d81e96b9b2917) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x0524c8e7146a41551c673b3139893fa365285bca50c9a1b5a476834f5f518c05), - y: uint256(0x0e3589731c046d57d3ae60d42e595d73cc5e8e83438261bdb144c99daa9fe18b) + x: uint256(0x1120d97a81a9c90c251f46b1ec3998bc67e7978323aebf46551a536bf4d0f167), + y: uint256(0x26d1e132ba53edea7d5e8aa5b21067176a3cf0ba74257f595e17bf0db56a98de) }) }); return vk; diff --git a/examples/CRISP/playwright.config.ts b/examples/CRISP/playwright.config.ts index 9de2190975..66f8642847 100644 --- a/examples/CRISP/playwright.config.ts +++ b/examples/CRISP/playwright.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "@playwright/test"; export default defineConfig({ testDir: "./test", - timeout: 3 * 60 * 1000, + timeout: 5 * 60 * 1000, use: { baseURL: "http://localhost:3000", }, diff --git a/examples/CRISP/scripts/tasks/setup.sh b/examples/CRISP/scripts/tasks/setup.sh index 6ddd4e991b..2ecaed0e03 100755 --- a/examples/CRISP/scripts/tasks/setup.sh +++ b/examples/CRISP/scripts/tasks/setup.sh @@ -21,5 +21,6 @@ echo "crisp-wasm-crypto" (cd ./apps/wasm-crypto && cargo check) echo "client" (cd ./apps/client && if [[ ! -f .env ]]; then cp .env.example .env; fi) -echo "noir" -./scripts/tasks/compile_circuits.sh +# echo "noir" +# ./scripts/tasks/compile_circuits.sh +echo "Skipping circuit compilation - using pre-compiled circuits" diff --git a/examples/CRISP/test/crisp.spec.ts b/examples/CRISP/test/crisp.spec.ts index c6bce5aae0..e3858555d3 100644 --- a/examples/CRISP/test/crisp.spec.ts +++ b/examples/CRISP/test/crisp.spec.ts @@ -53,7 +53,7 @@ test("CRISP smoke test", async ({ await page.waitForTimeout(1000); await metamask.confirmTransaction(); await page.locator('button:has-text("Cast Vote")').click(); - await page.waitForTimeout(60000); + await page.waitForTimeout(180_000); await page.locator('a:has-text("Historic polls")').click(); await expect(page.locator("h1")).toHaveText("Historic polls"); await expect( @@ -62,4 +62,4 @@ test("CRISP smoke test", async ({ await expect( page.locator("[data-test-id='poll-0-0'] [data-test-id='poll-result-1'] h3"), ).toHaveText("0%"); -}); +}); \ No newline at end of file diff --git a/examples/CRISP/test/wallet-setup/basic.setup.ts b/examples/CRISP/test/wallet-setup/basic.setup.ts index 115a9a64b2..b40beac19c 100644 --- a/examples/CRISP/test/wallet-setup/basic.setup.ts +++ b/examples/CRISP/test/wallet-setup/basic.setup.ts @@ -17,4 +17,4 @@ export default defineWalletSetup(PASSWORD, async (context, walletPage) => { symbol: "ETH", }; await metamask.addNetwork(customNetwork); -}); +}); \ No newline at end of file diff --git a/packages/evm/deploy/enclave.ts b/packages/evm/deploy/enclave.ts index ad1e149937..837d24faff 100644 --- a/packages/evm/deploy/enclave.ts +++ b/packages/evm/deploy/enclave.ts @@ -39,7 +39,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { // Deploy Enclave contract const polynomial_degree = ethers.toBigInt(2048); const plaintext_modulus = ethers.toBigInt(1032193); - const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + const moduli = [ethers.toBigInt("18014398492704769")]; // Encode just the struct (NOT the function selector) const encoded = ethers.AbiCoder.defaultAbiCoder().encode( diff --git a/packages/evm/test/Enclave.spec.ts b/packages/evm/test/Enclave.spec.ts index a7e2956827..115caaa79b 100644 --- a/packages/evm/test/Enclave.spec.ts +++ b/packages/evm/test/Enclave.spec.ts @@ -35,7 +35,7 @@ const _publicKeyHash = ethers.keccak256(abiCoder.encode(["uint256"], [0])); const proof = "0x1337"; const polynomial_degree = ethers.toBigInt(2048); const plaintext_modulus = ethers.toBigInt(1032193); -const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 +const moduli = [ethers.toBigInt("18014398492704769")]; // 0x3FFFFFFF000001 const encodedE3ProgramParams = ethers.AbiCoder.defaultAbiCoder().encode( ["uint256", "uint256", "uint256[]"], @@ -199,7 +199,7 @@ describe("Enclave", function () { describe("setE3ProgramsParams()", function () { const polynomial_degree = ethers.toBigInt(2048); const plaintext_modulus = ethers.toBigInt(1032193); - const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + const moduli = [ethers.toBigInt("18014398492704769")]; // 0x3FFFFFFF000001 const encodedE3ProgramParams = ethers.AbiCoder.defaultAbiCoder().encode( ["uint256", "uint256", "uint256[]"], diff --git a/packages/evm/test/fixtures/Enclave.fixture.ts b/packages/evm/test/fixtures/Enclave.fixture.ts index b9f1dce1d9..85aa0aa4ce 100644 --- a/packages/evm/test/fixtures/Enclave.fixture.ts +++ b/packages/evm/test/fixtures/Enclave.fixture.ts @@ -11,7 +11,7 @@ export async function deployEnclaveFixture( const [signer] = await ethers.getSigners(); const polynomial_degree = ethers.toBigInt(2048); const plaintext_modulus = ethers.toBigInt(1032193); - const moduli = [ethers.toBigInt("4503599626321921")]; // 0x3FFFFFFF000001 + const moduli = [ethers.toBigInt("18014398492704769")]; // 0x3FFFFFFF000001 // Encode just the struct (NOT the function selector) const encoded = ethers.AbiCoder.defaultAbiCoder().encode( From 7c2c4196fc92c757879ddc4793870b3fe2dae2cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 12 Jun 2025 17:24:55 +0000 Subject: [PATCH 067/106] Fix webhook (#506) * Refactor server and add test mode * Update support build * Add comments * Make diagram * Add risc0 * Update README.md * Use network=host and add logging * Use correct guard * Add mining to chain * Remove 1 second mining * Add fast forwarding the blockchain in testing mode * Update to fast forward chain * Update tmux script * Enable pnpm dev:all --- crates/support-scripts/ctl/container | 2 +- crates/support/README.md | 46 +++++ crates/support/app/src/main.rs | 112 +++++++----- crates/support/contracts/ImageID.sol | 2 +- crates/support/methods/guest/Cargo.lock | 4 +- crates/support/scripts/dev.sh | 5 +- crates/support/types/src/lib.rs | 35 +++- pnpm-lock.yaml | 3 + templates/default/Cargo.lock | 4 +- templates/default/contracts/ImageID.sol | 2 +- templates/default/hardhat.config.ts | 2 +- templates/default/package.json | 3 +- templates/default/scripts/dev_all.sh | 71 ++++++++ templates/default/scripts/dev_server.sh | 1 + templates/default/scripts/tmux_all.sh | 59 ------- templates/default/server/index.ts | 222 +++++++++++------------- templates/default/server/payload.json | 15 ++ templates/default/server/runner.ts | 35 ++++ templates/default/server/testHandler.ts | 9 + templates/default/server/utils.ts | 20 +++ templates/default/tsconfig.json | 1 + 21 files changed, 416 insertions(+), 237 deletions(-) create mode 100644 crates/support/README.md create mode 100755 templates/default/scripts/dev_all.sh delete mode 100755 templates/default/scripts/tmux_all.sh create mode 100644 templates/default/server/payload.json create mode 100644 templates/default/server/runner.ts create mode 100644 templates/default/server/testHandler.ts create mode 100644 templates/default/server/utils.ts diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index fc680da147..22fedbc405 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -22,10 +22,10 @@ if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then else docker run -it --rm \ --name "$CONTAINER_NAME" \ + --network=host \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ -v "${CACHE_PREFIX}-cargo-cache:/usr/local/cargo" \ -v "${CACHE_PREFIX}-target-cache:/app/target" \ - -p 13151:13151 \ "$IMAGE" bash -c "$*" fi diff --git a/crates/support/README.md b/crates/support/README.md new file mode 100644 index 0000000000..4c04b9c147 --- /dev/null +++ b/crates/support/README.md @@ -0,0 +1,46 @@ +This is a project to build the support container to allow risc0 to be run within docker by `enclave program start` + +The conatiner is built using the github workflow [here](../../.github/workflows/support-docker.yml) +You can also build it locally by using the `./scripts/build.sh` script. + +To develop on this you should log into the container by running `./scripts/dev.sh` and then you can run `cargo build` with access to the risc0 environment. + +```mermaid +graph TD + subgraph N["e3-support-scripts"] + A["enclave program start"] + AA["./.enclave/support/ctl/start"] + A --> AA + end + M["instigator"] --"http\:\/\/localhost\:13151\/run_compute (cb in payload)"--> D + D --"http\:\/\/someurl.com"--> O["callback server receives results"] + AA --listen on port 13151--> D + subgraph C["e3-support (container)"] + D["app"] + E["host"] + F["types"] + G["compute-provider"] + H["methods (risc0)"] + I["guest (risc0)"] + J["user-program"] + + D --> E + D --> F + D --> G + + E --> H + E --> G + E --> J + + H --> I + + I --> G + I --> J + end +``` + +NOTE: This is outside of the main workspace because it needs to be run within it's own context in order to isolate risc0. + +NOTE: We are attempting to isolate risc0 - it is anticipated that we will have to use feature flags to tody this up so that we can compile more of the code and enable rust-analyzer to work outside of the risc0 environment for this project. + +**NOTE: currently this is an open relay which is a known issue** diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index dce93b2740..8200797b17 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -1,16 +1,10 @@ use actix_web::{middleware::Logger, web, App, HttpResponse, HttpServer, Result as ActixResult}; use anyhow::bail; use e3_compute_provider::FHEInputs; -use e3_support_types::{ComputeRequest, ComputeResponse}; +use e3_support_host::Risc0Output; +use e3_support_types::{ComputeRequest, ComputeResponse, WebhookPayload}; use serde::{Deserialize, Deserializer, Serialize}; -#[derive(Serialize, Debug)] -struct WebhookPayload { - pub e3_id: u64, - pub ciphertext: Vec, - pub proof: Vec, -} - #[derive(Serialize, Debug)] struct ProcessingResponse { status: String, @@ -23,71 +17,93 @@ async fn call_webhook( proof: Vec, ciphertext: Vec, ) -> anyhow::Result<()> { + println!("call_webhook()"); let payload = WebhookPayload { e3_id, ciphertext, proof, }; - let _response: serde_json::Value = reqwest::Client::new() + println!("callback_url: {}", callback_url); + println!("payload: {:?}", payload); + + reqwest::Client::new() .post(callback_url) .json(&payload) .send() .await? - .json() - .await?; + .error_for_status()?; println!("✓ Webhook called successfully for E3 {}", e3_id); Ok(()) } +async fn run_computation_async(fhe_inputs: FHEInputs) -> anyhow::Result<(Risc0Output, Vec)> { + println!("running computation..."); + let result = + tokio::task::spawn_blocking(move || e3_support_host::run_compute(fhe_inputs)).await??; + println!("have result from computation!"); + Ok(result) +} + +async fn handle_webhook_delivery( + e3_id: u64, + callback_url: &str, + proof: Vec, + ciphertext: Vec, +) -> anyhow::Result<()> { + println!("handle_webhook_delivery()"); + call_webhook(callback_url, e3_id, proof, ciphertext).await?; + println!("✓ Webhook sent successfully for E3 {}", e3_id); + Ok(()) +} + +async fn process_computation_background( + e3_id: u64, + callback_url: &str, + fhe_inputs: FHEInputs, +) -> anyhow::Result<()> { + let (risc0_output, ciphertext) = run_computation_async(fhe_inputs).await?; + println!("computation finished!"); + let proof: Vec = risc0_output.seal.into(); + println!("handling webhook delivery..."); + handle_webhook_delivery(e3_id, callback_url, proof, ciphertext).await?; + println!("✓ Computation completed for E3 {}", e3_id); + Ok(()) +} + async fn handle_compute(req: web::Json) -> ActixResult { - // TODO: process this in a spawn so that we return early and allow webhook instead of - // processing sequentially println!("Processing computation..."); + + let e3_id = req + .e3_id + .ok_or_else(|| actix_web::error::ErrorBadRequest("e3_id is required"))?; + + let callback_url = req + .callback_url + .clone() + .ok_or_else(|| actix_web::error::ErrorBadRequest("callback_url is required"))?; + let fhe_inputs = FHEInputs { params: req.params.clone(), ciphertexts: req.ciphertext_inputs.clone(), }; + println!("fhe_inputs.params = {:?}", fhe_inputs.params); - let (risc0_output, ciphertext) = - tokio::task::spawn_blocking(move || e3_support_host::run_compute(fhe_inputs)) - .await - .map_err(|e| { - eprintln!("Task spawn failed: {:?}", e); - actix_web::error::ErrorInternalServerError("Task execution failed") - })? - .map_err(|e| { - eprintln!("Computation failed: {:?}", e); - actix_web::error::ErrorInternalServerError("Computation failed") - })?; - let proof: Vec = risc0_output.seal.into(); + let callback_url = callback_url.clone(); - match (req.e3_id, &req.callback_url) { - (Some(e3_id), Some(callback_url)) => { - let callback_url = callback_url.clone(); - tokio::spawn(async move { - if let Err(e) = call_webhook(&callback_url, e3_id, proof, ciphertext).await { - eprintln!("✗ Webhook failed for E3 {}: {}", e3_id, e); - } - }); - - Ok(HttpResponse::Ok().json(ProcessingResponse { - status: "processing".to_string(), - e3_id, - })) - } - (Some(e3_id), None) => { - println!("⚠️ E3 {} completed but no callback URL provided", e3_id); - let response = ComputeResponse { ciphertext, proof }; - Ok(HttpResponse::Ok().json(response)) + // Process computation in background + tokio::spawn(async move { + if let Err(e) = process_computation_background(e3_id, &callback_url, fhe_inputs).await { + eprintln!("✗ Background computation failed for E3 {}: {:?}", e3_id, e); } - (None, _) => { - let response = ComputeResponse { ciphertext, proof }; - Ok(HttpResponse::Ok().json(response)) - } - } + }); + + Ok(HttpResponse::Ok().json(ProcessingResponse { + status: "processing".to_string(), + e3_id, + })) } #[actix_web::main] diff --git a/crates/support/contracts/ImageID.sol b/crates/support/contracts/ImageID.sol index eb936f62a1..367814795a 100644 --- a/crates/support/contracts/ImageID.sol +++ b/crates/support/contracts/ImageID.sol @@ -19,5 +19,5 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = bytes32(0x69f2bdcf375ce3bc8c934c729c38e16ade73301bcdc6e4ae97a98910c31ab11d); + bytes32 public constant PROGRAM_ID = bytes32(0xa56efeb96ad1ed58ab6606e39504329affb555f71046de19ccbfbe7d09c967af); } diff --git a/crates/support/methods/guest/Cargo.lock b/crates/support/methods/guest/Cargo.lock index 5e21a1d26d..0bf043a9cf 100644 --- a/crates/support/methods/guest/Cargo.lock +++ b/crates/support/methods/guest/Cargo.lock @@ -1460,7 +1460,7 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "alloy", "fhe", @@ -1470,7 +1470,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave?branch=hacknet#2ee401f759f530b14ddf6875cc055f4dffd83ea1" +source = "git+https://github.com/gnosisguild/enclave?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", diff --git a/crates/support/scripts/dev.sh b/crates/support/scripts/dev.sh index 2c961590be..1eb5d1230c 100755 --- a/crates/support/scripts/dev.sh +++ b/crates/support/scripts/dev.sh @@ -1,12 +1,15 @@ # dev +PKG=ghcr.io/gnosisguild/e3-support:next + docker run -it \ -v $(pwd)/app:/app/app \ -v $(pwd)/host:/app/host \ -v $(pwd)/methods:/app/methods \ + -v $(pwd)/types:/app/types \ -v $(pwd)/program:/app/program \ -v $(pwd)/scripts:/app/scripts \ -v $(pwd)/contracts:/app/contracts \ -v $(pwd)/tests:/app/tests \ -v $(pwd)/Cargo.toml:/app/Cargo.toml \ -v $(pwd)/Cargo.lock:/app/Cargo.lock \ - e3-support + $PKG diff --git a/crates/support/types/src/lib.rs b/crates/support/types/src/lib.rs index 7039edfde0..1d83ba9b9c 100644 --- a/crates/support/types/src/lib.rs +++ b/crates/support/types/src/lib.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use serde::{Deserialize, Deserializer, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[derive(Serialize, Deserialize, Debug)] pub struct ComputeResponse { @@ -17,6 +17,23 @@ pub struct ComputeRequest { pub callback_url: Option, } +#[derive(Serialize, Debug)] +pub struct WebhookPayload { + pub e3_id: u64, + #[serde(serialize_with = "serialize_as_hex")] + pub ciphertext: Vec, + #[serde(serialize_with = "serialize_as_hex")] + pub proof: Vec, +} + +fn serialize_as_hex(bytes: &Vec, serializer: S) -> Result +where + S: Serializer, +{ + let hex_string = format!("0x{}", hex::encode(bytes)); + serializer.serialize_str(&hex_string) +} + pub fn deserialize_hex_string<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, @@ -44,7 +61,7 @@ where #[cfg(test)] mod tests { - use crate::ComputeRequest; + use crate::{ComputeRequest, WebhookPayload}; #[test] fn test_deserialize_compute_request() { @@ -112,6 +129,20 @@ mod tests { ); } + #[test] + fn test_webhook_payload_serialization() { + let payload = WebhookPayload { + e3_id: 12345, + ciphertext: vec![0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + proof: vec![0xde, 0xad, 0xbe, 0xef], + }; + + let json = serde_json::to_string(&payload).expect("Failed to serialize"); + let expected = r#"{"e3_id":12345,"ciphertext":"0x0123456789abcdef","proof":"0xdeadbeef"}"#; + + assert_eq!(json, expected); + } + #[test] fn test_deserialize_compute_large_payload() { let json = r#"{"e3_id":0,"params":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001","ciphertext_inputs":[["0x0a8a6c08021080101a806ca049c3e165dd0d724db8e7ff91bd3cbdcaa21b19e3f5d254b350b328207a2d854f4b244107b674477d101f50daafd23feca3771c0923bfc2a19a419e095aa967a0d7ed0c7b59665acbe2fe8ea7a99874546e2092f93f37be13879d8dd6364d06b18f3fdf4a678d31b7456222e772f9c6c49ba9e4d7541fd859905f357acc380e3bc259eb987a800d20feb5fc4ec89a5d6ba519ffcd7d75e6ceb448852592db96bf1ba3e29054b4aad860a6f433eda762cce5960a23f19ca5f6dff895bf5bb78a15e3808a608b9ed38603481edaa9208f0887841ac4af289cf6b6486042dbf5e2ac1b53199beeef6129a45df4c6521664f304b955108539dd14596065a14d3f339936b421dd47bb66b2a49b367e40c8f9dd09697bc04aef671d1db930b0855326a8eb31975415d500b0040e6e56f40b6574e5ff2cb154d6168015522e504de9b25ecdcf3837d854017be5c80bb847f368958cc1ae157e82475ee52c9dc7b5e5ef334201c370af95a3af1c790ea9e27a538e44e3d82a6b0181b7ad883e4f7def4d2706c208b3e7441d9afcca4dce9247fab7762a6ce2d1624b3e18672610f219bc9755c8314265185fdcaa3dc203bd79ec6e6ed4a7b0b3ad5db383cbf290acb4ae9eaa8904d3216df99b68acd1efaa78207b89aa7814d05835b501680dfbf8d8079dc01312ca147f54234f010370df9ffbcfedc737c87bded7a901cea5a3077ee7fc4af96f8e6386245abf707a6b68f1fabc4b6b0d1704c45852aba599db14fb1cb62d6a1740d5813d6bacda9107fb6b0a1e26c2d5388fbafd9d53b6c0e26298742d3c20ec17cde0720805295ccc8d5fc930bf683b83ab644c8c59b55d4a0418938f44f597cdec69c97c8a1baef1f674cc18afaab16a3138ec1ac664c200659b55f18fabb7db1b17251e63b05a556f129659504f6a2a0207cbf2ffe353aa816ef078ad4f6ec2a6a2e5a7bac9b3104b1b6c234811e1bbd415594151b73a334b4c3f28dd865348568b3a4fa406e56dd7b1b0562859c8cc1d0dbd2b72d34c5e4c9a7625024b6e3918e1346aa9c82280787c4de8842620ff78483eebe5349de09703afe32eb938e68c2030e9c0a8e4ec730279a1eb63291801d391cc89b6d13febfaf85c82c832af74681c0483efb6ca8a384b33775720246832bbcaec495efd92f72602e682a75c9d9f6d0ad35e73d1a4017a3868adb52ebe5a080ff6c1b8c7355eb39730b59c3c6e9a24c483bc997eabbdfa778eebe9d3f44e2e195b8740ed960bb27dc1fe08edd8bac12b264cecbe548dfd8264ed7669d7534a24f098aee146d46fc5efb6ada42af40899b0de9ffe27fdfbdbc6f914d6be23d9bc15691876a7d64c7aaa0fd58132f514fd3e772ae6b8dfc76e939576efec7bec78214a7aa2675402cbfd1c44f39af967004ac409b6743ca4f3a7acd50ad4af945c4d2abe0397079eb39735cc7ee1418026bc6822b8e42d0dc46b1e2c7db2862fa057c312c3c76e82d2e0987d27b7225e4b40eb67edcc2b35e671884937f2992c25c00fd8cd24e987ffb0674627dd613b2393040a70d5f7caa12010651d0d7ebddf17acff6b156562e61086e68971955c03fe0a7355038ea108302df3f47a91dbcd4fdc24a5e37920923f61c3a8cb665dc41687c3f6108f4dfd4536e305fa394a92e554f5fe3cbcb7f6c1a2b6799ef2690315ba07964fdafc64944d6c54a600362cdc6e4e00d1747cfcf9c433422607d51ce54dff2d7c09dcbf9fc282d4621c8d881e6643eabb28ed20188d6cf67ab7ba7f45fab1aca01d26b4a0076a6b6f029427ad2cc7babda3fb75cc044d70cf4aa9b6da079d318b5b4d8379a1913e80c5268ca4151db34da60343ecfd5fbc4fa5749cbdc8d432180dff3a480c8acfa6197c400c42e3f8eacebbd769e4ddd2374de9c750f84063a827715457272559035fdcb6e39fdaac699d7285be86d3aa64486085d3ad9c43344c9b3736c2469b9c7eb00cf98f0466f07f738cd3c96e12ef0728f20116ad462fa9cba27b7b7b0f6b18e94050c19fd674e43a2127bff51045ba975540790ef36fe3bfc2db738475b36f6abf5e9140bcddc95b1ef31992c38e9c96553d662f5f9b352b33237cc46efdf5f2e35980f07342678ade5ac5258463973f4d05f63edd0479723ae6a701989433c7d0dd4534d82e73acf22e4486d1c61e890e0246020b4b21563a4290ec4361b91517cf8c63847d48b36d8fb36c0dddc454f80671bf2d9d71f35307bc789948e27d9f23b079fe2ee1ba9e0504de1ca324c24bd915e049394bbf7c28fd327ab906a18abb6f33b40cf01a1217961948e8417adb55d54b7ad18e04c8da27f881bd554cfa46636e11d0a60ae5dd7f2e7ad27800ce53e0ac3dcb2e8556485b874b16f49486f9d26acd1d6afbcb06e1da93717fb6e94f8f0cd80840ad3f1ead39dd3faa2fc7818228963b1db2400984f94513ddb427176a63e4af53da9c31f9d279439a53b07e19ab68085f5ebd9091b2cdf4fd85d19ea757cdaf462b13871ed5a918b48aace7c5ac1287bcca734c65c5e330de3c96ea6eda9ab1450afb830e5afc88b2b925955097c4ad1609465368fda745843da614a97f7411d79268b4f2361e9bd83c83528dbf1a87fc6f89a7e2abd6bfa27c1be2270d28b6963142a07e6ee8608806f34247e2848e7a5befc8bc87b221fca7bce629d1c72e242f40e44edf71f062501947d68b2fcc6e038ce8a43dac30e7eff4e74f3c9d8f642ae90b57a6ab886bfb60d3ba42840270b15830a75538cc33fcc2bb149217530754ff370719d125f2b41096cfa4c745de9089e69dbd086a06a704abf108331a20a5ca1a72b723ffa157c6c1cc7b8a97bbbf3928f014748c9fa89542eaa6016c664eebd6cb01db4839c2083d5a4cc38a871cffeb3a52667c593ef5bf65c11b4ea4732bd3a6fbeb8ac389de161c565a6653499ffab5a71b09ace40dd79b6d7ee919db59541ed7ab694d817e37e467dc8429bd58b8ebdaa6c1380b0269a87e6fbea6edcaac0b42f5798cf0cde4a3d5cf5ddb724858b63fae88826b115d00c00bf0a909c1d364ba5766c890eb4fb865b2edb3d6726c61d449406a438c7f1c853329a62cc791f928ff449c4f289aef8a72da06b772aedb21113c27e79fdff81550f7f5269ead35348116eaf8401459efd3da0ee6918429ba16335d535f0af3d33d8a4c146bbe390b0ae6228aa41b37ba9177f5fdec944ff8156cb4ba786145caa47e4c3513be0fb8e9cbb220aa647f9c87cec202b8d625c639c8324e6233a10d0d74dcbe6d391cb7f5bd3e9ce30299cb4e01e569bfdc0324d503737e9c28c58e3269deb1688bc70c0db4c6e4c088c5d1aaf31c598c010a5590fc03d9262601741dbf0662aa71f14fc4cb3643fd6559b3407f2f3469ca208187e22f6bcca28df708aa93e8dc85a64489565cd69966cbad6a0ed805bff40c1c9ab84ccc6c4fc5ba8aa71720274301702df3c874813977ce2f2026213924a66557b88fb526e12b943bf9bdbc496c2e35c4193457650797b599b6362bb6869939c0fbb51486112a8ec38ce49d3b3a3990895f0aefba7bfb928357551589346830eb3882cc840965eb55b8860a2594e613cde2613663327c062feaa3bfbe192c5c53a29166add212d7ace1bc858fc65725163dd5fcce9e12f1102e320ecc623904339e370514e0ebc4a3ec8ab11bd099ff8805695436548433fad5a69d7e08b3b8e1569a0eb79a77e2252442434393008bc2bdb003b2175b79f47593d99146d041c6df7abf8bbed6a957e7deca154d53d597625849050c453ac2b8bccbf3b49989d8d0276223dcb97e9d3f209640fa2d455538fffff1502987953d5a34e27088515bd08cabce3d9ff2e35ed40f3b464a1797896eb05f79714a855b013d864714e16a553ecf79f71ee935871bccaa30c408e188a48f4538413ae13fd2091fa1a36acc981753e937ddb90a20af6f9eb2679ba5ba50a77d69b5ee62f11d1bad3d3efe31bdf108f1620417933170bc9062c739b3848ac61f68cc02b01987b74d33a6ef2025dc512e412153ef6a69fbd767516582dd090ad42b4e74c726cf49fa79f7ee18fa003420f5559f345c5b7deaaafdf33dd1664926ec339da5e08cec6a207f264323d70f90109a3621fb5bf2ce0672aa9c4bb52f66a0b661866c9792328bcf9b39c0073bab28757a006c9c3d862d6e208a16f35714f4e562fc10881f503277e035b9bdb9b2851204f5fe78347c6cb34fe3094fc5b41433fd509bbddb549840ded7aea3e13e3226893852e037c12f1ddff92ae671db83e64f24245e2148194b006448bfc6a3ca1b961c49f6850f8115f3c17c7452cef01aa260a2f648bcc4551ed00ae3b124f0bb37a2b50a206483cdd72673bc366c88396b76ecd789bc32c52a59cfb322a1758d7be23599e2f41a9d50aa3ca12739f0ea9fa82840dbb113fffd6e9e1fed7af23938c81d1801b1551216180f6a891b50a4336f67d4bcec74d8748ca2289da14cdb975c22a00f746183fb2407c38f006a246e9b1f562ad6a0ddc95f820c9768975310558044df1c44c6abc099753272ec06650a4a1117cdc10662bd19f66d9c2d8596ca2eab7137fc731f53a93154f37dc24b254d1c03d1d85244dfda7fb8ffe8711f6bdab0da62f7bc77f172c4d485f878aeb1ba4fc9ef1883bac943982341a39753ec2ef9b5c305d706a8b48c69a119986e4a35ba87036ccf1a2f3306f07b5776a25659b7256581a9bc471dd86c4f07b348dda7bd4f9f902e41b0155b0307209d5d61c400c1347b4de54caf3161ccb3d7f0b28661d57e737dc625ae60c587d3c55fe039dfc5afde9d4c159e1945f42586617501ad8b1aa0d8cd2449ab7f6df7aed7cb73b90c06753456b929039012451957670d1ac9370f28e5b6581965f8b143ddf2e2e5fbb6d8e43f7de75ee7358749047e97169899285e85b6fcfd4e4bf3238e8ac109e6b399c9209469b7804390970b9d0bfdae2ddb5a9e3bec72bbf458e1a23faca596cd1a432ba9e294503a97870e42ecabd3b5e372b9021d96951e98b85e4899f18d818189e64497f89d9e3ea93fafdb6ab31d88322e6f82341535ca39520827b8af3966c16ef6bcebabe58546f206b63745214c8d2b2d31ab1a54638402ac48ce253e8de8226f3640f989ff5968a1809dc010feb1a8693782aba839563c8c18d2d23a7969878f1585019a0c4475f3413479eee743f29d26a1bdde1922bf9fc61bbdd0ab390fe7cf74cc7ced8242c2c024e097fd17a96dc1e6cf5974d8b9469aade07334da346f589890a1d98fdbeb3a268c165ed4caf2655a2133095aa1e4574f260d79355123feff27cad8b5c51cc1e8bfba3af0834e90875e34129253e9d4659ef75ff71cfc49fe82b1c57b3f1deb3e9a37daf35e37f52cfe98a56ed9d3633ab21d39376a4c6e55771983ee57693b2dc28e6a935f84071d2729d308b8ad192568800ada82ae9ee44269189951f120939fc73f2318f75ed4d89cc135ddf2a5d648dfc530d55c63ca4283ffb7153fe86a37a549878995e4fd48dbc816e3a7eb705f8373ca1d1c3cc07de5cbb5dd5b0ff68a8e6f64f76c60e3362a10851321383a7f98aac1e0006c0fbe193c2a7827a298fd7d5e30cbc661b93172e4e6144f6bf2d23abcb7b8740b6f8459f3bce6177f6d0a92a26e9683c76f0e6b615cb09d251896d30c23e0ec1ce88433b8f8ba00014382bc87e0769588b5b5b970046dc9274e56d466ee4ef59d4287185aa4e6b9dc241145421443ab0c631b579462513a87468a7ea08c4f76d2d4d788017a4892a4efe60207f7c884bcd6a72ed45ceb6e99246f18b0b94d854a27a1084224299ea2669029ed01957952ce10075804bdff3d4ae0e58115319fc146481902fad05923e1bdf3a1511bdbeda1ae9d587edaa02acf0ac613889c4ab7e8b5bdd28e85427921e15c0b4f1c8404bc76d40d138e5deb02d632d7aa4d2fe8460ab8136928b456ddd4f642dc24ac0e0c21946392b8ec5f74f4ee9ff0f66d1042333396d4cf14f0cd6c8d76746af2440d70b22810e34f5d34d679a82118320fdb397e65fe2279337a226161197e72a3146d006f24fa88647293d959d8956a480cee9c298d734ace59297f0e51506da0ae462fa966d869bcb7923278b4e74926384ff9ef102a71d74dac0290e670d1123440484aeec7c77ea1388214422c27994239017c1b2473540b662bc30222affca45b054fc1903991bcff310321fa37af7af15f2051d11d8b12a44f20ed4dabc8f4be5c2ed91c35e9ba597db04fa8c1169c1765fca0e7884446c4787cae17ea7970d566ce218de3c76a7e65cdce6eade69e8aab807093057f4489606ba4ef49e70fc78974ac2d7305cabf142f3d0277dd995b13eef79b0fc397b60bce1827bb75e7cecaec8ee33ef0e0fc01600c8d6e4961801639aeb287159f7e7ca0aa151772a66952ba9c91a803c59d15c81e2431faa3274aac8bb2feafb490f46acc508d4d018b39a140f69ae252f798abf2d3671fd6ab08995b4a4ed85be958b7f44b837453b6596b610b7abe2d06842fb4e95142367e80d2dabe6b8c17c27316747328bc93d665dca6280654557bd14caa9ed1c808bf12bc2cc47ef2f4773f7fe596dd6ebde449ca20bd3946e67074229a69ac1f08dee5d9ace9c3d9ab7dfdfd9771fc6c7c2366116ebd7417dec676d1ee48de0a4a498c2eb031c89a82ba8f6916989ccf32c3c029af45a08d0d30199897d05b29a120c299812e7c8f992383992324861d57f27a553cb6b50a39003b567a293f496969bf5a6f4a3a197fd41b3fcabad659b426398942cd8b79fda00d644ec1429e60c3f16d3000c7b751818a548722026deeae5bc9dd295debbf52296adfce9e8715d6649942cc23bf80b38c2dc82f8ed1cfa30a0d9bb1d8c4a4eece32fb7d8e3e792ca8879785151a0e5443b63f81c9e52f842c2dd5633ca97a1d550bdcf7b165cb04cb381984483f0a49e79dbc578ca731d0bdc7e48921ec371f40b28ca92b99f2c6a022c23f23f9ac8eaf9e9cbd7a35fe8546dde4cbe7024ef9cc1b161e56fe8d8394372ea871efbcde6ab292797853a8feb11fb95ec02ec9ffddef8eb58e94b949a33c08fcdc5190ce14b60e82ca9012bd9869f376b6bed0d8582ff1f782e2821fd410a5249ec3bb5ea0efbc01df1c5859c179a7d64d2645f6fa02ca93d88c998f644dcd892d25a6a9a449bcebbc87f4b0861b5af3165bd30638e61236ff2f857160a8ae9cf9309efbc8fe94ff8e6fc7454f1c81ddce47dcc0bb80192352b4e25554250151c21a21104abdbe8507348763beff441739eed1aca278a244e812e5efaca70127a16a3c9c64779b2de4eaf936e5f159f8f38d5197575fc83ecae499b6a0e427dadc7717e166009a4026ba04938a55f00dab1587a4fdf75d89ae6d0c9c21debd128445fc922804097bfe260311fb19aa1d1835c1f0db069982e7a9e2ce09ff8913bf9e3fcc9988de2ffc237acac8f54f95b6e1794513c89e2dad62b5775f588f5fc6d2a48a43b9174332040bc89a27e1512facefba82d77f9a3216a36f28271502bb784cfd5f5715c806f04b46273bab8fc0a8b12f39d4d4da79bdb865598a774e710e44327ca33bc39d70e93d36cd05bbc3d56b997d9f2ec01c46e64af25b6005091d0c04de503d46a046c9a146aa35f0b06a7bd877e84d2cf52d6bf8c353d807c4d962eee67f2d5aafc6071fd62a10120abe17fac0281a0478d53b37eba1cd17e31ef4af12f42f52694982300f2a046fb3af606a9ff257cfe9ab0171f4ddc6e45d2613c16fd3336394c13764b98a2fe8f22f85bdca4967bb7c0cd0711fdaea11f56be8dc79ca079bed6d73957d3fa816ae883613bcb98699b833d55e22167a4c5303e5a5a0e8c3f5f385b269b9297eaca3aa023b91ac1cfe193042fa92a26ccdd96f522d729335b5abdc6aab80eefdf02e85a97b4a0a21d5173ad451294cbeb99288a1d6acccb087a4d9b3218dc3ad84868b3b21d01acd4cfc3a97a3579f2f23db1d955307008d9251999d362bec24d50ce11038fff143d70b5b8523c60fb2f56ea4b5101046e46b219c09f181ab3d0c6edb7cf2c7f901427314f0f0ef6636f7d670c8b241d8ce9d3161e1a7d736e47135c6167e26422d684515dc6d90dde11f2a38423ef2cf9b25c8ce0c97d1f8fbd3f4b7d5a3cf97d6424bd532345c4e4024bd3ed6ceac4c922632d42bb4f187509d63f32fb0181cd061e8ccdc45f2a30702389c798490e9b82a0b4c23dae3bf95e246312eaecdda39d9d4b601fca0b2bda3d26250fd35655d2517f068927965273a9a6d14cfe908f0466befdee963b766bd18a85b9af93dae09688d10cfeabdd3405737bd9ce484b16184772c3a40c9695fb54dba677bd1db8aa64b69ef2069e14493e7e18b9e86cfdbbb85198d73a932a6e972d830a0de56fda439507dc95e27db1c1512774aa91a4042ad17e2c356e94cf3bcdd247b39e5825440f65552b006db2923cca9e22f200fb21e6b7a7534e67d5a79670cd03659cc3501d752613341c413558de1ce4b52d2d3d5243b0e1f1c3a3d14bc6ae6947cd11157040804d2412d27b20d567e0ba88c03c1b60196fccb44a43a75ea0d0b70e465bdbcafaf74df63f5d1f5d958a59da490bd166dd18c60a726d0b56a1c67b04241a7f169fad65144ba0f0150abcec159c1693089ee93dcc37c2d099dc7f68181971aeef873a7e20d7772413d5cd245f3d9a5e56e0807139872bc332ae7df88ff36f4ced695582e986706d686359bf23903f994e5fa239c30fcb3dc85d3f8e28197a50b31c58dd19a8d33286fb03f923323072fe91a337a8d63aeb8b33e35011db017acd3287ac3e222f4534fd097e102eec9f22031b0ff0eae8ebdda1f1eb36cb540160fe985cfa28b36490fd350b5fe78a76758eb8bd26234832075e2435fcae22f60d6206cfe7bad8e5858e17800d3f55cfed826b920ec582674cf1ffa0c2517540b3742b09f0117cfb63cd68b13bf61f10742ab301a859122d862cd2c9bb9a70e58cad3c896686f937b21f653b35275c7b292b044d0e82868467f5d293f6e6ec7370c9ee7721b44dc6f19470726fe79dbe51f2a03bcf462f2194b0caaecc00550ef59edc6aa9acce9c2128263b782c5aba11e01ddba83c94e394d805c635b5ba01d55742554b3f2c80a05ca7257bfda43583e9e5cec06d9d0d55fd36ba42bda87662243a2978ee3427ade52075573018cd0b429fe7276f9fcff19f5df1596d76e253f8d6228821a5da697abcfe70ecc243934b0f75361f607ab8a2ee00dc5a2db003089039fd19d63c569aed4795debd782b262e8b968c5bcdeba373be6a41dfa08ad64da32ef7cb42c13a0f757c13e2d40bd8e9eb209b345bbb422ac8627f20b2d3db75f7f497f338f96ec013c81044e5761f0a562aebe1471cf5c47cacfabaaa93f9d659a90c3919f7fc4a9a9c1fd0435cdcc64815378aefeb182c95883cc6e18032e67067c59b2ccc094fb9d52f571873fbb59960050e2a04bece86a4d23640a0e251ba502ec4e2b3e0851ca98f88bd707a0aa4f2b507c15e4b6d38f2aebaab994ff884cb4ec0b3e7742b9f912bc63db025722787b5bbd7318fa362e83687e33233fc419ec2b65336cc88b10c73944f20ee4b57cc6d01e00505b0197be281a316006deb57ca466fd8e1c67122a8d95289f1bc4ebea5f30c3bfb7bdd322a4a993560e075951375fd901ae2a6b531b35ffb0c0797b3aca5e13d0063ea60e2ad9af26e2ff31b6dab7d7705e5475daa187aed78b2814c460742140e4375f9feeff8f0e67750bce584f0c2aa1627ea49f7cec1fda009dc47479359982a75c0a0e9e62e30e8ed113053cb4995e04997b2d1610fa58915ea4c87af5ef7e86d839a98a42686648e6210220fbc3392815c72d67a2e7d9d84590a4a733c4fe5e539ce418be57eebe16b2d8059d61f61a6f4c9a314d99973557fb2a57f54e3ff24398954d71fb9403ee44cee0e83dc8a90af13a57ba60b9040b575ee7045246e1279439f88a875d9dcfde6d9b132e46cafb43f5353a623b11b0d357e19470f764a53c43922feb3a9995bc8535ae4e577166837090775fdb4d94ee07bc13e780110207ca424fef4cbeb95bfe4da4fb151a8b3f2e864071a964c4746867f4fbc091b62a30860b9d61658f14615736eb244cc923a16fb5462290769d4e9cef84918aa806baf16cfb383397165ddd39ce9e9ea1524133eabe820447c1bd50878a1569db9fcbceca624e9e7695b7cfaafcd2e9ff876f05f6da03848caede660b8bba9dbe898ca05c0a076ee95ff213cad1b3854b51349aebe065a2b1d1f5c9ab080c27a15a9120ef9193eabe60f38505f62d3d473d9236f81d0a359c506eb4530185b8071178b8545df1f831e93d3992282df185d698471522868bee153dfa1678571fa9a800b035ec08d37f62b19849410db87915464260c7678b485e053a90bbac8b364aefc448aeb176231eb7800b17648023a9acaa69c193b9fff902f6f1c09dc10141b931f38a53860f20c57f3b2f2ab8e0c0d858a13ee3d0f73395929528854d9a2a8fac97fdc4384516ed54c114c96dc88f0dcdb2f921be29778a1b61b2c4b6339d6844227a7bf3b8c344f0b1f2eef8a27048ea785c7181a018721400b1c4b604497de4546d954c76186dc12986cbf08aa90bee611ac28c426c2040dd29e8437a2d11c29a1dac00476012338911e0fa245df97a6cdb8ef23d13506a838f19c43fd33b11476782d58135ed7189da165e41fa04890f15409062f391e381adaf33619571ccfcbcd60742e2d430dcab8425ce7dfbd46ef3a72e027a376f1a2fd1e92e78b86d5d82d45a66f9e55a32fa4b0096f5abe089187c8b032b4b9f224042bd0a45a5b6fd3e29c167b5e715cc89549fb40e2e4e96fbced9de4b4ea8e4018c665d17d6076208141a94bc5362583b2bbffc9fc8d79306be6a310c95a9b6be38ce429237b74c332e1ee1bea197917a1a2e4b7abf7abe3eacee0a945b138df1fd6b8942788cad7f116ed1dc5a419b1ce1fc3965ee17a3766ebd58c5ab61058cf6ee1f321c518614646cea26911914851c312f372583f385e79a1dd2ece6455dd30245dc046742a8b25763e6cb7e940432f46d10c5be70d81954067ff3f9db070df81cfc4da0db1d2a733e2770febf22858a766e984ca8b7b607cd749bd3a8ea0147d840bd24ab0022688bf942b651bc0a5651a479392eb507da1a3d9de2015e57b72ac1abcabe2c407ce6894087e565e27bd3ee9eb156d384839c01c5357df067e95fdb896b956906a734d5f6cf767882f2a45ab63e46f984030ad9a51b82e38ef8ccbdba7a0617f5ff499433d168a7d60194c076c3a66c1b52bf9cd0efcdc4cfc92b7f3c7a4dd0f7a12c1cd58a477a072033c156a7fc81ae128b9b3d50cc41acdb56b129ec2edb6d1b81ecd60737217382157ac1ea63e56c28f82c6d3facde849d4bb5cff9e749a88f7afeb464225d6f334c03f70b3da3bc743e7f7c5eaa46937c4e412a498ea1063ce4115d74565faf6f6f81cddac4595a32ab8f9867494e4793d1b5965558e264f7b65085441007adde5634feaebaca9cb0c4fbd33942fcdd7ece91664c54524f00d6dfb9563421527dcd219ff54b2578dede9ab9e2e01b5e5012385de900747caa4eeb772943fefffcf862be39080c2614c4d2d02ade05f30129d01007643e2e5105de0775f8f9bd63a83be110ac8b47d5c1986fad0fb3f7cfef8230b9e6eeceec85df2758631b1fc5bcbb91a3f8de6f7251a31e22ddf822cadd66adaadccd0a8853cda0ea06e2825aa6a8530412d88cf37845bc0443d3de39f7338c5898f82c268f60278d366235768c692946009a93d9f6f21ccd38b52301dab871016fe534b0528cde20e8d30bb8b3143875d84aefd0e2264b39098578871d0ede2cbcb274251ee0ce92ded6edd794089b7f9ad131a1ed69f349ab91b8d82f2cc76d9e3ad216404964d2a8d2e9226c3121730770cf43be4ec216cabd1c637b652c15964bbbd8bb22ef6080eecfac4b99bf87e16f4973299cfcf0d666317b178ab8c56b3ca8d7b0da257ae7f875db68ec2da25722ac7fcc1a1fbcfb3b8b771db8f6b4f9d079265cec3a343fa4a90c8281a3e2068d915fd4ccb1bc8a679e11595bd84f9024404e986316b450c87352f7e818a48083573af94b41571ac81aeef6c9c97436e622143bd2fdd82a54ecf0d3a254528c0218bc322cc72d5ba4e6e737cd1321b55145727772337b5667ac8a60b783c30130dd7961b2e63159cc9ef866219d2e316f5bb54cd399a4a5c3f465b924337f1f9d522087ef76bbe4a605dbf72ca09ef27274c77e765df97eb974f84b39a228f65d5558439cc7259dc4ea0b308c2afb7346236496dfe89a4b4986558d6822fb409ab59dd2d9552cb595a40b83aa7bd1cf0562bc97cf704f25d710799dbea51cd0cab61d3891a1fdbbe46343c593fca944acfff6887eef099f895a13772aca46265b3a87d4792beabcb97827205da5b93aa61275f2f619743caec9327fa981bcc549393c0b58ac2f076f10506378bf963cbe55b0f06c9a71c251d22990aee58e31587857028c107f5e610c1c780b378e78bb2b761aedb9e764cd7bc26b5425197ab833892b8454ab02e91215340f032ce6f35249517289ff62266a30d636c532f065b5540c1c55e746ce4c605f53f3844dfc12c24c4ab941613cb2acf8571219a1ad04ec2f5568f454c089b82186afa26a0b8d5ad36a79d73f1ab9a9ae3980e41ac827ecb5bab47a86841f14134aae92f2debb3813f315d909bf3dcc16707ba9fed3f471ad442108468661fcec68424f7cdaa62cf35a2b355437d42269a551f87866cec04d0e421aff55f7c80ab439ded71b50dd03365fa71167537fc450b83fa442e1c91de25c09d07d51bb1775e95d75e74420fa51c71770ae1c0830a56d648fef688ef9779406ed4b5e965a9a667947f28f241d0a22e8f01df4c18ef4e3cb5304ade9fe45747050250e64f9585d5de7f783b37ba9368f482bd5a4d2d9d1ecf819ebb0be6442a531d7a1c458078e399f37b4f251adb56b7c972355c6a0de6b7cbc740fec8065035d7166acd87390f13d5baf7d6edf176275181f288cb1b24242291d133d8838b69e6c9351f090abf52da73ee16b8a98c808a2afb0c486dd186e245075b1f28d70068aba8b907215901ac0dabcc3417f08aa1fa485941860865dc0d904d39bf2f18fce14030ae958879ce9deaf78b83cb4de9a57efbe56a7aabd834cfcce75123ca9f036f3cef1d56937a84d3bb92744a515252b0f3bdc9d82a03ad639f7e13fc8d6fee9aa8a561c787c391d237f4ad892f1d50e37284ccdf7539afa53c53bf97326d72d71a9b70133029aa169b998c3ea757dd2555180a4beb95825c6f39bfae8c15bcdb4be0a6cca7eea462f562ab23f53ca0a800d440746bdb3b4aeac234eac7acf05288181a72ac40fe2a8e0cdc0ff5282bc0aed6ed99b7f060cf92cfd8beea2ee30b2463bdb8ff236ac3068ca5d7c295ec61417fc6b802f1bcf425bdecd2342a962d2ee7ea00e1850830e5f45667fc150b30f0fa2effe1adac431da05b4eae913636ac6c69fb9666d889ce21a21725e444355b200efb4d9296738840e88ead1798cfe9dd4918ddf02c78dff8bdfc382287fdf8980d88b513224cf2afb3d73f248b99e3e97eb414ee266b3cee0d08a9880b0acb157fca424420319bdfe587734d568cde589bb80bfbd79924e3393ac550271e6fa13d70f8491a276157f5fd11ab6b09e94288304486bcc2b636c79af0d64496b7513f6bb34ae9a656e5d0e44605852076fa4c606e5d9131b9ac6f1fdc4e415d663cca6e76fa6a43483d97f17e4de38104db7974643cc068862c1c56b903cef19fcb16150c0b7c7c1172c58e388c33a1b55c728ab95954c515afba56bff5147acf7f3005942714c1cd3b24ed9f3b4b8418c5d6d3a3442d7cb0870f0a5bca6fb4ce31c87e59f320c34d57aff72e2c7de0eeb3998f4a5841f949909d786932b41b05f2dd4e190ba7284045fadc4c0b057c79d00d30e30aa31dbb02c5867fe2d81612eb64316979adc69f9e7668d12aa8b1cc28e7606aaf8a03f11caa67ebb821cf69bfbeff78c544759ab760ca211defd33f0018adf69eab503634dc2958a0231418fad840600b915ccb318193d0716f1206fec5846ccfbd43f985bf9474846b710b5456b9cc2275bc9bc83375e83c87b31668927523d50bff35ca11d8f5c2d23e5423b3a9a496eaec7145e419425e0b5644046c1a60b363a6e06ebbd668138ad4521b1cf09f591a80ed36ae37671b90330a180fc97be3d579940fbf9368de2178a087ecf9eeebdb81fe6e8e2f0549f7ca790d78914c4cc74731e092033f57d918e74fbb664d7e47760a6e1adfc6e67706465ddffa05dff9435eaef6b218668819274764123b4f1a1f1c16f01df4c102efa17752d0357de1184d5ac0b72150e56394c09a8007178f014905b420c81b1a457ef7cfa268cfb4b16216a8238b95466cb11e02824feaf841e7594a65eaaef75f6de5043db3a8dbba764e98add0dbeab420a93f874c5de458fe73e3b175df6c97052c10641d7a8ad310f4416ed84e837c6088e9685394d9a41d8b7e35fd49de1544c90c6113bb16d8cf6e7b365762122260a6c7ce36ac0e0c914e558423791d7c22cf505eb6debdc82c15eeab882e6214e018be2174ba8a3e1f0fdd87c9883d5e3c65cc8c649dcd268cb41f3488adaddde719ed5fd9ca571126cdd6ec76e9f1e831cddf9bb932d26586f934382e15038286ca068160636beb3e1af45c45b42976385adbc2c216875b1d4c6e743c21c241ab4c592e9b95565d0dcbef265446fa1aab340017c87a70a9aec75a8456e52affccbe4011c71287d69c6252acaa8ef47131f1403ff927ac985c40d724e5685c3f482acda6216710d83351c8671dc4a2e693398af92ecb0c9888b9a664c9d70054287738467f9ce13902ff41f4b8f1270eadd50f3a6f3e255275795531eaf8caf034925caffe36343540848f6e6f03033cbbf9c517e06cba124401b2c5985ea60eb52ad88ed9af17b251ba2ba3c59b0b2dcdaaed59bc3a34527f2df832a0d0d6b08cc2e801d332e445e921bd8de2b285d0e4e3d87b1d638aadaf75e0a265b5e1b1170d80bd73b8ad3342a7a981d43835835a62e1c73f3ec7293eff4e91607bb9a365876981a3c93d9aff0831380c6858c6c45c54249843ac6693d530f445dad5afd0f1b7316efc5262225b79cc44942a88bd00a1d98122b730cbae148b7abbc1a6a8dc454d53ef6ead421709ef84b5e7ddaa33c047b3902d4c78c09f8b91f4244068c3dcad9da3f3411a75380ff86d46b50c15e37da32d5869b9de60b907154ccbd6e667c4ab8ddcd730b23d96d0c841932742ec4351e58e6f878eb3d66c268ea3bc2745dee1e8e905293c647cfba938cfda9636868be0a645249fa1165965e02d8eba91860f28cedfffdf435eb5b9c5eab18956af4ea5c449435d6d2927b8206d9192bc0bc1a75f98ececea21d8087551e8b709279372cdcea4f5ecd29efbb7261040180448e293a7d2e71fa407a1962e5c970c603ac44fb4636b37582957b2b7eaf93408118a40ecf8175c8c3d4497df790407182a45f4ceaefb4df68294eec6f8308f5ad7808de8af5eda19d1ca224b3dda516412d2eb76d14bceaaff94ecc976b7f0a761d712825373a5a634245d2df02eec2950c2bd5c125022e6af75f9ff4448cc8c84c2e3081f7e4c1c3c4fd8439db822ac30ac24e8747269bc72b6c71e2d6c6a3720cc54a1d95636054a8e437227c09fea15a46b214ff445dd91a1c8f6fcf5878b6ed8e624aea8777549a80106e5e9b9428e64c3d5630878c033a0e14b5bc306102f380c1d7eaded4ad20b92660fcdb1fd8547d7fd7663bc1b298941b1b4bc15a6964feee961612cc398ca14a74c30982811db9cafdaac5bb5e22d3fc055738f42853f6007fbd198d0414621540386075ebef65a953cf072321d8c2cb8fd3b9f114ff88bca9d0717179b2733f83fbd6ef6b6f645605e3e20675e4b7eb519eb9bd0a50e1e73b8b93418a1677e4c42c371e720fad30134ee2ec4130fc7157f40817cca05ba1e6e585bd8aacf73c0b0ca4fb0de263199277e772594901418a7bc92ca3b787cdf103910bf7a25a48693501f0c1d3d81652fc7af935ec8aa70772d64249e1d68c1c5ad5705e67e9af387a7ba1faae7a69474dd10ca50c1691bf1dd7ba3cf0335ae341701db62bdf231219296c30a991dc370994a08c9204c00c043ff685dd26dbf4298a005cb2352fbd453abf8303739e2731c1ea0406cfa434550a3b93c486a8563de78e8f02bb2ed5ddb358efd6ed39a7610ab2cd00a4c5f29323a0a6a7783a5f5d1e43f88bc428841b0b46bceee1f60e52c16f2e833b15c48736a62050db111808952fa12572f9a52c7f5c31f77fa8159fa95e1d0a10f9e2aa831d98c8d8d2d97d1aa768694de823e78db257ac05fba35708acea795adff54fdbbd9caa9329601abecd27a679b75c53fde5386ca188d83c02097b82064337e402f58df7c1ba86466fbf23392b3c055fae44d72e5c21acf8e281e087b1952be9500d93c6d0d415c4b1fbea5f31dad8064ab7cda41b8eb8052285e64fbfa6fa12db84230c47aa582905926135766e87b4722d8d78ac1affd2318b5b52d37faeb2ac6cc36095f8de3be2cb7a8dda78e6642efaa0bd3d8866509d622adec0d6c1b628f7ca3ac62cd898a5cf870557847c6ea326b4cf4081e2bff183b45cf2689d174562538e34325b07524fcc8cce4cec5fdd8d74c9605d62f93e8ebdb4be0944583dc1d6e2aeb74b6ae978643ae71342e9e1072d717881d2c1e488e87d8b31a38e3e77c37c5402851573ba66482f175f1327174469b7850428a026d8545e9e150e8c739309bb6867f5a26d637eab865a3d97ed91520aa9f8ea9eb1e80ab7c4d7f5a095dcc3eed11427b4a02b9bbb9d7a708290793421ebb69d827d3cf69bbc755d9b7d90320cdabe81a19479639af5d8926d99e9ecd999333e110f4622ca0cd1d003394dcf4547cddc0fbc157709590ea56f1a39e642d0232cd667535b2ee233025ec1846f80850747034bc1491e5fd7b09c3133c0b3a04393f788a5f63d67bd70f45cf446b07e91da3797b2e485fda1f60344558a7a24c5858bd753b422fd568ef37992782ed90b811e3250e1f61ff01b7ef8020e55d76544c5277befc6662c5605d3a02944d6e81cbec2133a9ef3b9a686ee4e3ab58e8ddb1a082af6d91a2686c59b041ad900ba1a1ba9e867b078c3086a5fe8938bc34bf2719610e9319b2692a9f3e6ada18b014ef59ffe8503ce28775d59ec62347bc9ef646f35c099350391354d454852dcbadf2da9f74ff890847c6ccc0f304061d18d3e9d5d1bcb7bcff2ff297c48cd3c2a9930b3d55aa49856c2696c98559990909d2d966407e2dae527a39074863b15186fba55d0c33fbb46ac4a1e596bc647552447e9fbf93e70fc89a88373d8a19d3c29ce4d980b8580e5bc199b8d1f166f60e88e766c1cdb658b93a82704be97e12532141a409ce9a1767118b77379c57b00b085dc643f84a849cf4dbb0b00442a8be01b1496ea5b6f21c43d2f85ef6265fc58ac2a29247cc8ffb3b333daeb386f42b816ba68fa3373691ded54143ccc8473d279a00574a3732f7ca0217d431907e7ada6237ef2e556b04ef999b41fb5d4acd9145a54152367fc86ee509fbf088dddf2c486fbbce8293f3e248046739346f891cb428328e5a161a3ce49fce92410044922346c480ae00523cbd86c2ebc962ee95c6dc4d36447ad88668e6fba64c41da002e371bcc83d7c9f3df5685cae0581272b923ca29878e19fe6f16cfa72ae1dd24dd88aa3704ddc26e2164214e4b9fdc6a494ca7986df01c2196bb6062d34e4c6b29988c2b68bdfd96840aa8d6998ce2058294614e0331ccd2e8e86e5205a55a69db78afa706de10a4c1766255f9a71effc0a29f7c49fad73067d6486fbcde0c88d15e54f3153ce8eccc76a1cac24ba2f710aa16e1f93a1a235e628940c05b6a4ebc53073b767de18b5aecf118afef486fa033b451f145d2c03ebdf47fd8a6a1a42d05d4c2e28c6edd9c0733fe8bbf0f7d1fd1710cdcfd34eb82f80f0b42e05b5d40ae7fe7823deaf5af004d8cb50d8ebbe9b465882c2fd0267c82edf7255df91653080e94d0da44f1919241ff187219d33e385ea43cb36da7e652b3b5b9a229c4c74eb7f1a3011e2cc2edb93fdb00bf7fafbb28d3b5e4d626b29cbac94ec19a772eb7e27dcc38d6309b5feff03bcce8907f6b9720b02f08a8456954cf7718c04461c44ead0c36679dd414eb34f03f29d10db68507ed1f5d08b3754b4974feddc85dd22968f283fc83ad2b4a7feae9e1522415c7f0f818df363b01c1dc9405c5bbab8257ede9dbf02e10736c14e88b293481620719a27378c3ae015357ece9e706a8b1dc8fbb5a2dfb373f63e84bc5393d42d21eee4b5be99e6fe6fef77746049ea781930ae07f924b745b83862b6da37133aca7b6745c46fb035129352a45a7566ef3a53d5ad265421521fdcde90d29849ba7ca321206aa343902ad0efda87ec812d39f512be76121dcce4cce858ee66c743d37de0007e8a63f3ab0fab3e87a90a03377a8d1f38ee93c2b7ec561594e62b43da5862d51e14106bb162a5b54c119e03cd16b46d90b1567f4d5f22e9f8505bfe26d5affad99ba842cc72254a57465819b3484cefb02ff4324d7418f6d5d50727da163e032f275183a4b2f4950843a35cf916a4810aad2580b0de2328d41f4ff8f224cc15626a226da66ccb21869166bfb00c144bcd5d2113aaea3a6652644648b4299440a4015babfb199cb8b89eb599a956eade5e79e86cf87e4c05dc753c749407ca82189741db092ab2cbea875cf4a60335f3b61809b630e5754513b4eafe32da1e9e02bf6dd322f64155c1c17819fa76cbd196d192a7a81ec50df7ba0bd91681aa065cd0511cd05be43bd1c790a508fb131f91d6b71545170cba29c6c69665e01d6866c24635cfb50c6d24f83368342ef09936e31309ba3ddc3542b40aa63cf3ac272ea028a9bcf50b89f8c9f4fd8fab27ecc296d5c313b8c925ede2ca17576e428323b4476252e4a13752d09bfa48b6c15e3df8a3beb91f9c5237fd9df890e5af4a30bb9322d09f193a0ecf40eac9c3654f5fe88e7fd702bfa8c2bf5afe1ecf212d1fa20e1bd6236d709e286f55bb244f3521ecedc94e4039523f55f49c428442ae8a72cb8a104ee227c161b6e48d38ff676d8b262f5476040e0b025d0853bbc9a88192b927fb1d0d770f74b06b1b76c46dcc9eaa6cbce637aba6a980d1313ea76183061f793fe3df6a2c7e5badffbef0cc2d4a7272a3d781000874000c6dedb13d8e65574b3a766b6553b72b93e3fe81c85220da7cb4627ae062f90db660cdbae98f22c173fdcfeab0214fb35383f197113e96a0d2342fefa2f75e297a92e8c65b971e2338862af1a34b2d1eda3b44559edf38ad0985c68d032c45a50ab146d73e106905515b086a56a2efdd0a59bf7f20010a8a6c08021080101a806cc40a5a5e343aee2824b13e7ed4fb4de0cf1398b32fc5a5fdb22e7730f36fabf13b2fb370c2f839f5d0fb6fd3682a98d458a311083ebe20f8476b3abe63c6f9782b1e3e21e6cfbf16dad7bc61747f79a13313874ceab8b619f97b9110d2d07eefe65d7dfd3c347980634fe855caf2796d865a3258abb0d109eab7029d8453cdba2d0b99585cd8757816da59704f028b688535d5a7105a49b6c4bcb38912965e064b485f8599c31808f6b13a16ac2546a24668a3f1a9fb26b14e0b1a3dcd0250192fbc1dfb33c48631ce125084c4fdc2770dc8ec6208997a1bbc99f14eb2bc3050c5177d3678f37011484d7cb8f8d81f8f14f1b9b5a559c210e858480f9ae76408ac7431e01e31317858d4676f2550ea4a5e59a4da03cb11f68fd7091a1489a2a391616171a6ca733254f8d731ca91c11819e3135b2010f54948a3853b966d55d8c8c993e8ec1ded1efcbcbdadcb0468ce3cb1dac35561ed369d3f6b655a92960c4cf4520d0b7fd5505248d7cf9825c5ea35d991db943bb42a867255341fa9a9381389353c6004df18f1c629bf2de786a0291830c7f1f6bce65e2654f7cdbb3c4dbbdc4e62f7417e53d9e8fb1b8ff0ec4a9804bc2ea029561324292767c2c92ee5d31a3d1273dae232ceefc3168036e35723f0cbacf7ebd0a879f9f7bc0e24c90def80706379272b9384682a8d58b6cf28bd17fdc0a04d9e14b3330275eb50a5a9f1ace136a98358f985d549853045e5c0bdd61cb9b01bff8226a46b98734d51dac928c3806b1ab4bafa245f658c33be6e0ff4103cbe7806dea0f7071ef60a877757fc64bdcf2ab4bde05e9fd9d2145ff576cf0b3dbb4b0c674588216bf5e381f506895967ce837263f94095a537b5972dfc5fb6de8d99ea8b8be00fb04fd83dcb2bda36e420f9d87e43e0c559b95605a6effac66372464ae2680c45c67ccd68996e21f080416ae45bd621de88893d537b4c70223a47f8419ed20cbb6a19a095f2122b5df8306b2e1e665a5300269f399ac20a10dfa85252a3c8b70a47e6c11391cfed49f06425f6f140524cf2f23450d975b62303b4f2b478848c83e879222654fcc5f7cb0a34499e3ced1800722da54aef809a9d7654ee0837c41423145a54d1d40d22719a9f659156e184f406493ff7e48a0e37f31dd968d990a1edccebda1f6b55e6f9e46646b5cdad66de43718de1eba0fe11d43cf38a6bf428ce5e79eb2332d6e50583c7baa349301190d3e53f4495f07a0966c47d800dba1e53c7da241287cc77f5f6cd38aef7f91e751ed918af8802a768c536d19fdb15654c380171303378b6fed33cdf61c1f526f61b0c3e9e0cac4bb88de5fb55108f35d3ae47d9f8914c3d883b7a80afd4c2875a38d166a98d78169c448330b8a07956ba52845c1145a82f19fbad4ac171d17940d5c449e7526bb9f7190928123cd98d8a78a8eefde90be4ff4597ac102432faa1752b334b05b7d52049aecc0acc9934bb486300a23f5aea60a754ec895f1ecbc1710a32e559b79d2754acb000ee648ae5c782425ce3dc26a22d85575a8b02016853c471e05f189507f4ab700a5177ca1d501bbd54eb93e5c9ee92f79f79fc5377edd7694bca346cc67a4c0baaee03354f57b8d57b065a1b8df0131cb7583b1b6aaf6f8ab37839006f328aa6b2e5f8bc8488e7f90307a4917b9a0f78cc8b2b2e68d41363dd29d0f890a84f3bdea1cdc0f47fd620059c90524dffbfe9d1d9c48fedd4aed0c5e0dfb4c81b91fe9f4d0b611d4793dab526423dfab0d530dee889fedda823ec9a7213a7323503da49125cb9d93b0dd4ce641bd815a9009c9cd769f32de500358b1fb01e023b54e09783820bbb25e2009f9bd9f8fa8bddc64cdc90180edbdad11ba15674c9c8097428fc49b59643b68a11c6c0ba00d2a8a3001a9b1e4352b31c639a57698a18a049302bc95f78024dc9b9e8457723735d60fca2f0b5934360236fcf1b17c044efb507a6c3d69b05659f538eb4a97eb34636f6053f6619ecde2aabefe6409051c7567b17cfafff93111130a7f84270d91a2c758085cf88ea878e70ed4ced7f3641c67eb2545f2c76024735a274d3521642f6582ef7003840e7f012350fd514b72fa66f59bf865084857c215644edb9e0e75143b1afe221b345982588049715eb0042126ad8ddc70428928f47ed79579855383c75ab7df7a11e9216e995b1171fc55031110852e893950457e423f3bc861686908a2af5c65edb2e5c5716d27f0dc175e89099c8f3289042e2a0c7b8dad546a5097bbb0ec5a4487a97106e3b1f2cc81f966cdadf47e9fdec40623634911a9ef493476c39b3b15a29312668574853ad0202c24cead2e186e39477695cbce98dbeff3d1086144404927296824b84b6b28886f9e7924bb64b550c174dac2f806f916e78619d0b9bed92928fc9319361dafed6f682a839ea049626a74dd3accb61b028968d5fd162684a6357d5b221360cd8adde9f6ec52b803aa2c9d2f9f2cdd1223ecfeb212bbae78329f07a586fcd016f75490fc943a755ef7aec1fd5dfacdabfd71e92ffb00e823afd7c7c33e9c32f7fe0253978f7b654063bc766a23b5848a6b91d151cb8c7af5d49d2142ea518e2ae2424ca8a90684d97cc6c13ebad034a043fbecfcfe529b5cf75b6139cc4e1f3fe90575c4b8d06c07f4cc465d02f074b610be717b1123fb24245fe30c411018e4838b2eebc7c65663494790e08424abdd84e9752b0e689dc6539b802bd2daaf9bb9a24a6f322add96b80f24e79d499340823cdf69f67faf66ddc92055941b9991377ba0118ea86257132e7f99325715bffa7242ecddfe8051b05bf16f8b21df98c78f25eeb125537534032ab0b0de1b9e4c94064172e37880f05893e818904435d045369fa78cd80c2ca56779b461348d44615ab44dab10bbf7fcbb8da1f3757901a39dc4dba0de65b4a3362ecb07e81623a2d7b05685e197169311433dbee448ba93e80b0d0580e5ed231a4fa78251fa02830a437df8e76c668e7cf8394c3fa838552e82c97be755536da9372165d7afbb2997931d736d5388a732edb5aa54774adb45aad60829ea0b56d897c9060af9e5763fab6f5f231c115fe5ede8a6fefb9669b8a9d6f92235528afe5be1c19592e317cde339bc2fe9f5b6b40f00495002320fadac0855ffdb593c1d459ffdca721f624ef1d47d3f4e3329269480274d1f7aec1c86c9bb65adf4a36b06e6cad4774e7a5c5636cc6e9b1fe5ebad9cb30f5afc8b31ec16dbda5e3808ec9f5a9ad1de5fe8cd9ba29b295ca25a341833b33e1c8745eb44e9fb910c438545777ec875fc7ccd2f79d62f947c82e3f2daac82bbab2ecfa4ed3f39129e1c4a0f91eab6bc8a7303ecf55eb666c0039a9b733fb1e6d7d6cb0a852a26bc160529223f78dcfb388d6a0ef4929321bb8b561c5cfa2cbdb04a23d500056f847f393040495b7270588f2f7477cc90ed91093910b093ea510c4b96891380d539e1c971de0d352475838f22f5e4d10c089edf27838a0ca092c700f88401b62a8e62a9578cab647d1dfd53b031a7602751983f7a852f444b6a50651753072fdebfb67a86e420034492eeb94531e86652e08063233c84ab3121def3794d54189b08c3d55705f0af6d4e664188fc6115e985240238afea4eb1e26b91a0f451427b401dc1cdc816fc7f769ad463900d85563fd950fbe0a51713873fa97673e702084b00bdcb4028ac0a5974259de8657ab5b5e0df66c28c2307896103b142e4024c6416df4e4cb1ad934a348ab4a94932e75d063b71e8557e3bfea407e774c434afbda9a418a5bf39ee37e82e9780a67f94cad916ba6ae63735873528318180a8e7a9d60b366f2a8a05a2b368fd36685d1546d88218e7ca99b585e0aa228eea2aa8a896c77ec2569c9a6678e441f6fc44c4da7b3c8eb805e711adcd0d0ab0bc64cba3134a046752d2911748f5e07ec796837ab7787fb533308826a397686a53411d731d341127bd62d7a469ade421859f4fac7d3a7dc3f79ae824b8280489aaf45b7f1b73aaf82900f6bdf0340b9443f242c389449efd6ffed88eb38de8547afd55f7fd59e8c064126d094fba943369f5477d963c36fcad0eead625393ad7b2f903e7e0d9e1bf43618bfae9d5ee9743c7aa7480120cd134ab8ded4125373a76a9348748e2b9ee43ffa54548ddd175aceaae045fd32b5e94c68a131c41fbaba16667d2fd7b7feff6aa5596fe79dc5ce615f045060e625b1c285173dc9a73b99f185d4f2d279723b8ca243b95be151197da9b8597377ad361bfb0a0d410919a6dd4a3286a25a8eefa296a93fe629d8eb688bae4794f99136a78d698a8df0933dfcb5d0324b6431d377597cf0d1e24d44be50da7b00153201b21d885449cdcef7e26995d4a94227a69e1eb7e1405d79d18c4e94b2c9ac9e2b23c7a94d58f3e81a6e4b314ceffd6f162e50d1e23b846049a3a0d3bafaea480a85ce017355cba563cdd96c99183affdfae9dfde777b66bf583c41a6d3a7ab41380ebfbd63ea9181f0c65f0cfa68dae9395a7bc11cfbd5f94f1799a501554c5a8a3226712753f9f5825a50620fd1c5f5723bb34c2191bccd6eacdb2c3a0368d6f8d0c5743d25f948b9a80c915dd3edcdff42ed57d2bf4f8aa477aa7327260ba52be9d409abb573f56be311b55d684f637590e52433bd3280664215d502120e5fbc3f5763f1bd5459233776a44ec8e0348510330d8f20a69fd03962fc18422034507b0e4c3d272985b72aa94f561c4841526c15e268b1c6b8d4be47ed3ed765da7b6843605b25b1ff3741a6146f6958698a46c0f61c10c205145ce2cf79480199c94d92feeadce8a9b8c34b8c87c6f807e81d3bd002fa4945d012c1b1c2e5dc9d45f52f64b139bb436339ae7a1c4e314142e0771c28e27bd6867a53cc222848e0d292c2e70d9bd5cb1d3f9624844fbe49fe02da09161a4bff2ab56d8f1c6c3e71f8d73e706a7636b9a0b88826fa8ca7b121c5e7fdca80e3fb7c1bf48dcc872655cc5c6f4176d3559e687b1244836a2d44eb70aeb1b54adbd771984ee7ff0b415b98d5d8957032751bae77226196c48068c4287703c0beb0c20adfb11462c82f9d400bcb9317564292ea9afddc9d177b9f8386dc2d2f9c69b02f3f1fa2e7531c6c60b03447f5b98447d049902ee5b53ce9a9f54830a216ddf576fd2e17b5db6132c64f30880468fca4877015f0a28ff55753b1c535c8170335445a27cf6d07cb3c939d3c0c3d679245dad437ffcfe59853eeed91fb83ee49a4f5649563ded657a3664d269e902951e38e9c417c40fd6720c7afa30007e00710d9f3a982ca771cf6fecd32d7596b86158c363becca480d3b80a8c0b7c24537bb607a2ce0fd4c1883f4da984b8d125fc814fd6561080a5b202ca652c4e2540e8a8d48cba462d61c5039c6865d5233e36de07f4c615b3483be1542df8ff8ff65f86d61a20215b138c2b2b140568b66f216cdbd5a9a0e3592e94faba56e4f168740aecc849ebf695bfb49f234bd649ddd63afdac719649d09dce8a0f647e39906217fae1dec1acc9585f76ef418a4da92509e1aa3cc7a0d9dcf8415f0f12ea3b248132168dd3128eee5692b7d2223d6f45cb809fda742309c1a19595340e46e4b677d561018260edff6ffef213acfe571496f5a3c6e67a350878e0a453a9b90feddc9cb50eb919028100fcf9d7776edabfbaf25accccb4bdfd10955bc9dfe43e1076a980aa40af6cca67b53a85e2c343e2e1992415b73e62ce5f216cb6d4cf77200d6cc4ff87e99236dcd4c7a0ec95c92431e005e6ab49304298176cf475524f34a6eb5df593cf841b844739ec60e7c3ffc2b6f581c473b06251131d82cf1e6e26b88e2df00cb4e5e0eaf2f17700b58c674cac2ab08f7342bda833b219a781c072dbda63369206ae069bd281f1d886807ed18fe386a9fde17b18774025f3c6cc9f97b7906c2a8620581e94b79957cabaab202f045905c60f8a1c78dbb74ea34ed95ae7a1f35f67f30c2caba2134f4bd32cb4bf81e2efb72e9fdb8e57a940be50df13d04f39eeab82a8f43461918f71c8d175b2a7fe098f39ad15b26b4a04aa863ce508e5796843465b81477cc56184a9905bb325b412b359510ba169ccc0e46dc4567734de9dbaa1deda791b90bd5adea2c7c7d4ff42024430778adc3eec32115992595793c6cca2774e42e714418a6d84cc868489db3d3c1d1c934cf9c2bcc43e0b1a7e85452bac1041531e5d9206f514609b98ac3c7d410cdf717128bd39d0ece6f4d377d6eace3f892d6f973659efd1183a3a9ecbdea46a6af922a53f1220d4347c8268a784a00f1933af4f9a0dc251b3dbb3758e77d3914a51ccebfd593b07f4140bb1e08c32ad367c193f5322699b121557c2b732e84a9caf5c77bdffb3c6366238c5d5dfe6f060ca8a3699086e1f6494b74b02f49caaeaa880029005a0552542b667320a05d90f37e3cd4d1d221cf2067b045b7255fa50ba776df1b0fffeaa0a046d09a8f13520ea7e1884c5fcc1d1c82817501649a30a6df415bf403f528d7cf5b127db1805fc2549947a3e8cca9890b0fdf25378d7d136eb44f0e2aa046cd56ffc7026f08d9c630f90b750c7e56b22b971e06911946620e613d4140249e6a2fb2c0dcfdfa0c96ee8955af10f1d19a06130103cb24871a5ea018373992df2b1246e544dcb5202fb9c580fd626f79781fd7e0b4d7492aefdd5508287a0b109fb376ded9dd58ffa47a18b066069d4084024e0b0995cb6b9177ab2467af0ce72ed0f9f1f591536a17f9a93e2e4a25751605b2b76be006d6e1cf48f0e39bca6d361f7f98d52776737a02cc7ca572683c953196585168037ad5458b62e41d8540c2987cecfbd2154afcefb36afee3dbc495bb451a9b0efb15ec2f172eca85463161d9fd4ac57098d2f3830a5f2ebb0daa012a443463fa44f5905b30b26fa9149f8d860fdbd80203c856845338e72a7c1ca48ce784e83bfc3474b20d42416ddf9be1c89c76bdf1f9cc39966795ed882a8f3a274a3426b0ec6a15b3d63a8cbb4aa27ba80548a56b0a3e924d9a54974f7a4fb7d00746d03fb458829569029f39e4946b8c627edf9e41fa4cffe11969212b4a0f35990a19be5c07356ed8afd41080de013502700a238124f0570b0d371f861f6af8d093f562734b68db1b2997f0b3e0c2ce1aec980b2a03523a73f8a065dffb8dd17515f0e8ac4d271a627f6cc649415650b309d89757dd63448d97424b0af68be878b6846efcad7779f10a6ea484ecd9ec3002895f0d96d65a68c81b7699af28b66cbaa528a102dd7bf423a3a4174dce46af6fa5e98aef0105e244dffea6d8f2f1e10bcd69cab32ff7b455479dac07dd402ad69f934c549722c48980aca5582322ae36befe26440926290affef1748b5eaef807e847ed68623a4407e8380efc4c706d0fe0d103803efd7a0ef719774d650e9fdf7dd9b71beb45427d2d6f150aff61d935bddc60b38d9af1530f7a0472ee220336e96da68b29687427f09a94fc47f9d7e078eb92a3df59870e0e02f32f53776a5d29c74bfabf82fd46e713fa7b4c3544668265a4db942102b2f127eaadb57af5981ed04f2c28e7d922f3b3998dc7867199d6e4cb32f4a22b5824f9c9c01067afb3277dbd0da0c7a4f43b1eec362d6ed77ac014cde31f06708ee9bd21b709e874705e345955a125aa86e2f74d5311cba9a78219ce7aae5e392975e5519971baecd602024bcaabf4ef37973d488486e0fe5ebc30c333636c5ca131faacd7bbeb465c49094e485c672608eaf903138b8736a4f4bff230ede9176c349bbeb932f27cd3e0a0d9f0a8d5157912db833b0312d4a1257c4bbd9b31c3cb80ad355cd2a4f62834aa552e5e047fdc23c878309c9c80f626789e998095931e9e6512047a45ab4d730b75a68c22053ed0d9a2a5edd4a9caa012b03f1e992b42dbf8964036401b56ebbe680b35997231548a8632d6f4702fffb3dedb575ff0aff2ecde771a8c529b67a9decf40ee476a90a3a2f3cee61f827344ae02f3547b1e696f1128e58a8c1fd7e077e433c0a35aa7216bee91a9277677c8c2bebb3cf42bed2fc45e0ce406437d209c01c3f1fc27b61acde25cfd7b40f1b2722e1a428d05913f5c4ae9bab05de704d060715a5e8bb298a68a2231d1b08702cd7a52420205dbab9daffb0505584a6a9f449d306475bf68368ab4cee06597c703a89f4ff4dafd8317403e7d781d586a5916eb6f814ddb0375ced7d51ef4650ab2c48108ddca1f01b01800de41a5297426a54bfe2415b0a9896ccc4f3b973b45e0b1a4fa59f430e8e67b17d03368690397a457dd06be64d0279ef4751923332827abf32e7582697d655bcd3944403541d78bd5e5487623004327b3a8d984b6b89e18f2ddbac928e87c55bbea7c797a9cbc681ae257b4e58658935fb1ff87deebc755884b420fc77949c523c59f505740290e17501d871b4331e5a28e8c00d875302a306e819e3c8b915cfac72d5ff52ef5162f5953355792959dd5d4be46e54f9c38cfe9fdcb71fad9b0a02eef0ddb5329134d313a087a4aa49e36ebfdedf2eec6a723d565ba092b87d4528a6f2ccb2cea6b0f3f7fafede9183b24ddfc42467e7cdd094a2b1299c81a6fe8b7f13a5574fa1b2090c559724ad90916e0a079716f0c720ae2a22184db917945a4192a2f9765ad12132c8822fb4173120bdf6d91baf67864c8b3805fb87b92832251b45f0452139a367b7bcd5f2cc071836d2fe2c2f982d71632e4bed7682611f7e91c58ba111ba9e36dbcc296580b8ced40a7670b0759492e765edbe1f33ddc004a413440fb301096e55983fbc58ab1b420e5023303d7aab8e6fab1206044626f38b60493fa0068eba6cb974621d3152416a07637eecef4ca3e1895e2e5f79b66fd353db4babeddba2320f9eeb529148b15b6849c24313b17beff15bbc7cdebfb9dd980edd6a246df52bbb9749065f4d81e7af3daaa209914bbabc5bd40dbdb753680140ee05175230b74cb8b6c30ef4862686d18a332b41255a29eb37e9eea2e5cecc8f29cf0605c55b0b0b9553e231089400c0adf629052c9856ced87b96cf06b7aab580554e5c156dd81d564d661e1a803ca185f8b8ee7364653f827e86c2734ce9e65912b7239be93363980ad87190a4c989584f3df6940a9d1b6f9bdc4f75cfbc21566714b2e4d51e61aafaaa2f9a4494db78d347b6e93ac0e03e9a92796b3bb25b0ee85eec95784b175eed0bc6d5b502f11d3b7cfdd78a7dcd3959804a8953ce623842988c1b7abe04df5bc4d6ee90ba24ef4d85e321770f1abb8f39729d881b875bbf2731e899349b7796878c7d727855261121e33293a5e5fdbcc57134b8efb2fe0eb31ec34702913eeaa377cc1fb135a9495a0a1667a88de6086fee22fe573fb4a1e11d66be6168709333cc516326512e2a515b6ca9b0ef7d31096eb490096b32e57ddbd73fa334eb539b8f1a5f45fffe2d7c85c124588b8e645058364df45013c6cad1e729434f90f1b37507ce459f33ef77fe4644279f2cb398945c286fb4fa2bc1b5e44d5cd69faa98f6f9b9f7ed7e8f6982922b1b332a2e26d6ea9c14b8a4c403e449ca832dea4406f21399e5d1d4c45feae6ed318a7f40667b3d96822e7a6efdeb88c04e80347e73aa3cc3c361b455f1b5b334c32a3d32528ef6ca28b5ac68338627065c0aca53af1ee66880252b822d59f8d099c122906e390d7821caf20d0375082e83d548bad0f6b4e424c576941bb50234ac06bd2afc2f4fb9354ca501e273002582293af82559821a65257604ac10a2d2cce3e39e9028a29cb2452cfcc1baf2868c3d32ca3919232caedfd4a3c13309751a6b4189cfabf442cc938064b6beb754dc11198ed29e5c5ad6625e0e0b8c37b37a2781dd45c936698d51f36029f93fc3fb88d8792f998c0cac930043db8d262e6347a15d94dd128fc2b2e50c79e7fd039f8cec35dcf3397ee44c9e21dff66b4daeedfb4e6b4a79b723b2e2c2cd721587b99a7d41274691be7c8b9f8144eeccb453954ca11f7cd70628e52f9cc7eb2ac6cbf51a338b4f3c868091df803c81ff81a9447c9ab0f7d4317ea1f9138dcf0852efe907cbd28516dfb6546f25324053c83b0d0ab9b1b4ee181c4a7882775fc708c8171f3854c4ff0c76e72b0b818bd232f3aeb8825946d793552b3a79029b471cbdbfdc7fbd764cbc59cccaf67ee5cbde869e6f44701bd62c4c604019b9c4a28426137eb55c857ef92304d3d24134ada35ebdda7512067f6bd16d7c1d1ea6e0ed8e27cc395c5131c06bbe8d5a94169eb7e80b7779beaeb1d552e545954107e2decf315840c30e97fe3ad177f487c8a04a355e5c1f9efd0e5974572c222a437b23e62339d2a38b58c7fd0c0892ca2c5bb198e798fce395ffb5911cfaffe8a55f23f7fc906596089081850c362e64bb6f69ce3296801bd32db9cd1edc6f0bdc03796f28e9e6ae92afc4cd390f0b2c94c34e3f76b28c97c1cbab9b16bb1c4d680a840ad05c3f40a2957ad8fa1d49c1940074ea55eeda292cadaf05edfd22317c9d48ea26b708ef6db48c9d8ed968ac138e9ef7373056b7f98505f27de10c360a084c63c82ac0f3bbc7a047f8ddd16dd063953158369f8ed48dc878cd1069fc2f7d001fc17f956db2000718769d7eac07328a2e24793fbb8dbda5f8b515928885ca65e72c544f54d07b3a6489f22202332396e37a02e15796e6e6aa7c9e9df6b8cc2a34194b6cd734e59cb608498e9b41bf5d23d63b9d6d15a412ccaccee1cc74d9a0e7e164757dfca4a642b75f44a1d88758db6a1b28afbdbbe28bc3a89f21c08e2a0c941b5cce308421f0bc6a62455120c4c0af0238ac5998c02fea7f42bfa239d01e39007f2d53e1ae7e48789f883098c5a0f5db3b39a51e109312f35780f526f532ecd428412127d2f7f5c7a9ca0df0635e557da30e9d86f1678781bb95d089c847393fe51bf3fbdb4121786cf46ed1d2f976a446ae230842aed51786812e6a4e43d90057abe8843f8c30f811065c6e49ef26e840c463b560b3b892204fa2cad1f9fd3c6c7a25dd4db956c2f5bed0d5a2b3d08225174a108af9415e70c61862f3b51596439a98087a66e4352cd7d70b4a8b9f98985de6fabf8cdeef8ec5a2e790ba3007bc716b72bd21b8962ca9d445abf4ab1272f3194aa397e0e57e790e44cd6b16cdeb987b948532924727fd1eb25a3cec752a175c599c1e60af1aba977c25118bcf67d242b682a646d03e50fd2ebe5ea61a627603432833cafe52d6f07e1a6f45e48216bd057c25d57661af31e3dc27a018f156a273b45aca344c665ca3660b46a281a37f29dd34cf09ade186e3bcee512393adec99e1a6eb27fd4eef5a561b3a6bb2b7d6b96fd48c35aae4301f65a03548fc33d92a5ff035c618028852604a91fd31c3bf5953942cdf511c05649c84b7aca3aac5e1bf74768f926834b415eff60d5c12307b81e4ad49c22b4a9c6f0c6164504121074a1dd20a202fb877762c313f1484bb39ef5c134e705477198a5d2a42548836c9f6585fe629b287a4125b668c91d3571aa689ac66c40c20b5a5518192a0b1a458baab89c5ae738f9592b22770b647042549b23080aec0ff3f08ccb2cd85eabb18c305f06ed0fd29bdb0c7933bbe0947e709e056076126f9980ca51d6e172102d66b8fad996cbac4b70bcae218abbcbe9336e48c5c0154a6e0dcf3452e28c5018ad24ba6110614b851d24ff609673b176a62647e168be9db8c688672c2e3494e4e0553cf7d9c4ede27181a5e670264855a459b20d0f62e4be811ca87cb8681e58a21f892174f1e3b8d3fc51377cac1a6995ee6c86f5286bdf28e8266181261b13680c82a24b6c7b5047d9306ef4606dda5a1b2b8d016b585aaff23985c5d18cd9a9e03bef061c4906b0a044ac990f090bd037e86559307bf0d3b5be515b6f0b8aa4f4e582a9de1fe040f35d542c8afc5823b1ef4ecc612fa3c25e1226064fd4e2b9f88475dc3fa7058ac737ca85dc17808b649a2aefcc60c0b00bb7fe6f0794fd285f8afd029d8f0e23ea5fb9b34afc4bf5957d2b36c0b5d6ddfe2f17188e9c2bdb3d183c38002e1d18e3bd4723fa6c70be85bd26e3eb7131da6b1ec2ff3954b019f1dde9cca69d50d1d9b7469f210b1f0f9740756f426a194cdb0f7a3339470e539eda0443c490f6071615dde096f6b3ff573e3ca7861408b5dea735a75d13ca8bd5852249668960cfaff101c575071615a1f27942c93e261f0eec5ad3fa7c4e925999292be2222b1da928afda55cf34aeee8b641f8a1144a5ccc5da6c8aa23c7c937530965fdff1da838d11f7d484384b544ad53ec54ba544be0eeb27bd5987dbbde0137e10b907f7aa987f331f736638770cb509055f5bc60dc618e66bc15771d88efff8c9c6037c26e4216aeff0d2b341f48c6ec00c820ff0c8e69b83b81d59648f2f043f0b48a70e70535a1446e3c7c9f5caaccd3f98fe95ea65ec8ece3d9e7b8e836fbb1e7a44bc8d3133a1550287515f97bcaec4538056066d8a1533e00db804357404bd926fe7f193c7b41b8fd0a944c1683383aec9dd0476cc62a2c7010965da2cc016a8c44df0ab4741a3c1a52f8dd45b30795a531f02be86b851e9cfff65ee5495fde3aeae4d82a24a375eacd7a71cbac5299b552179cf89cc48d325a5418a7f8964014ffe2aaa2234f12c3e10614fc5fa4b9da994c05ca75c78ef29b3147a32fa4da90b7225702c793ccd4d68daf326b85e60bc28557109b400718933bdd62081418db176c5bd759040b7096682f592bb94b889b70d15a051a80c41800329bfb8b41c59d3c4f02494b60cf77584f2899871d6dccdfcd60fe0839d6a5d604b41358b6ec2f6a71501937d3eb250e70e8c19483a64abfc2a2624dbb63e2c81586417cd0487452c2ff059238a6eaa451ec44cdc2180c7a03f07ec146c19dbccc5e1e68f2ff5402f54630a3c5be17a2c75bc2039b301b3defc3efc291abfe98d6db6cb1227583a0f7abaa903543d4c9de3fb040b6f064a71f81cdbca5e389b4da240c135065138887007fea831b91ee6299cebfc03645181c726c72153a6bbc9ba9a6f8c7c5850475b6aa0a9f1eea1288a64977ae17646cf8c109851116d98e3f4f7e9ed2f3f5d8ef319eb333ccef576c09dcbd0f89c648166f17bca0aca799feae2a9689da6f5a956637d5036b8522a9b9923a7ad360539b00aa79ce1f1d237325b348bbede44258bb2f8b1b7119c174133c9620645e89c8fdc8e5d5a6a88fb4f5c3a8b5f050929071ba99de3634b97fc535732b655badd7f5f0ba5ed1adee9665145256f20d3a92f31a87f9bfe96c0a09307c438f7f52c7a10445022bf1068082ba37f6636beca13e57731851b118a9fd662c5e0a5a41633a68464a95ba241b97cef5d6aabeacba3d5e4e18d1fda18ef1b1bc23dc4226a3b86d32c84ca56a883012b6ac8196180bbccd3a347a55b9fc6bded44686ef8ac416bbd03b1b9b154f70212e5977f60d804f527497928abd372d220beccddb0108a7ae7ff7813eee21e4fef72c15171e6d73d13b4541d7a6838ab9394c5ac8412c35e7db7e81663b7a3384153ddb2ec4a67558180faf5691a02cbc15c03968f85fc4fff191537c6d5f77e8ce36e013d75322685e845fba008dfb2dd8771175bf0f9964106c9b7c04288a820c134a68a7796924e6aba6e6751864cc2a1943cc1f0925b79bcfd2c2cf76760e0072cfb2107e7d3ea41c349de9381c3c263665674674188c4d5bb7d4efdb8892d986564ce342edd93f18c28837e893a1f80c5bd0ee0a9e42d2005bf018b3448eadcc5364d94c6b7ae4e1f609029b5e191e9003186103f2df0603f6ba4da24702fef16080d24cd1a59ac5fda327b93f5c7e8cead87770e562da363adcba4feb630c51a839ff8d2539481e7f4f076afa835c69fc90d01886ecf70c70a46b4f1301c75feb4f6e5e2f126acf82c9f12e806af04e25290962db5c43899a77d0b8d6a7193bd3021297c47c067bf744bf6a1bd9e807e86f5b871499149ce57a72683cb710067fcdd75889d46bad7ec5463ccd75e45ae85fe6d4217da3289d0d9331ce1c9926f7f7ba335609c11d5b559105e79d9cf461b3cd2583440e37ae934561a8c2a7ee40bd630a064120a6c4648a11edea0d0054a8521363f51979bed301492bf4f458e81729bbd53102c3cafb6cb13837c8ccc0006c1c297f1cdcf38a535cc84f767cd99870db4535eda39df6c9c92352aa70c3da0355c6db5215250884cf1bc144058e699eeeb95eaeae2775cfefe23fe35e2716774e5af0011b31ed56b2aaff1e6ccdce673f124445bc8dfb04439e157097e1f3f97bc26aff6bb015418cd9476ace0c832d4a18e3dc35e293cdef1bfde508be814db448836a0950b23b77bd9413e0c5114813436668a133cad7086f93593612a81ab62adbe7d4f07ff78b4cd7f88f71edb685e25d33c800012f68fae51bad93a5cb412949a6283b969dad2647ec8c729a6ffae5b14034a28936b09c6e8c8180455c465adb4535a3e1165e9a3429cfa7b406dd86016801b5a0b1027562d242cde2fc14bfb440d20d99d573fed25c00b86fdf767d5d7753b4e05b4a05acec2be60f97c998b3a6aea27e6be940eae22da331a82243c1538f7d264d6dd1962b0c499c9bf9d2c4a2aec9b4dd7cccee9dc91c9044e0ffbc5c12bf699ed2d28f80b0cfef6d82bcb0fe543b61ac72bad344dbc023a86243219114f25d72cad332ac3500c32e33a64655b78d5173a4afb8bbe06b01f420f3fee36ed0095457d9de9de0d671650c04966232ec44a734782262c0a196d90c56e9b61961a0c37de2f7300773ebc701706c069efddb84b3ae8937e0a78ca3360b35646415fe38fa64308c0b8ae17e9bb5c03b12d72527efd2f2ca3602793c3901115aa38ee7947df0d3bfe474f893ee830322134be25b7d85c763c504f75849d13689e34781256836f60a2f5eb63da12f558b65dac6539610549743460c354b90ac2f2efec8b4c6ef0a07caa9e1240b402d46cbcfcc5e5394aee696de938c33fdb4b84370460abf921eacb3ee7f2d05cce6f360a19ff80b6681b4c583c7b8d13c99c8c191214607323f6ec9af489bcbcc196d5be57c4ca58071c54e4e6f6ad906cd3deec8e789e0e1af588c3170c5bde50c21565c538c093c0d98c6f5084790fe65f82539cb8ec898a819e14f986c0ad5dc6c7ec1087dcc6e939d4b9cff8407f656f59e7fc72e159f29ef09209b9de142fbd359c7f6882bb6b105fc24909defd74ea2102881b237ad6ea29d885cdba8a20a769869ac985aa7598b4bd1e98b62ba1f18115c091b9ddefac8259d295f9faf5350f7d3f5276f80e43ef803d2b35c167f10fe37e4e4ae254e3bb23985a96fb74953353849100b8eb7f230eadbc98dc9f8132de4da07c7d5eb835edc06b3c2c315246e79f486bcc02a5b06af8332755c244fb8f005f64743c4d56f43f291808c6620592d5929b83f92650f103646d76428a5214f5f9c635be70e881951ce3dce230ebfb755038a920cf13615cb5e53e165f82a0d28bf366b42d7012986de1793feef26eb1fdb60702a32766aae9696cba13e025caa3e740e11c4572c3f7b0a90c3c82894e31c0430ed26faf752320b993c40e92c567acb44e62318031bd1f242d96614680af9f88e3a7c64512afa9b4d2df1c17c519892a80f3d321d2d1f8882f5f53841583af3e07d4a970e2b2b42d2c6d353c0721d7dcbebf98e865319bdf173de289aff3054a68fc4be5865e8cba9568a7e009dd3d80071086476ed8bfd1badfe4c24382c32bfebb1a301aeddb70954de1d4c9dbd1bdab8228250fc30840d600809af90686cae00ee76e7d6647321c970aa877eb85d14b26224d945e355188460704c85e2c992272ddc1098d3f12132419dc0a6f9fc17917233a2eafb073a730f1dcd4242bed3564af01d88ca17aa08f49fcc0ce4cfc86ba337c90e731307710b0325abddc7bb1cc7e670d83bb15e0f7baff02a36a5b40b69b2f8cd9c7b32b5647f15b5dc683aa29b14b83d12d1568ba39d2497ff19b15ac464ca977dce2945b9eb416f41749ef1dea511d003f479a3f88d080ea09f29d4291ab387e9018e8d7ab953719853edc8c2b4daed6083d769f6f07c7d46e82c7f53bfacc8b1cc0137b6fe9939f2f7e84a4775ab7ac39258e0a0daf9170d74e6c3f3c9c90e56a4d8033ce2c4f7335f88993ca0a24c8d42feecb35c7b5b1b4687761d7171a3deda275c00b32f9e6fb3eba5acd553afb313a9da58e4de220034321b3cc1f518352c305c11c2ebf1f96f986c462eb5e027952d6a832de4f357653bfe535f032a59d0bbfcea2969909c99ad35525624d3fcc28e152a8ce391bf2c6c6818ea36adf43b35b165e5683c5bf50013429ae5a2e7c5456e5f10c4413332b008a2cd8e677f813681d754cd5e3ec13dbb03aa3088b61041e41764ba3e7600b1f8b5ce9ed9166686de05f5c7928fdf849bd0a9b72aa0f46302249a5ab939416db0af414e47f523f6f7613b63547ef132ba67c456685cf6a98c90dca0cdc9e68dc328c4aa8ec3e2ba7104290e06b2a92ef53e30cb24afc5f22ebac8273fd0f192bc13f6b50a980e7abe55e5f935ca43d4863944189866714e9c1a82c8bd586360383df92d672efb7cf402df9d72d10fdadcebbbbe4ea0f6ec8b72743adcb5fb14c31369f3210dfc8d6b4c5e19e63e56b37a5a8b5750a0f7f16c2818ff0cbbbf9e92581bf655b0f3df8276a4a7903596f1ae8826307fb7978f9aec6bb298bab4f8ede3cac45349f70544c7aee8ee49f928b7a7f597776aaf68b254247e410b429e7d936bd35ec65089ccc2aa86c56ad2273ebbfcecbd752d913dd65f62a5b947d7bf63db3bcf608053569fe392dcecdcaaa10031e09ed45e5769d6f8c3b92e128e570238d8a3c641621c0b331156bc7e85ee4dfe4ca05da896c5e557375130d814f647c421dd6b794963c0e49309cd13ab6ea0abf7d2baaeec32f733bd39988a6a5298dc31c31bfa0e78af17a87cda158dd2b78e7bb9ff12b91c2c9d67c555098c1b71c79651116bc2d1312704d885402f94b78453a1d97e82f1ad413b940be527c51bcb81d108bf94c3a9ee5c04b19a38e933a4f6fbad24a4e0690ff184ef095f18e0c3ecf87fa34097b37493fb8794bb07036406159be797350dd8373fdcca70f39be4d8bec3aaa1b9b58be42f80e0fb8a82fbf1ee8193bdb15e21e243b0de385fb22048a916a15d04554eb214b81f54bc04ac6e290899718687d6af490756bd3bb55cc6d0e530068d54fdde6243a6170026c33daa82bc736a7c77259ef557656da3a865c5de70b0c65639801719ff63c18547f64c93ce4c58243186f52dfff9556088e8f3299f048f0ed69bee21fda64aca7d92b344c1a7f921a4e90a31747bc110165bdfdc0d9eb0266470cd3614b5d003d9f45a1409327629548bf7dbc556696857112a445709731d17797932d337dd9cad8ec42525dee7b35001c80184d3d03949a99816571a809877627bc3dbc341d86d0ac9c659ac676b5428ed5850ecdaebe140fa8cc4760bf15d886aad4676ee336acd467289a26909c14826a4c0cd07886e8bba864c10b8e551038bd22d62547377320790a55bcddfc15eec7756d1faf95edeff7d651c152e9eda95c7a4bf3a511e8c97556f26556977ac193cb3a072591b94a06757905c2a6ae0d9cc817312b01e27c275eb309a99cf45dc748678ad52b872b05a465e82d98a913cec8506781ad3c74235219500a9a3b8bc5f4ee3a1e4070d0a833186dcba224116011573d956451f63eaccf12e3c6a4651c21fba6dfecd830aeb25ef97649ea884b0f8a8ccbcca14473e6717c659967544b1aa2108c16ef9c7f0d90517bfdd36432c8fcaccb806393ce1eeb5e5bb558911da71be13cfb83df90b949f6a64d57656816f9047407759dba413d0ca941e20aeb3e131f59a81b835a32cd8233f4c66e5fc4fc8a79ad8ce8d378ad52e342e91297ad599b80b29901d996aad6efef50c9854871a2d160193f4849efaffc8e8750395f7b12ddc613a6697b74e8d72f53d8101da5cd4a54f36d4d924c05704a9da68745745772018e9ed8bd476b930d0f9f92c7dc3abfce9e802a47b9ddafef0684611bc7e1557ad82b34ea3f627f4b8941c4b457616add2d40368f1be7bf28d03a18b583b6f07fef42891776b11712b99d6c89429152e57fb96f17ed56ac10ef48c6fca8922eb191db4c23f44e1ca63906a4d2786a5b4957007ba4c75ce00dd72d1f798e654bb936ea0ec54d2b5acdc95d8a3f8c55f516ecb1496faa99158f025ccd5a3f65e976b5799f3dd22d84a1b46829b0882d154ed55931b8e48a82715503c1a9f97b4f3482ac9959372ae55b1e09739b7c9336ef5fbfcb68bf31c90fb4fce181fa2ede8cd3e83357923a702086dc2a1352eb88d3935b1269f21f045cb3c9f9c6fc6e746ea9989869eb9fdd5067bf72af4ba291ca235c28b645c1dfd22a709bc4499f047d9c46b54ce020aa3a9ecb0b54ad95dba6e2dabcc653b63fe19c77fa368f9e9207588b33b85f9d3285697fd218c3e89295f685ccb6120d600de157504424b108c5c1f799d57194040f08fe83ce748b3d9d0b646b8b1fb9a353ab9548b2cd34bca40309ae93be2a051d3dff8ee4e6673fba5646eb5f63e6b32556d3e9d8036bb55c5996de9c0852e93dfe79181c91717f44291b99387ed41569b23e8e09789fe3e4b36df18a5e9518a42d9c5a77d0973299abeceba15f281e70cd5061c162345ed134b68340c37a60d719115d2d0197eb90fe09170f1b4fdb36e53581b1ddeca62c47aed61f90c547ac152854fe2c76f746d48e5be18148038c8952026d1dd6469f135bc54ff323624696106f3235480ee68088d82ba41df978c5f47bf2f497b72d77de5a8c531c6c7a023b6d5f3392f1c962ef5de45d17ae5521f062105b55dbdae4a4679a2c29fc0825f8696f79ea9d8ef454ff10c83200696bc7a3bc235b29e0c97db473518469109d3cbcd0dd188775dce184168d911fceb6fb436f44da25673fe8f8a510760ba8af0750200cd34f33190c8e9a7f46b83814a826d5dd4cfdb21b1e3404598734ad958bc5604de993055cda5f2d36dd10d8c7457347bc8ca022c6dba73cf3233dcb99ea21e992c80d7f9316a09ac8e3dc02835b3928ea3716ec3f71ece138114b1a8d549d77e20d5777afcddb5c7a8c0c5d903a02d5707fd1afd9d8b962c4f9e1cd22d852843eb6fb7aef12b30dbeef7e30d192e1b8f7c7dcb0a4ff10e6b90b5afa700ef6e4e1fc9b7cff254711c9dd04597bb31507bed87f516311f38df4ba87cf2c57ca3c619a0edf3d7f1e04efc5750fdf04fe9cec670832bb16e249ac8788f41d67a917069fbaba659759581fa2b0a10f78b926b857befb2eb2570ebb9a2295a4c002648733d0fb9aa89f35541c74bbc36944160fdf15f38f4e1f4dae35150f1f97c71d313d087a31693af164272bf145f4fc54a9d80fdb9a98a4f3325655deba242f25d70ff47702714de1979eddfd83bc2ecc0d42a052c480f704127fd0651a85793ef16bf5b6feae9951c32bf36ee52bec8dc22001",0],["0x0a8a6c08021080101a806cc3319b5df1c8ca5bd9148831a54a296ee8692e8e2bcfb697aa49d031f4e1e74b3f4893e30eda0d44ce2fe9d902cab4e837782e18d4c7807c52fedfe4bc02605c6b0dff0af05efadd364c794527fd8ce044a42650a13242b3f80e96ac2861167c7264ca220185834ef71bbba7bf2850aa2ed72b2345672d7f29a39634b1f3e4eb9f055b7992d84e0feb2afed0b9dbdbae3bcf433bc4ee39df235600bbfab6d6803a67f434b7dda4947c4e174144e03e74714ecb64745c03d21a0a5aebdfa0fe2e2a07ffadf5344d1eb15e7001e57463e4dcd38ac2d6c3427301602980a17e1717f48f6b915033011afad2b8e1abab98d3245eb218b3eb6d3afa072a767c8f51795ca2506496cf9c058d121e88ad720e57d8af7449b4a66ad3e89f2f05f592fd9c1dcbfa85b336e51324f5ecddd0c78b486528616485db1f1f3849dc768b1cf7c219c7d6123ff5c48c3e0a96d94f34ca32e11a2d05be1542b3ac9d2cf59718108676e97ed353846bcc81ab7af14289ce7f11029113919468f000455440743cd16504aeb0d87c4a8dae61a179230ff30145bf414dac12e81604796158b2fc0bab52583a5ad52c47270977f156b37f175b6b91de7441b594dc174c41c6d47403f4f94baea74a9f7782aa92eecdbe3231cf3a98b995466d0fc327e53356dd13b7cd4ac2f7811c468951b82bf2c1b50e6c6a6d050a1c374235b9d5584d2530c06203196b0b8c2954755b02466b1c8fe71f2fb9af57f3b514c9ef2c5d96031eaad2d1314da681fba9f7eb3e545f0d6e28efa084219277783941305fecaa6d9b7d3f3d93c6e02d53d955ec1f07b7af95b139734515c88eff9529b9dd9a9c82694cdd0885b4007ee0992cf8fd100d148721cdc9af10fc6347dac93c5cb1de5b7abf20ae513eec43e03d8ed218a38e088914b58bb69267bb5b7e494623a84f0da7ff2810b3efbe8367d5235e0471ac32287b6803709fc686a1ca118a79b9e6b65586c328e33fb0d52de785c8a6f1dc56f11a90b01cb678078fdb7c0890179ac44670ab80a3a6cc6ce0415c2647099d6034fa22effb5e73fa66ba0982b849de898ba4f5cd5c19f508457f8b28b382a60dfbab22746896d71072a9e70462d29930290c38900175323c285232527b84e6793fa98ad2dcea9daf9021f09ffb6f824a16d9e96333a257a3aa666d98aa2cb589e9b18acd62839f736fb123f82a5d6b388f6044e8781166013cd47b2ba4fe8a301bf3e3a831f6f0a07c88f6c309ad90e5012c0bac243455954db06f9f698093281b04d930477ff3d50001c0bf677beee1be64a807379b3f91f5977a6a7de504c9cfea5dbc8d5188b98ec7bf50f38d8e2fc1ba6de9ab7ddbd18b419df3e1834505e564838cd761947366a20120b2bc993cc6ef457b3b1d78b2fcdcb29b1f8569fb714fa18e1f59761838b94a6a6829db2336990aaf241bd2aaec0c1081eb36161f4d644ea64b6f6d7905fc9b4783348183696e178dabc74fad0166669675645b41dc2a9927415d29b81c19eea3cf021c183e398750f76aab4bc07c97ece5130ecd53100308bf35e7688b5563153a8002feefe82a63eb540b23903c4817fad40826116f5277dde3c855e10fde07a9a54d45c9f854f94b9234efa1b020167d52542fed897960078d55942273134be864c5c97bc1035e1abd4d138bb3e12664fb0ec014185e2f4f8c4b6c2e1ab33cd935340340db53bb03562f8c9b10c8640fc0e3e8ea08f7954d529ba61907c20ecb3befdbccd522c1cdd75b15f2c9fa560f44f90a57566ae86a9c5513366d59e7ffe0aa1de399b4148c12734b2317038a25b6e8a72f21f782fec51f24d16894f308d5367e595131bb5f73cf501b3345bad54a42e06e078a1693c063e48139d3939d1839e7560c3f55e5d8ac78760df9f0bb1bfecf8c51e611a6ba833815e38760225161a6309c5359e8f1b7ed9d707007b17d1a870ba7ac25e0cbc12923883214829fac999bd56077bc48e20e20cf23b759ddc125e58a67cac34b3c01ab2ce905195d166e5429f69eb4402d809d05cf596ecb9d0d4f20bcb133bba0fbb704311cdb68317eebbdcde8cd80ec6ba20774e1b6d0e8d2b0ed6c9964d9f1e65dac2bd74a89f4a4dccc9e91920549f1b87fcfd33c24c4e2d8ff7ae59287160372b14f2e8bcc8ae410cf3be2c18149df686333217025f62b53a2df0dc6c573e1c07c5030726cbe7c78405afcf91567efffc066d4f2d76b81e8e824e69bb58192f402c1ba0bdfc632f5907daef4e7340627e26cf371918596897e1ec51f4568dfe9ed6406cbcd812847b4edcb8a1ff69015735bf4bcac011f8e5a62c85ac6be97b5b91a1314f1d37eab0e8e61dc24a155b41306272eebc4da8df6e2856a74edb692984b94af223e57dbd8eb7f23ada0498d9aed26ed0770c7be86a7320d7a534477b3b5c7e64e2229e79fbfb4072f68706fc47ca0ff4e138a7982349d0bba1232f98f39f28469470c4e0e95883178e595dcd06414006e200714baab0e5925af9d1c3313514d375280a4b0fc402220dda8621e4ff4e173142b113e40547a3598edd7ed60b72bdd22d62fdbcf5e4113016687c9d1af01e2fbb6aa0daf2cfd13abf7d36075caa2056c83d39e7c34d2f89a433a326ab01ff27953f865919be6866361991335b9f68e597d2b5bf1b732a38afcb33cc6933b32433f9cc72c7d0a9319fe55a531e744213037b3453e0444a50c36b89b699abd3d5951568d2432671310ac2960f06aca48497880546a6e3f0b4f3dd3a78cbc5c6465eb5b12a791de1b8a27e4c49f2c1c923e0eeaab94de3210ac4dfb67697a365740da550aab8704fe638a9a00c1f0427c80309c3d80956616fd36d8df1b5f98987d23cb79296247795a46b6c259adcf8fe6013f76dfa48137282e45cd102de060597c6ba5cdd64ed78c4eb5935197193ab2831504b64642ffabf1718950ab124282a4cc06bc9a2e84d52c5eb6895d5987d0b4ade4c31797591411eeb2c4e30b74ddd851ba2ef8345893efd5a146e40ecd7619e4292349a8814d0438b662fde8c3130c121928620ac5c5babc74014bda986aac4474fc5c983af422596fd88763ee485992a33708eb48ca57253ce1620447a88497d7d570eff72d1d4cb46005202cf5f6c0d477ff9ad8f8eb8e1537ce1f5a6e8d080b3b28183f8cc82f5c7a9069d578a99095da6e79080a81ed27526ee8c3614273d9050c28ebe27f31623003dfef51776e3078a2d2f7f353585a367c50cc931114ff87797c65d35c943ddb9f04643b5b079ec0767c06eb43846f4cab0095291b847fe18c4615d21d7267d0b2a8ddba6bab7515fc6aeadac8e930abc6820f5e1fa3182f725182c5b59bed3c47eac7e27db39790fee88fece2327dea6dc1887e415706b4f1ce5420bc062c0314dfc66ce3a3234a90dca4c71bfc06189edba318e23b189d4499518e7d9f8aface33cb6a9e0c45505bc3da9700740bbac0158a55caf35b93310aefbe2ca2b1d0416a4d55592ed068e65d364cf80674d6c6ffb79d6247c4914b0ae34400ec3def61b3f7d5416600fc985b6f318a1f183f5a5f14c09ccc6791661fcf477a75fc0ad9c80aef45dea6f5068f09d23ea72db5934cfca4c7ce5a230aabba563805bba4d4c27d4ea117d51d4df8d28804b1a837306ac84a460f4b8c2bb5648751f474db64b1326dc5e1c0631aed12a48249f3092cc1f88595088fa9218165eabf6e7b31c0eaac37cc005d7eef284c9957d17b14a4e41719eee641147308b2dc032b0c0ced5d67a9326d5d039ecf3a62dbda07b4ab0d6cc201e17debf69b642bf06729b25138c2745bb200854ced5758d883fe127e918bd2af2da5e899bbf83bb3a42b350befc9b1b1b25daa05c7382046e23e4a658b7fac99b0729614c60396e3ce848ce06eb4f77f0a7e6cb4124a451eaf2848b5e7f2616c3504d1c5c714802375340c910b902dbd7757f80a5825ccf8466fb15c8d85897d4d048aba1cc48ecce90ce9ac9c87ce7daed5bed8f6c79975f347a638c83a67784be7cd0fd64b95574f1189d608ab3f5728e0ea3eb70c29293f51d4b1d4498827b7fb6f968780b03a590335435dd11cac8fad110ad11dabb4afa40bd9632b279a233d3363ce05f09abf86b64f99e8eaded1e4c131dee8c05689749874766768891cc86aa3f8bb9ed5fceb4bc3701c7cc439a8a3ca92204f4f7534b87ba1197da6c7f009e2a1bd0af09c12cf91024fb2c798ce2e4a2b4fa6c60735245155f5496eec6ee836f94a5102e5a74e1c059287c7ae34a0b3a917224ce7b2e596c43475f6f7ae2302239c3bfad1802fec29300df28132e38222ea0609ab3526515fadfafeb8019e6fcd798143a37cdf1bdb434c4b8e5cee91e01d2080d5d12f8ac6ad2a3a421732fde139cbbab219cac320d63d02a011af806e68362fea72bff4fb11be197b022862a4e48bcf6e8d7a745afae69b96b8643fdb3b3db821697f77ea350c08043631a4c65a81b5352669216e5a44fd3a0d0ee1e427d41a99b7d1e0cc5c5919f92c7a9d6966f6f158a40076b8290b22c783b0b245b961d2dfe7d176522680b35092d7d2c8779e452c00f6bffe788033087a1730b7a47910dcdd60fcc57ce750cf925cc5d9c7056786b1361b35aa60ec081b4730fa9746babdfbb2640cc4bc98a157a4ae8d6b20d74bf68f17d08b6deaea4d715dc1a74a2cc4ca8031ca6922f1e434e09c52bfb97e9a66e53103180fe4bbf51a4126e180c3ac0a82c16c5cf02356f39db877035edd05d4afe759ab267c2e8869aae4c11530bfcbfc6b0974a14232e73d920a0c11bf3bd452835193d1b4084566e03bbd13da2c01db06d79b7407b10b2a91435671bd59f4a59b9baa4b7213310ab6343020c91dd0cb9f70b0919bf35a4a2caedf95248e73f2dc1ac6765d825f2d53a827c0165316ab4ab1d124ef785118b5527ddfb12b806669dc34d78547868674c4f6d8f744ceae5ec28c19be281acc842b8d26b2fadfaec839e8d9d92b034d0193e4ccf373868c5d16a7bebdaebe8c31929c8ad936d74ec5a0425bdfa507cdccf57514515ed5503fc4b707cfbc0336a5f70745640f70a39c1e98a29959a873bc90afcf6e172a6e2bcbea716293f66933b9640b864871b370d5121624c4991545d801b045904cc61022ed99c70619984fe8cb370912e302df6c01f935f13c2202ee4c3422830746f1387d9e898929d5097a53ca0ddd804120ba0195993343d70ac5db85ad93844f8a9a3e6968a27d48808a4948e74909ad4b47ec17be53364532b213a741529be98b2e861709ac8e425885de58e189331da7277d2958b1d6b76e7255bd69f8ec9dadbb8a167a31d393d9bcf5517aa90eab46b1716df454981bd95e958058747c6099078da94d7914ed6e82ce90e96a9e01bdc0110ed13cea1b58e095145289096698838d776187b754930ced4d08aef8af96829696a02b40b7c5689da27b64831024c80821a5ffe42d78ae2103ca76ce5438a264e5ca5a94f8a7308c2c3df7949b6af653f93b9ce2bce99c1f43b1a9237a680dc971f6590b2c4d4821616638bb35acaa18ad0d1534110a8eeb9fcc91e77b5dd65118384297916312f75447e5e1549057bbca2a485d12235f2e3c477e0ad23d6603c617a003f363be94cd8d99e0d00b3bbb519728383f0def22f1f77cf62c42a4dd582b7fb254bb8f342c1129f546f02bb3e614d21a121e626c285e5e995010c6bd51d252627d2fefb0b2c7399f0bdd2ab1543bed32d558fb570b133885bd1712cdef582035b2f97f7a5f6e985af60e4a5b430f0cbbaf51c66bb0ec901c7ca04f87501895a065dd43ac2352c2dabf8711a76abf5de7da151021879244b6e41638de6a3522ee3f14e74ab755758407eb516b4aebd6eeec127317119f9ddf9edc21daa0ccbe898ecb9737da00cd2bf73f395bce8852e7caed3c2bb9d67ed1a811640b8e2b36eb9d151218d0ba61b52f7a686aa694c2a76e12df8b3ce97df2a7fe4cd75e290bda3e756e79a53f755e51aa6200c502850e97bb5c1f2bd97a872a299ab4b0fd691ebb160b1327eee3d1a1c0f4cf0decb77faa7d7601cb52e54c3b49c4e56ce730c05b1c34a9660210e67599dd63fabc58b422f9c78a487cf3af3fe6f9106d4bfc1ccbc7c7054aceb4b44c971949409f3e28ad9d12c6119f146f0d00cd7a1a90333a2627a565f43d13633cfe2e970b087fdd898ccc36d6677696f6a2ca618d8969c83e11e7d53aee1e5729273712eb52b927a356a3321e8a54e8e1dcb4774410d82b21d800429e7a34cf49b8561ef6b7f48db426a6bbda606ec282768fb36f5f508d5b1a1995e7b03c5da7e348552a4d0b02a508472dc791a9aa201ecd2ffbea41de41632f4d11a8b9bf51eb47aadbb4aabb83472044d546557500ae2eb487282261728c4249cc1b5fc22f75bdd069c99732334c471a50c2c944d2563c67b93901e0304333b407a4ab2289db5a9cb0b3efad1d357e329199a3b9693595f0e1b5f2a0355a110761655f9bf94eaef537e648f23bbd57bdc53b5790c5b23b50e0003e0ac603bf9f4ce0632004b0407b87da898c0ce89ce4718f382daf347e69f873ecdc82d4151b86694782569fb114979e8f499c3e48377f7eb4e84b63ff841c972dc195c14cec134c7ed425222dbb704bb09beb8a6fd7067e3c9dd6c26a8aee5c59922052d6d1367956edf672b62245f044af38b78e67b780523b610c0b40879faf4fe71224659aba7852a9d95d87eab777dec8787576cd33b827b8d33aedfca5c21a4317c0d554fb78321992f8da9e11c286b50aa9f42dbe474c611f7f6e41647e2effe5b61282a7d0a7adae4c4a22b54596075eaa729668e731c6d040cc1429725bffbadd620757e38c57ac5ed36ff6861a75db7c32b41459f5209e709e0708a8f825cf50eff912049332f159ba6e5a2a05ceb243e9972ca4b1a2984ddbd19f3b5159474c0a6d00befc794c23b3b9160b6e57d804b506e17161dd1614e2be8b4d30cfda057aeaa5d75182cf870d66aab9b3ad927dcdfb212fa83be8089f935fa5bc21269a60a59c0d59e6914e1b8556211ce2e57d06b387dce4cd3e9aa6b6430859f823e6f94c1cbb4ec599028ccced912726679cf9ca9c40cde1fea539a5130e5756fc5750a125110f57b158778b0c25a61ced4f7ba63ed6f67ac77cb9a23c3d1e9355f1f04182a0ef0a9a9758283f1100830aeb9a66bc4da38c5047a149165620718641b943dc0bf3fe991f3aa0e3aecb8e019651c262d5378c2fb3f86c50e49f62d6d47bb90f7f10e5120aeab73c9384b8ccd23801037c5af5aba4d507ebdcb3bfde67ac7c1bc7e7d3bf632189f47cea9ac61318818fdc1fdfcae63a4c421b43e0ed36a461eccf485ca86bf5347b0c2a2bb0af6257b9044355a45ba1d486cba67456c0c606e0b654fc45462d56371a625447617409b0f1891782addbf8e3877f38e49b634a8bc2e17b47e49e482b4157cc15680e4542a5fe270fe7001d663fe374f8e5cf64c01458c639c8785227200315283ea01465d001dd031f56b846ea02dfadd6ddecd7482cc31614400d557d0ddc816577adc77347e29297a19ee21c1dfe7aad972f0a3dddce5c1d42474f205097091a4f6edefc218d219dc5304d5dbf27985c29a0ce7eced298d1970353037b4eacf69a4808f1e3ef9cb726336c970699dd83385278ff63ac472c4923927cd12eb9376de17d0640006e1e0ee90e10836462552a02c220179d7f1f9058a12be5835ff350db5c94cd2e92c5cd25950bb4760fb920c210a14d1905552f43366c98724fb2459bf0fffe5c202af3d293cc97c6c0ae1cf5486fb78e0cc0d26aed4819fc050b1b2c8f1175d10c94e6942a56b028f7f3f25a59c6cc8735cf823cc7c21859093d5accd8dec34a6dcbeb790f12e82f59b3b62ff8b9ff0a9d12c688f72e51ef7b8967bcf459487f4ba361559fa2da7eea647608410057174cb7afd86353abe59c521975a7e0ebed3a9b05b696a83063ad693ec4738f6cbc816ca03f97e4fedb59674be736e8cce508628a93511d20cd3f417fed7e10bdb5ead332183eb20c59acfb0c77adbb7c2dd3f16394fed64c62bae9f97b94303597e9cffeb7dcef628d63549ee484432ae2c5b6987d40cfff6e11b6037a1bc3e0f48bf87d8e1e30bcfbc739a2307dfe12e5e23aec7ec4802ab4e5afd4fa7bcdb3b81d8341cab08645f10947f1b772cb2391bdff0573d335f148457624116c72b20a5e53ec983f6e601dfe152e35e4b28de209f6aa4055c271cd85ea04746bd4efaa4816e8a71a8d61ed88d3791f9606b965d8aaad7741a9f6bf06d55e3d1bba1b88f2bdb6ae9e48db89f40e3d65eab834167837130a4e80d3a9838d5ba0d09c011f80aeaf5a3e8a291672408898b4933849a468b786464bbb3fb7d944e8bb9ef85d1fd671b2792d5faf68c5e307bda8df5daf543f6ecf3919a63b3d6800257bab48afe18274b8a1a08f823670a33fe58aebd2123cc46b754bee7318eae4637c2a6885d8d1d5f6539b152681b986c297f17116e17cdde777ba39aa54402774eebaf093ffebc8db90d071812c02849665f03171eeff40f527be475d8f49d87ac77454ec24c214b9e2eeaf973176654c5238cd272b57166145bfd917b8213041d605eae8e33eeb31d83069d046cb482eb6bff7c885bbb029f4dc120cb3853fe18a345ccc9281a867642a0823e5e02ef01635470b44c92b917481d93090a95a75b8cf7ffae94922a928c26846dd8df14a07e737495990e22d82fe19a2f3e06252a8b1a299a4a1d483a4e9abbb0e261b1100c03b87b126fd074037b9a84f8a891462f5aaff53ad5b09fae1459f217543ff00485eba91800de8a58afe5951b06af1e2cb6a25e679da1ced0d4e0b3421b00e712e1208e1dbd10118e81457c6fcfdaf5e8c6570096b7bab3b08d4fd56200bee44b89f3a03bf6e245a50cbfcd4287cdbf41a8820b57102ce49ceb482a9b2362e223e5a99d4efa31f27244265493066b74695a960ac0976097ca62a9c740706907fffcaf11e4501bc05aed9b3d34ed7922b740aba00d2c4e3424125ac3dcb2c3cd743bd159a1443ea5cb27d6d3d09c927d84598f37511efb4e77343dddba507507d73719d7b53a43d7710ceb196795677d73962fc2f9e3d7c0602240bf5ff0556098077be4d75230266e936b2f7eeceb7a35baf9a91a2c8faa1b1f96d9d5b8b551caf0e94420e3edd126ef1dddd4d0e0961592b1cb3b2b67290663c086a0d96929fadd74b0da3dd64d3885b2f9e2e275f54b0ae3f1edac0fe568a28108f93bd9e9d2f4cc8c6265e3ee79c9e416d4d124145270cee7b41a4f32716c9742ab6cbfe3cd6e9298df8becd717fac63c5a7880169691d12a31b0763310d7e558e2c1afa6ed8e9ac776a50fe7cae2c3100e8f484fae1565b5cdd2ddb2aac7d9062e8cb25e75311d0b447c8149245c92a76cfac862173b37074aba19153ae7baa1f780ea899d99397fcc25fafb780bdf0b43978e325a7d355721ed2b4361eb08ece897670744beef4d31e52703e0736f8846f4c1a4678824bcc4eee0ac0a64106e586fbfedbd246fa7ffb090b1e4e807b1766d0820ea328654aaba569ad0290a2195349d25485e35668ef113054c39cba9153d212485ec2d3fe6d3c1b888fd6f47b479703598582b048552f9a3981ccb544c1a4836da60f776c5f3e485a8b5907903472ca2ab9f5ce92fe2434f444970e1a757fe19843ed55c1c6489b963664980b030c034ca92d5ff3a00197db40239f937bfdaafe4b1b4ba85bf6d041b96f5a422e754ffc5705248226bffe006e8efe943f5ee74df69ce5734cee1faa4e9be43edaf5e763a5cabd2048a89936143e8489489915d6ab1a51a2d85379045c99ee6267daf8ca67991ce9189d314d61b07b93241b4fc4c7dee8c9b7eecc2b4b9e74ec89706f47dd17eab6d08bf77195f1659733e7e2384246f3024df6faa50f76a6b556de4ac9b16926fda83a686ce2cbb98aba9e050bd5fb44a66d16617b4695be24bbb1337bd0aab29f504d6d6eb89d0a949786ac64954494cceeb6f3c4c87c39bc9c3f06e321dd8c172fc355c9faa8740809e1d325955d1dd4258d88bc20e931c572fbec36f5a4e045179356486f8ee53e1401c61127b8c5a17cb81614951e5e889366ab04243f08fb481ffdae619973ffed5bcc98cad271bd882b65719f5bd3e2a35896dc4e219dfa1a377d27879d0e97cbe046ed40b629773cc279076a300bb51d0ede08e148364300ec9b2ccf809e628daaa622160cf705b7186884ec5cf45b3a297b76b8add4067539b375544dc17dab27df841036bb2d2526705d184f9727d87aadc2d352c61174449b4417a93cf44d8103f09a0c03d2bc02e345bdb2ab8923b8a074ff48ed7cedad936cb633d39e273d152eaeba3b9e381f9067a6f4b1756a1346c966b77a550cad884699a3ec5aa31dc2adc12693915f21951faeb4c91d19577a0c7209e5d3bbca8d84c605a8918cd9761ed1240f258881f3608afad4415fd74bdda742a83da4a399a436aed7133ff24414ebbef1e2764d4c34d17b8d06bee52c338b59264f080ff06e728c5c8cc9a62d41316e796aeb17783031bda05aafd8e9656ca0f004884c33f87f4b1886c24e23fc7b59fc83077642245f4a584128111721c9aeb19fc6cdeab204a817367f04453ee8b58c4ebb16c7fbb62116f0e10f9dc288c3daf1631cb3e66ac5e7a0ebdc60a35ea7b486ee62c97e10e59a93837fd7e8e0e9d53c79d666a6432d1c78127ef6cac5a4fce8e85407d651b6e6fdac8283ba50512b8267a326e856dedc91489b2036d8cfdf3c571cde2ef5a4a6228abf440b43b29bcddd5a0237c002bb1b2a85378834ed97ccdcaff962da3583b1e63d2ef6b391b887d67eecb82cee4128e2f71086bd5762a1860a45c59d94fb7e845cd2f5416ac1f80bf12315190ef0526d532a1e9d9a8157fbb44a7cfee66de0a8b0480ea16dff23b4c9dce31131039aa6f6af41a772ea19ff3c5df7416686154e06c6e20424daddeafe3e6e6ae2cafcff58fec7ec45b288ef73e9916405204f2adaaffefe6a5ecd93ba602ca79223f994ba487f99ddd8bd0c35600e11048789b279ef585d37e62ce1d1c437239a58511df68bd316063787177f8a91925176f69a7450cb03828698ca31905a27f98318cab30186d0f34e2ff45cb365776a0f94f5e44e0410cc051e5b96266e26682fcea87604d0d73361fdb9fb957d31db5b07f4b5d97b52ebaae31b067359afb0c8d68dee37bc442cf5ff86b05538dc8d31fb7768cbd3756490a30d194065d849c57e791287260435b3acceca1363b96eaf52bed43cc6ba3b554403a47beb7ce32bcbcb18c56e6d918e36f6b420640f867e4982342b57ae1e2126f5bd1398913935af5b57852b8fda4a277cdba6ccd850ae578ca2622af0896d7872227f029c5a9529488f9ad5625ae5a7a6567d87e8a3a84329d1b9f0c2b3711c7ff37f14ab6f81780aaa7c7bc3434eee2284f02dba4110396697d43a2a3b64cf25dec64a2c59943839ac1b45a059f366236ba2c0d8d7a42da04684c0b212de066ae4cb8de50ab1472caf2d53a718dec4d64e31b2aee32616119d8a3558317237212d18d2ffc5e0a5616a7906b91c888ac6a76f70a15236beffee275964268ac5f91e955842d91c2bbd04c19b1a8a9d5e6df05bf224aca4517d8db9f0b9086b3a053cd7f7a15082ed0413f6eec98088203c78e8ded7192623329b4a533fabff89b89cf100ca1574ab15255e84c2033481dbd5ac0464b1f5e79731308df18d9164b2aa51818ea9dcc058fd8e983d38d7e84f89483c6c03ecf65fbdd4f3eed1f654eeadc7225faed914478ed94409689d216f03a306a3c52e2c153b1de98d7773266bd5a5e930868620c9d20544b2b0e157abc0c664302bd0a7bede6cf157a542407aaa30895b57515cc265e8d571918712c774abf68c42dfb6e5b67167d1a0b03d49d99812ccdcb4907cd6ca52afb9a82b17254250cbf56c2886b71cd2570168310ba7ae6ef46520632686d28c0ed495629a59b361004819ac13c8b1b27735ada548b91af4695d1247034ad9af3b2ba6659101b49ab3fe3276756e7ddca48d0d26cd4f5867b8ecaedc9644a9209b00fd076bda19e15c3fea4e02fc6159c5b96b0d31649c99928352eeaefc3179f82511b37f7a25739e279cbf7c3eabae2488bd0389496f3e4112536a473bc1233f27b472468ca847eee082a6afa4ca365a87362603ccb61935101c997b7ee946e89d47abc3d0abd883914c194c17cc17b510a19585881f224e89ed237a90ebe2fe7bc47e7274222b7d16ac9d56cd007c570a8f4f9052babb73f899d677fa2edf7babff38e5f718ed09b8148d4dc5aa24df54e2ad34067b91bafabf89dfd19a4c835e9dc528565949bb78bf1f886e0e1981d86e3ee9103240ac14981b074af45cc61c40f581a4ba630a920ff9e14b5a8ac8cbc1ac2863a6a64f144add63683e1713f5eb2edf832229b45912ece8d971ee3c3773d2653144847f6e6ea89449cf9cf1a7c6f0f676dc4ad67af5a880979fba322dbee26725cbf57971281d6b87a7cf02515dec94c7618054e58dd5937498f28f752e46157f7a232437c3a0cdb4a6781a09f91485392c11519f4618588a03aa1c6bff54ef2225c1080731cfe30dc237a4cae3421a98243d1a0b42366ac9256dac8dfe7694ee3869fdc28967caff931f5a7400f50d42b9453eda8b9e29bb9eccbc99592b87f26f42904fdb24837503d47e1e123a5cf278accd82f95ae3a0fcd20fcb73f4d8e4cb9eda50863a84fe21a34da368889f814015122fa33b859dd7de701b3160383223813451cdb5534f966a956efe2218fc9cba9952b5f6a9020bcabb23e1c0028e0b3f26a003d169bdac4f54beffa27e2f5f9cad71db9d3a097035acba205a9c60898338da3f32fafa4cf5dadc2e70336f4268518048b98f8637640f0ea45ad29646fd4fbc270b661b5a5bc596e0d1b2207666fa6283504ff88c21563c4b03e0817d3e3f4a9fdaf1ddc668574b2341c6afc67ae3377322ac9626c85e088cac7387234b7d5743ef93cc7df7076bcdd36de3e1deb00c6a2e2a34abe0dbe8fc75ee0198ce8b14ec8bc5d6fb211fde84d9629babcae5001ad4e6ec8afffa9cd02f355b466dcd8a81115f98ad896cbbed33c8dc2d3247a598e4ae78e2277748ead8a5071633b4512204098c4d9a0b717125ce53993759fb12abc550cf1415fce5001c397d9629c237a7a3e609317db5b3b483d4e99331100cb7f417a899fb92be3f6546aa3849314c863ad1d78c74bf97a0b79a3cc8bafc3ad58aa6a5da5ad8d5fd09a9d679d96d12d4311da3591556592e381e9239cb77bd66d9065d8dd2616d2807b55376d8e907ede7f34383cc0a53c300c6e6b6a498fc060f871305a2d560f926e2c7ba668452d73d44af62d15afceaf2e939cceeb50bc98d079c4482da75636061a334c400892f2b1ee1da8e32c7004e5285737c1b311a432f2b4408fb69a15d36234489a7f1f50c451d8275f4083a9124f7fd070eac8be98f16a0c5f467f93b2cb5f283ed0dc022a45946e5c46b39e0be9bc844164ce032b430587e2419752dec1b67c5aff5ff72758965de79b5122b80ab292b4704a0ae5ec9b3176e6d647627c53f52d4e363af7db58ed976ac4f63adaf19775f297e599c01bc85425e822d0c3963889be7afe7aa9584c912ef23fec578f6efb4b46dff66bd5fce6446f8a1f880947c33fd81298539b63f2b88881a2d4f064bd945cf598ffdad4dac5e70a1c386f2fa9a92d3fbd4029e27018c8dab866cd313fa045ad914cb1ce7f9fd727effb3d9d34b12fef06c1c0db513a2715d9a247b52de1005d87ba20e3bfc3b06986021c4f834cab4c86098d7549fa4d26fff7c779aa1106090a4be096ec7bf9b975af6f4c174282f4893501dc462b5f0d3e9c56aec1f65c489a77bd8429c180b3094da23b098e620ad94f86a3bdd87225ad40cdf07f291a06c909dd9202ead4266db2d39cc52ab7dacb868f967bc01b8e79e125e8f43f323cb86712a0b94e12d9c9ab524db75bbf49c0f75b1cf83e3752a2de2621d5e3f9e469f6a25585ff444936a12f2d704bd6365a555a4e182410d9a85d84cf4dc40d57088d06452cad2457eeb0792fda119b21625b0c048816dd5356462085ac82c81a6982fdda285d5fb14e87d11edbdc21e4958db8c8083617b3195a3e74457aa6be4ac12c288b6d999109e6f7bafcef8b669cbbe352437b3bb4803628e8e2fa2282b677ed41afd2a48550f80b8ca281e8f10e39769df87c51de50dc550a9e9bee3ea7eec1b2d35fabf2c3fb129a02a895799707a36cc192a1821dbeddd61323d711ab03022df2a438971821329ebfc27ae89b468a9ae30a0a8dfd4192f996e5afbee98e0fcf82d0885daf4f614a03597d9d873b2a0c4d88d02cee84e4037c3ba5895bb88f2a6979789c9a32d68612cc31ee8f9c39092d645913feda93b53b44db136b3576a3c877df9006651ef36f9712d306ac6ecedd2f3597c93cd8285592a85eac0223bd3d5a041a66bfa6864901f9217f36b13f6c8a47772de206e27cc6802702e3011549d6af9bf6b14bce532ee7ba1a1a1fbe15f3732b8ed806af1108e56d43f20d2724f9621f307615eb4060412af5ec7d9029fd3a339e5d9585268005268abf1755f9be78ceecb0bcbfcb96f09c1627dc1b22b28597388a97f43b1dbf0203dd6654a005a2b6442c4893b62a28534c49f1a234abc94bcaeab075825e599fb27224e4254099d297e2a659a79745368fb1f9e38d042008fb3e035c68ef0b799a3c14ad38893b63c7e189754128be43c9130502f2931fcf910729edb2d3ee71aec9df98d269730df66aa1a0f5b7043774b2a3bb4d57761b5ef702fd35c35e34f9b0f476a83d32295b48ec62e42ec0cc4fe0b9e7f1d3b205a6fbf848ed347dbe3d339a296d0b467783119f6cdea07be058c64e9c96c781f39a214d64acbaae211ce76dd6bc4aebb365bc3917ea27cdb53e5849b0dff068ddaef33a9a3a92000fe284528c9f591592bfb98fde74246e08dc6a001a91118cc9ca9c05186d3aff33d53d0577c5061ddd3ca7ca5bbc3dbe2ff63d54d23dd3cb8d12a4b2ae65e111b6b335e6bfbcf07cbf6663a179b6c21d8e5ad6b678223203c54083e5772671474b713185378def76392c934dd896755613b3dfa3c816b013922db4e77919ec4e4be1dcd0ae98d1738e53902d4ce86afc184b21f7da1371458bf68dda0ddb25c486bf88d754c1e10524d067f9d77af7d0220652357de578766af2676fa2a22c9dee118e54a75268a0f15e6bc825b0f7d34cbe65c510eae604d3b987038f45df0b4bbff97629e623ee14f48b893e66186c6edc961ab6292082d3f368ed74f663272ea5400852f09d5c6be4530b99b87d22b05aed8a646ca8bb6ea29c66f9786cec8566b1f1ced4bc7b933338d7076cabe2e2d7706cb30cf63d82026894fd8929766e8f5b622ece3b29a52971de73cb9c50bcf76b259302fe71175ccaa16359556d2162be8cb9e6fd7e3d4ad5d722fe8276c3bb3b19e15ec4bddf4b675e22d26ab99abbd23b818eb75d41d8c3d250ef239434f7961176de77971a87eb245aa2fc652796e9dcb2f0d021315c8f23b5ca5338f6d6b16625285b4f5f4f1aaa46bab1e434fd885c0e0532127d415047423c6dbc753e3385514a0acdfb6d5ba988ceea40db458d2b4001c02858b62654d736208d0a954a18174ea63a48c0795f0c27020715656d0b049fbf9cf3630ebb4240cf69824e10da3c6744866ea20bc07171fa33598b4e5ee5eaa5d59973886524f278f831e8b71787dac358b9a05c271289496c842ec49865f43e1e1d888afb3d85b3a8b74c17321897e3c5fa8abc51844aca9374ff066db410e2a4b45ddb2fabf1b202c2391fc3266accbde91a95318f35afb69883ee5ec3721bba12213c7181de23e6651655d2b9619d4aac08de66989afcffa2e5c1ee67b04958fa58bb4bdab3fa299a97b59e499721817e83998478156bad449558b11200234352f3d33c745ab26ab111a073509a90c6514175d295fa71695d8e485290ba63f136778eb864ad000673d4daf53e782a5e52684892aab6a4fd0430e404ce4195d880a0067018247ddd2cd07f4b19a8d65369e2aa6e74e42d5a6b32ec3ec32f4a7480f81358ef84ee201e10cba1379897ac62df5b359a357e344efb72763271157da8aca1bc9f4a2d39ffd4173e89dcdf6bae37c43d2c665ed38dc6d17e38a0f691cde3fa04d3d9c1df7325131c7734f582ccf15578fa8e0c6f3bf164bf2896671e624dfbea87bf08204041e6ea5c57cd14ac676ccc0727c8d55b14c4a1a6f3f227912686bad380d0bbabf3ea10b44efdf8ed6f2fd359773fcf4abec3f7f3ac6feef96a33e0436fd632969e4e127b4fb7579cda127af98e56160be2ddf7e6d8b868a8491a0e25152a6912ad6bdc561f63169315cefef202575fcd0b9c7de473cf3a447049292b95e08c0a3bbf5a969a7e563c3cb016da033b7e5e68ce78c2a877cb2ba806b21aa5a37ea175d11c3b548e1c47c6460d91419214603862f6728861f8f36d2682b1f177716857c3eb345f0641e569e31cb992b6c2046fbf083adc38044bbdf17bb115f707a7f72da8503fb6aa7a082b2b1905cf35d416ffa996723a23123f5567a5c9cad55cfeb470c394123e2874c27cf9ec3cb830e6edc2b66f43b4342f45fe260022f175e94279e2a202a18a052888aef459ff82e1505fb343869c793d56fd0e58555dd28c87242147d81787c57e1f8a964a1e8839986d308f0ad3f9acb65109eb19d821bd58c19cf30e071d8132a4cbe782d4054b870ab71c8e88a47c934644cb3b164feecd2d54272b0e4d54ed9e7483d1309d3ed79b46ae1feb65abe11ae879496c10a0479569e533d78b321b30242681f3a6f6460f608d853b748710602460771c578eb6c4d7c0ca0b8d46557947048d5d8c05c80bc2f12ec3a2de865047ce8e8c8edcbcd26ddbe5f25ffea6f7a76d4b693bed20f69da7ef5c892f4e78e53b6e68ea86e83f0da67b7474244ee0f4c71d4e10654ce6663bc746bdd984c91fc47c9e740b70635f9365de39652f1c0ba24e6d5db5da3c0203691add207aa9ef38dcc261d97497613a3663187d01ccba51793ee43837729b070168ff01c2e33c57f91c962c621942795223d4700025175287359a25a9954b81591e390ad580e88dd0416593d1022312294785d97e1854a797150c19d4e9467dba068a8112434ce4f49a7125aaad95050b68c40ddbabe531399870ea39386732f30ca67d1d6b59bbed9c55592ef67556d054c05741c5a1afc3a4b0a34f4e89bbb7d2493966cb0c473a0a6fc40cec1f71429c7a826a286c7d84f1f00bb66275cf6f0271136e7b599a06f95f7158e6f432dc35686aaf6c3ed3e3de856abb88e80552c4f3d2a3bacc981b1a49d83434c707fbf7fcb6bdb36ee4159d7a59854ede3b8dc21759f047a481041f25fceb00cdf403efbcc90f82b39e2ee050a105043e7e22c6eb6c1d12ca8b5695e109a3f4fd2fbd56373a4e0f34229d666abe0d1ad62e2a66946972af508e888797ba4b913e7c659b3f5715362e953fcc3494c904ebf9e86352845985b23e4e6cb642d402b2382327e8a25f2ec616ba5f7b42ac1192f862468d711c66662fe965f8743b8ddee4588a00916a8d3ac82b07f2ad78cc4fff6897a0a4b14881f5c746b8304a7413ae2fa5856cc75beb14d27b7d966b5137f658520acf11ddb4ba8f9b2041d906179c03c749c90a2a53d4a2bedcac3ad680e17b585e2348005d7f7fd1b2c72bac3e9512195578b0721215819429e59f189e5b681e63b9bb0528565c6c413e8fb06b93385b446e3427e1189ee0f91c97605d25a244d4ed63d9c551c1851af75b38648114e0592b9cac74cabbf28b93166fc46e336c065d1f09a0f26cc6d0a7b480fa52a79ac6d006bd4f95eed6e6d47b5eee066da00cf27c4c2a5cd136f36f48c20d81e1ab1c3aab6d6cc7f8dd8bed31a60951818fbef26eabde0d93ef1b1d4b206192ee0e3b484e5c6fe603891ff507b01e146bb674b457420031cfdc0809384daf0901afd58e429f32c25d8286e1c70a7b7a126c8e3801ff4d91c71f33ad2daab27b30397da7d104314f84391744de33a67aec1f47e3e933f142e42845b040fa2682232462752d453f84eb8e5aa2e82852dbcc64490c61c98cf2bb0051d230a3d726426fb8857404962951f9f1970c8f708ed93fe4ce9e8bfc7262f5c120a133f329b0f005f4e5f59839d3e007c027c118bda957d8a6eb697a832656a6b17750f809314477e5032729bddd47c9b7c6ebc2baa0982d6ea1275f5f16d9a3c987628bd3c1e9fe558816f044440d1ba2367af1044afec53ccdbe042e8c0fdf8fd772fd9cc813125b7b5e9f0124fe15cc920cc0abdb6c8cdfc67d5019167fd2cf5d060cc0b64a6aaf03423a816aafe3b250ea048b52835991fe9444c5c0ff4e94859d7c881c73708876bf3478e9817394eb784b324b2918044e51246b9b4a108a89b3453a852d3d40c9851f573510f58519f4beaf06b4b578e7d9bf346a621e188a4ba4f3137d3e9dcd83ed317ff1971eb42182f0b8c70b24ecab4132e01d6ae65b149e18cdcdf50c05038188b8408e87fd5df998fa6365406d820a7abb2062db37593c31ca523db22827f761c8d9ec4a8d2c1112dcde7a8f114102a10cce708be77755352ab9f1c2b980ad6da6a0c046ea024ee92b98296b293264200daa4398b3731764fc6d68a3add782567186b3ea8673f84e54abb859cd81170377ff3cee91e5cbdb3e37072ef262f698eb43c35cd526b3525c4dc6468cf760bb81784911fb513846274946b05608f687c4dc970e5d2a97b0532fdb6b3bdc176fd4937fbbf1b18803762f2bab1abb0a46003613bad8c7a596d691d86b909f6bdff11ed62fdeb2d71b0ca8f1b96519ae532d8e6c4854b3615f2ce1a9b53f3f1f41cd733f647a04076370b524fe2111d3f66e9c85a936391ac4b0adc0df553a11240d4af6ebda207608c473db8111949b756b46dc26fa70c9e80988fccd0ec6e2ffddbd3e12d8bc77fdb5d87963d32dc3a9f174510f530d3157e9abdeeb0b72113abeb945faa39f7a0f507f8096a7a6da674c49ea752d46936a8a812d1a4d475ae349942f59def4c38147037d89956127c321ae16722cfef8107fa7248110861605a5961a37586673f756b431d169133de7340da04ae9ff00f0e09385ccabb3f49a89c8663eebf6e721f992b994f77bdd81db84c6fbd21b2bc609877aee6d438da6b20f63b5cd4b5f96f7949312bd9d827d4f0db56bf0c2959c600986c70a884262e3b1d889c25c5ec936f4af59040009b7853603ec5b88ff07c3f96c6e5ea62409b22ce6898f792c222499a11bfcc101990ca9082eb6808f85acff3002adb6b99c344b13b489967fad0689f30e975baa23dce933b136471dbcb07a38d04e0f72cfd13f8bc89e111b42cf1e453871462b93ac96b7e570a6db3db83f9dbbea7b353b6e7f2b36e55d6a88ee220d2a2796d448e305820010a8a6c08021080101a806cca51809f6fb028bac197a1ad2b2aa3a9ca7e1f29e640d91fb2e89476bb2d14e4b14aa2af28ed8f66e884a4dddaca97dd84f1ae5cac96986f514152806ecf71c7b2abb22312e4dfd3aa6b2acf96885bce250bac75b45bfd5bb4ca1b140e8be097220474c23fdef63d7b951105a0745354f3773a4c04848432e10dbde3033aeede189c1d1c7e08f4557bdfb708a44b0754eb183dcb47f6affb554c7d4b851162ee4e5e57e66361311fdb7d5f1efd942199107fb61e477ce239e1badc0180b3eeadad1fb7774d6b2454c1e596044063767c21022066f563d4d49f203e21748961109a1cc3263856897d41d7fd7822c6f0c71f63c6f40e3b9d291005f94ee1bfe29405c89f19d28f26a2370ec9cf9167a2447bcafd8627b8d091756ed5037412795a19486386e1f2250c80f42b758d6b284ec3146b369387af07e98ef39c1fb536579ac9f39a3f1c809c5ee3d9b6666ecc7edadc3c45e4b9cd611b33fcdad85356c8d5943027ba91d3db8fd606503bc47aae6f430b62a15cb762921b53bb1e72a22062579865409eb70407bb1984b84e167f799a80e66db69adb195d58a5005968c55197cca467679ece0c80ed94976202fd0eb34635fdfda421bac7064769ea85cef8e8f9a1c89d59146ead0e7ed5ebb2d74c2b75fece75a5ac721892ae2bce38b12d858a61ea386a5e811fe5f477e2dda001e6bec1adaf5f77efd7a97bd1def6742fba28818a975d06cb74c92b062578c65fe6299a85f28a7bf44318dc3c81d6c3daa6f01693beeb5b00159583ec2de1e8e350a4339a014001ff2837714cb6dd226582cf4b9c5e3e83d5ddb23eaa2ad0e9777fb73fd7ad34e7890ec4614984a399ee135e6ea168c270313574ab37537d421244832c8cce09c5c1d74d3823014167f2e01f5a33bba2b7bc9cb7f101507ebc27cce5dd19288c8ee68828e1f191dcba7187c8ab25aabb33feb843e6c0c7325df43627271b3017fe27c62a6dd719c9c385fbf57c5b9a5f983f44534c8371e181eb29c168cdefd6befe8de3b7c938e6d61496cb92f3b141da2707d4570fc4e559acf912a8be0c2eb8d8958f8cb73497da499944377f5be83d8f0d54fbb6e5d76f0ec714c0177dcf7e9455473d99e8e1bb74b8273e14dab62890ed45726a1424c8d360c600c7cdd49c3b0559131e2759ff11dad5448b56a1191819b7ba7d70916d5b6b75a4abeecf14253e6ff71dd36b001ab8d10479653a64a3074775be9251aa18bff3dc236c9c2a12aa597085fb9900763733d305ccc10c21ffd1d8f3a128979f3664de4d7eaa87e22ad62072ca7c729d2acd682e66b058e6bca192de134e16803090537f797302b277c1d256d72b71406d30150e8ccc2b555f81a65bc7f63ab80cf19a84b1b35da933a5ad46d35ecaee9e22a68891c11157dfcef7773b37ed10b65a56dd8931e7e1aea10a43c0d42b0ea6aa017fe9bd0c5d9c5c1c7c51c51ead05ef77bddc327a59bdc0875d0b7ef8824fae892f46855e342af4cf8424b4bbc1da56fbfa735d56a8b5d94a4690632a56629d2a4b2b0a634f83bfc92cb77847fab265dbb4aabce07f5ccfa1c397cba9b627e7f9327b142d0d9aaf10110573a9789d2edd6a04f6506dfbe1a26182948feff185363ed4b8ae595e120a7098e6accc69df8fef256f2b0fa05d212670f4d55830843ad59b3829074e55b7117c2ea91c22092f6ae0585e7eb1d569d27ad2c16355d5a83df7805c5645ca2ccc6a20215c48ee0f0ab77b3203f61e5916542cb99fedb1e3e18f6d4e370cc2ca73f2fe059688047a4a067d626aa1aaa03616ef8447e3fe311a583f4cbda175f8b9ddb3062afa626d582f21753deee94df19b0eadf9ffd72a9af623b902d106f7322d94e8e6c8201d053497cea11a8b9a97d1e76b8d1c4f749d34c268f784e1d35ff8504aed4431140087dea1c043bc01fea4c5000519d7959720d9e5e45bf9a6c74890e04d44dad266df3bce699dd25e462d089d272d65cc3446c8b33bbbb16ab921b20e14b159b2beaace745653d801bcef30af5bc2a76816c02dde348a8bd4663350742f682d22b27e2b4712341f23811e151cc339dde6fa637137475ccfd1f02cd38f212eaff8d52bf4229647eab61690542f7364dee53fc41ce629a22fec802f41f52f19c3047ad3e85d6175486676cfbae47546401c86a7f5dac96cb65b194fbd3a1895d4b5cc54cb30594d81674a1212205214d624e10e0d300ee36ad5c2211191401d28c56bc7126d3961dda7532ebfb05a4ff206374007fe49968bb2fb8e4cb2d95dfebbd7f207fa8ae6fc535564e6cfa76af8596e56138af4b685b52f7744ca12396ca78e918271ab1444e65f5a79c3327bacfb8280bf5bc54b4cf3d1c03b998d7d9b2487d9d42b1405fb25f9530dc3f1fad04863d9bf5cf4bed1102be34883c7f1dbde224a3ca31430438e1abc23490f65f8d39bd3b0e79adf91b824191a16dde672754392b857a245e40979d2fb6226dea5f17e0d9c5b4c519f1b08bf9e32e314cf4275fce2031cb3977f946e18c2655ef6fb0f571826af2a1cf9a1dfbee4c07bc13659b609751e227a30555a43862020d4347fab9812efa82f235e775c6f1e29d9371db0592a9a4bfcee6d7bc779ce5fe11fd558dbb1463db8889e7658b9f0d2d71f4c2bdb3caba1a73f785741d3b47af729f390760dd8b67587b06fea1ad78fe61a2cf6978fefb282b0df576182fa3077d8c8bf722b8f6a26f889de3326c5230c6293b6e18c12c73ac42799bf91acac3484696b724c0f60f060a5cfd8a52187af85f4becdb7aff67bb0c5ef57b67ca455a0cdafaff7d96b267d265ffc0105f57de09922ef72561c82e16fac5cc9f1b3f968e45990a5fedb3403a13d8b577a6c2dfbeb911ca924012763d198b902378a94701b9edcf5a48f57d1c526598f9d678e503769fcc2d7246f955ae257efc44cedcadb44921f109631cd8987eadea41bf35c54e44e23accdb5c514d6622b0d51f4705594d272c6962481c037bf15b0e50ec42e370ecb1c3202c8ec4ddc36beceaa2f505baa3a89c1c4bacd872b7b89b99e9accdc802131c347540acf30b20ca42dece9f6549b9b33416426b4d67aa7b1d2304b0d3d3e606e1dd225b69a865e8916c28b1f8c7a8ec0213fd421186838a69bb38a2d442168e29cca916aa8c9cb133ba34e739ea93d54fe2f58ca8d24210a59193b9aecc9ae7c4176ebc07858c323788848611e4821f2b57213ac290314a45f7f31f2f68f0023beb3f473844c19ad281672b3aeda7005ef11baeefc492f04eca6cb6f0925c62898343958a5f10ee828bc51c7e2bdd07efac5eb9ff41d1fb46f240ac837635e964ecbc431abf57a9eb681f720ef661edfee907d66e550327f0fc61af0e2489b2232a543fa5b4d8bc75cafae7db71ffd3c555fcb5416fe3d7506c5e03f1850785605df8c6fcd1e41fc485f12d421980632bf85a408c42ce430c0688a2f2062be7ecbae4c319317285c2d5b8bc66087e6c892f1f85451a02711aa81da20e8d3c6b8d0fa8779f8ca2bdd4af1cb83dddeb1de43d6d9e2c1c26f91e216c26517b1ea54d36a4c2bbd7f999b1ad2c3f6f9ebbde6f2fd236519fa12feaecf9796cc8cebb843edc166fbd2ec3b91c1ccdefdbe42b22a938118b86b74c821d974cd65e14d5c7b384182d1ecfa22670d6e818f25da7eace1aa80c0f5ef7a208da22faa029393cbf52687b80c02de2ead3010d86e2728dbc031c88253a3977f9b6228ca760b29a47d1a71a1473058ca7c2c8adf38965b748a523ee9c6d44a4f288da885258bea149a2f3c25f77bdded0355cde33b32f55f1c9104fddbd13a17fed4ac27a1f798b98f7f9058b3d8ec630c6d1887c2c2d9ea89dc79d6e5d1b0fa202b6e3160c0ce1a0b6aa2456cb9a708f9a8480d94df87f6030dafc80e5f51bd7181065309b20bc156d58dd1ede6a73fe5b970e7bbba58e615841de209b560a6464cf381624793e2cb3012eaefb371fed189e1cde846781341f965d43f59f1e234b77e62cab81dc3a1a79d9de9cd64f7677d5a14fd7b1c50e91db4d8208dbe3e1ad67399e2bb9715b059097f47134d9bc8dcc91ff16e60cf084881db05059b747e275a880fbef8b7271dbfc354009f832420736f0ea70c015f2dfbb46adb69c20595baa9d66366876e843a74ac92c0647ab29e16cad1b1d76615741a547963d172e56fad058d4f0cb9281ba78be66d9d09cfb1ba5971fdd077e1a2bb77942461f04da4f7fbee5e8247c3fae0e7fe664f2f564399496682dec224a9bf502c974c5ab6318bccc127354d870f3c94659988be135dcde6e804b1cb76ae44a54f38712689b0cd86fb2cd2a4bf257c91b6cd474b629d5616d4b47ef282d1b74d633749342963c424b8cc3bd3c8a944e48ef888755d09571e3e8b86439bd7777cd6dc922f0dd1a236442514ef8131c628a0b73e6841518ec88f693f1e16d8f39a52706c631e44d20e71894b00c1f14b75a3e58fdc27dce0581cd46bd9ae66f54520842ed060d9eae67230c58df9b8694fc443d4530b51e7ff5ba44a3aeed4ac6b7bbbb125075e1933d7a0fe997296b12f0136a6cf5c78f1c24560f4a0c99e1038529c4f8f3244ce2ec56132cf45ca12989a6ac41a897f34d83c0168ca71c83060097cef3cf7f97b4d78f1c1d0fd01c18b4ef5835632bf20080c579d1e82e7d032f3c1e7e9bb295c8319e88dd001c69106d74e4ec0c3dd5d24bd1cff2c287ca61ae5b45e4d2d659233be3ce6a7c232d1c535a28086f4b1fc1ae25bc8196520ec1429413deb2d777b35069304a928c12526d2b4755ab052011a0fd6b5501f3193ac49b37ffa85d0be031c972d47e6a390149a08d8a84314dc3fb086cf5cfb2ce66087ea5ed9ffc80b10cab0d05fa179dd20fcea5cb922e750c60b74a2844afc5872aa6f43f4659562e3841d5d2d5335dff24ae360a697effbcaee3c3b511213446e53eb924243ab9c04c9f90123377a038a09b9932a0bf78fdc40d3b4c6706630649e797089df761f25baa62a2eeff55049d2b3fc566802498b3ce10ae69de25cf9c881ed786907c199c3bba7c835debe55419e87445a402ff6cc169cc152695c2005039eb1a55275f958f933223cb0145cf67581b64c0740dc3df73a465c9fe74a064b9e855edb72ccc80dd0090143e28450e5ebb1c1a13eb4cd3d5f93aa1354a3f18386ae358ae061406393cce531959725aa945652a14a3ce40100368699dec490c7d0b494145d48a35396046faca1cf9b3cb39d8392e3728c22adfaa327ad54bcca94df2d949a3bf9b84f1faca6c6ae612e99949a11f03f7ec045efd0207d21c75bd64537c9f6465cb2e917985d7ef0ba320c5dd713fc5c8718eeb1e50f37eeb176dd37ad7a50f6d0c666b7bbc05e4e168b07ff2a87c025c8b51eb60a2c8e04c745be1aeae87711a1f1c030b8623a82064ceeacae6f9f04dd67466330756b425f776e9919d1cf56a6dd4bccf0c5465120212ead57b65478f189fd3803b3c6963c67bf30fee8f6a80dffeaa427cde1b34012f1a2d2d4775d395d4c5537071c29aa6cad2d09f66800bc787ab700c90c028c2b7246d64d0840f0cdfdc89db41617f6e72e65516c1e8cc944e76899663f29746eaf5bd7e22b81428abd2193370a545f47e3a1e025c697da235ce500f2535cb4d416bdfc433b91b2f8852369c313c88d483ec9f9f59e70ab8cb504c13c6fe465067ad02361db2546aa6182f0538ad0d6e2a40a81fcac68c97af900ac6813cc174cd69e4df2699b42e915745d0b0ad601abe784d39823dcf3878f373f9e2350cf0eb0ee7ce6fb155649e06297174dd000d9af83c8c4320f0425617879dbc8b6733b9e42646efa95206bf84336dee38841f3813ada30976b9af372e48684eddeb7076df5afcdbae6989f8ed56845d34ec557bf749d3bc629aff0395464dc4666dece07dc31795d73edc284785e8052ec57d8138b3347ba547981c591c873468087ab5eca1398dec718b8347e879ccef782093e5eaf82412d1308b2e794387448cb04a750e8295c684e6b9d2a7d4e97f06b631cb5ed148e8ea7210e8020f41b4317006077096e64ad73b3c9e0bd2ea3863ee9142d00690bd61e1d1499006fc4bfa9ad54b993261f779490d0971f18148bf3678d70601b9a1938cc8ae66ac52499d0ef692e23bb769c3fbb60df42214c552469591188bcd0768c65ea3c90c002bc9b50bded4527fecec42921c6f349b8cbce3ee07704e4c9896ba524e006e3c8509c6a82574b5e4547de5022b287896e943344f32b7c2f144dd49934f301930ce74f46fd8e000c6b56e1c5cc531a5996315028828159e0c6b8ad7874f4d478182ddb4b8d864313a116711ead8ef45b1bc131645655f387ab13247406a7bde67f9a01cc4b25a7f8a46b2deb4b53dd1b61401b6ca4a0ca1f8206f460c4d0afbdbb364ac0f56ea56f1b9ff44f51f55423c371a375c6197c000b37ab4575f9f2c1a4ac06d2d37ca4028fb566f0b0a7a3a8120ea9edf8913f03e2a5ba56797525220dca17f28b740c004b12651c914ed37d7da669f7c7290f144c8f656ae4cfcbded82752ee2d2c9e622d5d083b1249d2dad020acb1398112a96b4ea7925e691158486bb609666170179576a8529a2df4ca1aacdd72596811a27f43ab46115943a2e931a230a8347a1688240b0a8c58f5bacf3f721a96fb6124ad6a92dc596ff1dc96012fbdedd095749a4b1334041c01cc82450999ef7987fa08cf6a681d323e5f4030be248570dea2ec5a33dadcabb98a0869a9e308f7a54c660cf6b8fa92fc79ffc2c218234203e45fa4e253255aea9ac6e03c715d9908829b3e9f36ad5a068298aa5c5e47b05e2fdb4517749c6149c8c8e9c9ee27bc64bab5f02deafa4bd663783251a5840d733554f17e325c234d78c3ee68ec4ff0547d5ed09e93c67a4d5f355a53e12cb330e4f044250c90a58f41541e87afa7ec2c2268ec95bc7644828d0b105191c4c6a6641c9344810b5bca1864e578a9f765d8827c5782012320e83399ecdee4606650aff3dca5d680de18cd2b1e4159a63034514442d7786e323216fede840f792fb8ac9feda1c38ae8f0d3837825b1a5c1e81fd1e06ed97724137304c6ba67df69e6c3085175e100c3eea911b1b85aec953755b9c3b76d29e2f69f2f3f8ff859f6a3a3edeccae8f266140c281b95a9da0733a57627ed7f23b52ed705fd27f7544867f9c13bc81e4252d8121d8fd471ade562a961344b35bd63b78dae83ea4c61282440ddb519cb0ae5c2e48bffe7171cc2b645d1ff1428878250d969d7a204ed95ee78f119c9d7b8990a9178a351e48d49433f5d5e1f79a01ee759168a721ca9dc36865092b6e7fc5af1ba338a75377b5eaddcb7196f57dea9be9b082e6d149fe2f34da8cb16e62735e80b2a8c959b041578f37cb6125ab7a1ea6fed9d68285f0db10c21ca87b6eb45a8f04d55436d22883f788ccb60d78d0ea34e989f020d5aaf123186d41487980df028c7f8b325755ff0a09b24910033ad6b7cbd03efed54dca1a59b42e8f11bdd8319d3a2e0cb9f614ed315e68a65bb681278fb97ab62b5351aec2766ce5d67522f2cceeb20e077fa6d0f1faf611f1d11cc00506f7124e46ed3711a8dc3f9d475b1a92c32a7a00f2a16e02727a4b467f99063501715fe9c888000dc03dffd0f963613deed7106920c8d003cdd144c184117d373c050aa664ab1aa0d874b8ec3d0e075ee29f965212ed06c361a18690c987cc7fa44b19d01e7dd7bab2119d55cd4bf112f79f375b54f8a1b6f1e8c51a0b3abe2708fe1c00b927c467d33f6a65a7572fb39a85578fd375f67fec14f8893f1c3652863177f38d1cefecc41d38706d5f03d5ecb160ead5805336e78ae1af1ef24ca86d507368723f71056794a2b999cddc975712245c213e221328a2ba8c5ae14e8639f4aec34df7116045d1e0a17ae5386c242d502c2f3242eace9f9aa33ac862f77bca6494ad7c531aa32c1aca70c702fe52c2a2c1a5ad43c8614dfb323edfe00de127b741e5c5f8000d892d982ec6782cbe4d183257e8715a52fbcd845b684999eba74c769661db3049de41dd47e523b79685d79f41286ff5d165b462f1d33b8f9ed5b6660605ce65b63172412061cd0a055be6414019ded66443d52ad6fef801f4830e33526399b4ca356cfd67e4bbf9ce7641e70df73a0141975fb8b7c0a2d71140904d7dcda3f8851bf8a207189b29c25617543a07a7ab3788c2bd6a7ddf531d444a1b43d5330d2887bc1271386051dcca5607caad836b0b8d9472e133594f2506c8edd3052a79085827e32d682fe13941563f0f8d888caf374909265ad5ee869094258212f75a1fddd931d511992dbce5bb4ec52ea7bf0b9bae5be67117eb45d7d7d523e3190b4f814eb77ee410c40e1fd5820747546b69849ee6514cb29eff5554c3d22e1fe0ce7114f540953f1b5d780b0486449950df22ba93221ad7008424308d6358a3704a1b449845669072ef58a5b68f40147af8231ccba2ab4e2751df1bbb00085ed112a7148954e5c5e8cecdc4b5f0b1e33de3351ae93b1241e04fe55dbaf1c8df079e0731bddfdea75cd41573c703ae3d10eaec247d6e4c217db27543ca630f12d6618b2437508aca230cef127971938db02aa57b782ab448888faeb19048c18a2d3b7b4c179581b3cdc1953a7f6f96b719b0f2e75fbf6359f1fe1890f4cb4f8f1f064a4a891ed65958b4bc1cef84a3f36825a15b326939229f1b7c4897f99bcf206b3b65f29ea7274fef2704dfc2605d9438b556cd2cc1eb0986bc356219c70df8d22da60b3e45baa768292cac53480f738a5ebc6b1a64950bf3809f9c37ff97f4a4c3a14fcc1ae39b775bd0efd01428d41d82c8b2ccceecf4333cc4cbd9f03c42b781be8f0a495c2997a9edcc73b9e900b02173718c0feccb52a28ddb8cb439c5c7254978ac06ea601c08f3f7a824a951a6590e1bed0257e0384f1b20a10252d53713472190ed15dc09ed005f4e808060435330603b9d3b856a8d9979c0eb747ebf946a9b73b4d39a239f7f0eccc36021d1b3348b9681f9de1115342a1aaa7019a2e9d4f4d29863fe0f343977caaf03d4990cdde431c279749bda1c247fe76bc07c5a14a6414e64a607a4f48ba3f20432642ad88213f1ece7ce8cbf1a95cee334d60aa366223d35ff207ecc6683976f3d3193fd25a257cc420513554ee30598764efc07d11ee3980794e775bb71c8d7b8ccd7f3533df68e7d2f17228b6f76172ac7c8ddae5baf844ea02ff5c17b363b4564389d449551e785193353676f81ad72a7e15e23f2bf11a2d1a399c6f3b22c082c49fa57166b0434f21fa8e659b3f8eae83289aba1136c48e11967c62c9f94334f5354e83da6fa3f4dde915cbb829914351a17fb4eda0811410ac4181ad41c8c4c7f04edd028f0e77217d7d606961f8eb07fc23064d8b9c73b12b1a634543bbc52601283a7ea1995dc459191ce002aa216df7f35615a0598598aa18ac5319992c2a73d77ef98575192ba9a8322834faa9a38f3d4863339c55f4f3972ce8e2b79dd112eae87fcb5c95ba8bbcb867da56e7b42a6ad919f56293600a40697f82fc2551c6aa2cbd20610acefa003b1a4e1c08248803c940844730cd22df38677ea2ccb6e6fd5e30036d92d3668f3c0464881367517f04c15ff77cd508c1f42bc5a4ad243c116b78184ba34a3bdbd4edd8062a8982926e36d916a8ef52db205e65a71568c17a50a742d1cee993ca1479a90120524c0ee0ce6266c4bae96e81aa6537a04ad820b683b1c8a01397be4c69cc96131f1a9bcb611b03546c082e63b6a1cd324661a30a91841294654123e6346513a4c69d98d9074706387897476145cbbdee48d5e587e6160b1f506200c46b8a4be24a345b8cadc2ddf4e1e777873b4adeceed2b6fd739f63c0fc73b29c24685c57989acf539e876f5ee13d3c9c4934e523b1cd3610a8e8585d963d4c13fd5d9fc935a9d0c1a8179aae1501f4743d7278ef08b92ee6a9d574b627435d836a5f3d7cbc64fc6d3c7751ea00090a2258aa9a877ec198ede3f84af892fa3ecf113f036667c743ee2d2c111f006eaa848de2628bbbac82e1adb7b91f2165d9e26eb3efdc9ac3a3ed1c90120bb8cd4eaa7a4b779477a4db47508e621c6e7279f8c7fead38aa6a7190291a902b6c6d190001f511a4c146e080e9fc4422fd281bb03529ab7432a798227a769167e610ec58d79c9fce50ec66501276e96aaa20f0c2840e8d8be2913cf9e6d617b9e8c4292ec3de4d0d0d2378ebf64bf0abdc4f05e9a9be664a526d3ccac50dd689631f8a259cc98e5ded2f0bec288cc7d2f3dd39ad84a8d3ced964a483ea1dbbc8de54295f69b02de86b06b4044fbc79cfd3a71b3a584f4777d7bd9904fccdea3842069f3e37bd750295500b53000ff6b03aa1647ce3199cdb1e52937adf58bdfef7299e211989e972183261265766e1dcb01b7779c4ec16df03a639e461b917f668f338c5ddbe98e6a2d12aeb994fb33665c7faced75f888cad5f1a58605038bbf715ca5c4d07ee3a0af9c29da545ba66c279e0afa580ed95a62d86871d741f805e2aaaf9ebf55f1835751fe0c667deb6cc970c728e5cbea49934fc7636a03453e9cc84a03f46d1d45cfd25c948edcb4ea277942d2d2ed4422eb89dc7f374e3101d730767739f642faa3e585e7efcdbefa35223b8e2f740ab7441f60385eaee0337aedb758a3693a72b2cf92e6d119469451677d2cc3cf81c2df76eee59cfab7748213a0435f2d1f28c5ccaeedd45aae23c70e48f0cffe2fe059d42f4a8bd2204b425d9ea970f7788260d89cec29fb0f5234aab238af7e9aa89c33992b86f84be73aaf959ee44e58b6b7ce8e5cb1e1ed9a2e49971cdadc97c1c7c0b2212dd3743e779ca3685063fab308c907f7d8ed662c69abb378ea5ece02b1cf5b2a23d98e3259f1a71092676eab7ddcd0267e61054e3049d39996fbc6fbcce2113a774cc2b1ed611f4571e7a2afe45bfa362b450715006619ddde58c6805c4b5d8278838c3ff9a33ba4f534b870a3a2d77e6de26b3ff3b74251f3271190aedc8a2e9ae9c80db393bad6ae9379b5d01d6fc161eeae1bc945d86cda537c2966ae6536010d43894955f03295da361757f9dc21c3ddd52ff1d68a9d60dd01a361c0b97f29f942d5da8c48d9c3c403332089433b72c66a69b0aab8f45737d91ea3027dcdc083c79b1b42c09c5fdd09dc403d44f3e19e6af7c324acc82d265ddd04b4c333f91464a2adf04cd17e22fb2cd7a72404d31e66e1d48e8b92ab7ca3bb4d4f4e301342bdce04ef1fd9c06240a403c1387edcfac9d862412c5638b58475ea4e831302a4938358e54647c6a1a764bb79a801451f6a3e7bb4f27efa72737447db72d77ef42a9fdfa2dc52bc06c8ab6fefaff92edfd3cd95ac57d7ac3a8ae6bdfefa1542a0cae653f7b78626fce19736a373896be22a245357671ff4fc3172066e70f30b9dac186943b92cd63796ee555c64ae34df577f0a81d648f1a55997c58df296a18c89f0a48c3c214108fa009f6d59f44242a877494f1b4eb9e92447b17fd63fa2d32a7bd88dc050fa85dc585a83c346ed82817b22593f444554a77ac6855b50640a1cc0e4b6e112e1bdd4ba1fce9e3788c50287cb96c50bde9563b11cd41cbe2338901bd1da4b9523995d4924fd66b5d070951757ca28361f2d322677705bc8c9fbe8043551cca46ad1c1c5d4d5b73a787321102fca6a50a215648cec49045b5c95dfa5233e60df80799d2fa746ac5785b5163a1e632c9e8dceeb0a857056e60597f0a31d113810a5e5b1254892521cae4a10f321aa478444cfd831d7cf3a14333bc890166d70043a4c7256177df981a8eb72dd4e7dd34a71d5c4a33f48168186aa51f1b03ea92a4c8214b0ca9f76c255f068602b54b15b1394b762d3f212951bea56a7d6cb5d0d124714f03c6a3300bb1bdb8faa730f18facaeafec1de34c78c00702fa2188658dff7e8270603110299ee314c404340f936073316593957dcbb798b057b01e743438caec716ca0fd5cd22f04454bb64bfae9360ced000491645a505c7b98a2d088d9167c6b3e3bf20abee4b04a05c0e47325936b4a5fed06d4d955f84254ab394975314d2df19f495d854a86ba06984421ec194a0d278c3f9cff99fbe3c3b8d29e3c73dff4d6a69173b3c48b967b47ad4a7ae5a2db3f7477e9b92f99468936685d1f566341f82186f53cfe098bd75b6e75e6c5196588578fa19e31131ab330a3531091d48e0f69152b077eac82f3287353756165062746356927c2e9fa2ec028d3a6580c8f1d84bb0fe897924a074f575f6eb756f5d89a6cc47232276dd83171f54f505cb28ae34c7f3bac3ab649933f4dcd6bccf7430d37b0e53abef0eb599f79be237cad6b19c748e0e503b9a7146f16c716bda7c4e2d5ee84a595f6abae029a2dc1cd5992439d603c92c18446b6ae34fa4e101c6af92054a5bab740f509b8915bd84ef86b86ccaeffc46d358db737e065cc7cd28db50c720a406fcb53c91fd7ea37d8304af1e036256397b5241a540dd1658e00873bd7b54b5d62158aad92185de760a974c4d0de3556823f2d269ecf7af9e209bc798b1ab53aea094b02df91a373b297b7565973ef52fdb0cf868439db8e9b88c6ced779c809fb7bc4d2946d1318ebe3679154ff510a5df173a47e9b9296dc96f3f43d219e4dacb90cdca8ff4cf75ecc60b43a79afdc6294bdb534b24da6533e8e54ebb1a34a0e7bdbf6dd4c79ffe9eadc3a002e2a53f0582953da8861b8cba715f4a3042d4e863d88a178b003b9a05b60b6b5feff3f0b42aaa814e79890b3f664e045e52c8bf873942e14543bb39e49f1007053da237f26b7bdc4b0ae7530913b0a629bc9838150276a3f40edaf75b481d3d1becddf14c39bffaf7fff2c1f8e828d32eeb43bf65242c7ad64b1d8a3e81112eec2f36bf5fe34a8bd43726c976ffaa0f41361a32cdcf5feb35706ebf6effa281d93d5dfb7f925c7c24e96a5b79036ba3e8db7f52cbf35aaf0f50d4c2308d03a6bdd58445f95fd4a347069cf26913c6f5379933a47a3211776fbaec01f6b2e212de4379cd7d367fac28897a821e856c578a2c65517fe7d867dc8df702edf3519a79107c885612342961300b32f68768f5cd616c862ae242b4e513ff711f2052809b4faddb982312ab95654bc6669623f6cb9136dd9d6555ad877fc065c405fbb1f58a5c393a4438f8a74534ccf6184f50b37207e7521ddb5e145570836d16f3ab27e318804d47bd4b33c140a3029516ce5162966723f903069446b8a8f544cb42d86528d2538d7eb32c435040337306919d7b9028e9d8de4d03a091bb7f915dedc0dc8ce8e6da8aeb0be210aeaae459b28d28f282f1a481b821f0d6a3fbd7f1c518b022b48992ac155aa4516021e942c8395241ab6719e64b7783ac2bb5e3e9d3eac0ef794281c42a64db73585e6dfe5902878232595b489f8d17c3dce3e26cd61288f003f110f9525dd6fc65a8c1bfdee3d7cfef891bd546e90e0c24698c50aafe8ede905257bc8b8f7cacffa90ee2b9b618afdae3de3bbd74a5c8a572df9c7ac8090a4efcf3d0a06b648669bc1d4bf17fdc7d1bf3425881c5059c87a30f5b79c92940f499005ef60d31f41143d919048fadbb7b7bda08d98031cd04fda6567cb8f671d76538d9da8345c04ba130652c4d6e9c95bb52e72d8059a7d99497f08c9fcaf03e7776523dd491bcfed0d6ff69d083e7f09d8469a4be78d8bc508dfc02f1e45f4e3ed9f5a25d41dd290c1c32a3a2847ebffa3ac300576aae59f24a954a6e57d3f4f84d8151b4076ac82665a0ea0c86a7f9115dc28a3ce34d6775b465611d07af445be5fa05a897850edef3bbc81cef43ac80df37c378aab2f8e28d8120694ca66289c50d963106beb146e95490734d749bbb2c49525945efbf670aba9ff7487ffe7972d5c422738ffd0c22aa722dcfa728a5866b30c368420e7a01ad326c7119d2fbbfa77dd80adca8f2360b387c386faa62f12524f322d5ee15cbf1d9ae1238eec586b28293d353c35bf0a914b19b22fd600837945b46ef80f20b04de7716e5d62cb85e48cc33c6396951bc7149a35d5e040982ea2675273cdbacf1822d6f01a8462a4b3f1a1cb44a7059d49fb732e9593b872563d9deefefb327a748d8098c3d82e2fe4ac46f213919d3dc2ad12ec87164c2eb1b78f133bba3e513d8f911181621a7cfd138423b17556d9263f625b618c74ee90afe891b73098460fb427683c9172d137caa977ad6ebab93f14b28613f60be6871b9bab80fe12e8a75b231b68bb37d925b942f3551a4f308cf5c8008c72e9ea3f3e21e187da1ad73cbd7a14c538c46b5621add6246f1d7980c9ff363da112d39469ab8bf67ecc087ab650d9be309aadf139584ba5f0ce082cae5bf51c77c21eaf8973c3218878f9c134a9910ce2dedfc65b833f587d03c065c024942f5e2b8f48ae80b6c11638ee45d25c91099d07121126000759ab5c4cfb72eb4b8decab6abbec1f4fa5ac32300cb3f6c64c82c9b037c4f188bf9da701fe84c1ab53092eced7c9aee69ca82caa6247a4e43c3c6542f20eb77568f8055b196850aac10eb7553c75e340675957a36ce9088c7791973ad33edb88dec96f8acbdeb949eddace60acadd9d3e3c1e65b65d42e22d0ca4cecac1ef63604ffe7a6bda658ad6baf8d09321ea117560a836fd44370793653fa0a8e6d084b33c1e01d4b9bf96c6e28d841f48c8d9590d8a99d06af7639a86c3609cc35b32e9e98454dc73ad034690214f75da4d63aa47e5c3168fa9e73e4d3d474efeabb5675b77a194a076becd0c5795776839697562f7fa54977075cf0764377eecda40f4c7f0c82124ac479244264418c11792d33294cb4fffdf9dd25a5b101a7e67eef825ff80754d1419df5df648222f8de777ccc37e835435fe0c378f8bd5e34c2e76977f60ed17ff7497803850d469d59469dca2253366a28c60c769ee5e07e5e450696577305859cb65edcf9cb69c949ae49e41e8ac16adc95080e97582a09a963d6b2749b0b41737f041cf529187aaeceea4e566add29d1c4a6a771c7254c7934abade89317a1b32aaa628356c72f643fc5379cf1eedbd0060309e65d8f30b1305d7cfb1bae60ea264260c48f3fd14e595b504ab4454e63462bb3430b2b6fe751ced4646570ef0c0dc8dcc6077b2ebf738e96cee8fe194455939c8802698dea9e983bc251eb5015dfe1cc802a2e525f0d990185b4c64954a94f0d6a4fe2abeecee27c4eba28a63be77e83a217b89883f4e5cab1cf4b04a5c07857fceb6276a3b32bff1f4f2850caea84f468ccd1b13946c011ebefb88d17a70d16591d7d990973475f322ffe86c70cdb66082a8f8d91e21dcd126c1dde4ccacc0a9e25e7cd7350d0823668c646f56029eec5a64cc66591b4494ad631201c64dd1cdb32d9ee74c4cb1a6ef5a13074203c4341a5d3107a29752eb3ce772a3c995938362f224264786189796e43a08d4f19ee309114392ab5deb6bb2cd0b28540d06c4e31ad73867e804484f7ed3538f0d5017206b0bd78755edf80f3421c74ff08564d39c702a6ae3671706cef5359580002ccb9ad48bf5ce5a07f44315b88a002420e084709b89ca25bc6f71b61f445f52de0503678e06f60e82d7896b8aa9131151df5d81c56572c10fd3d19cf16a319205a9014058a006ff6f64593f40e71b3d08f076845b98404128286b3731882fb1ff36ed24424b4cc18766986e8fd411bb389e9af81b49177d96a9b613f579da5a2e42d30ea0239b405e58d0deaf7634171d0499f4bf8aabb42c50a089b7484c4adfd3eb036c816b9c876601241f910c841d17b29d6f28862e155a0052f9c3640f3e85bd383ef54d997fd7c067126f40188a9c453a17dc2d35050738788c014bf9aeb45bdb0fc040a3dae9087843b7a7d61f736710c7246843faf1b159429555db921d3b6afbab29b487f99e22ad23a223ed953ef0558d3eaf690c2feeb587b53e85cd4f7460cc94dceef788abef63fc43585fae5c1ba451989b98b955b923ef28772d5de73791519800929ae90c966d2108f77be48d537f7f976bf526d422a3825f79099425dbdcc692bac4312a1816c573e6585d1c7848983d0f778a4cef8fa42351eb600d2abcfabbcf4fe884c524182755343a65ed4649e016fe55b38c5c4ad656a0fef36c5ff6d7cd2364a866a15f87e6d8efa4ee4ae17704f22280e3dd7021c13b0790cd53175a165355fc7fc818fc8fb947d281a81dfa6950a5e0946e667ff1c8408fc9b145900d8e71a91f9da8d2621627bc39e0cce4a714ed35affa7b0d602ff5f74b2e4aa4c165e1179b0413493bba42354bb21f021237f4fa51086f6f1a4b8926c68f2686efde9f3189a6eb7b0628ee7136c45bfe19113c5ecf8793b2baf64073cc4001c04ed6224adcd6dbe6739f80ad25150602f845d82fddb2b4a70477eaf63681b656fd07a86ce20c1d5077d3702ac7d8db563bee75d5b1b4fc18445232d29f4c477b0aaa668d8f36699b31331e8d7c485b8d6f2cc753d24cda807660b9305def828e7f88d8052c16d69b1a183e5592d7233224cabe76f357177124550ccdd8caad9e3a494a6db74f6ffa6acefbd37e8faafdd31d69716b3ee5922fd82a20343c8fd8f52cc1a0a7bbaf68f160bf007298c0a6724271cab4d800a7d9d074b12260a7bcd7fe613308b2559ec10def2753129826c019ad891456a599f97dd0a8bc629410912ca781ed51c5e74de646f73e6feca16dc5c1dbf20834edd2bc2f50c19d613a8cb4c6406781f4e533b0aff13084f8df3555d0834cb3e24db0ff2f41d1d3f21e7bc81202f56ef7e6607d169c39c6df1d9538745e9fff829e09a0f910e9a5d315501efa46c12d4af8587fe660c95154cf1c23b56635217d77577c7f9be1ff52c514df03229ceede0233f5048e82025f8a63bc3fe857dd01ba2c5844137b3a410257f2f318fa766a3b8c03c1186b927b724fdee1150e662a832ca1d91fd44de3c5da86e0172b6eccbffa626e487033d445b1d301432ebe23b03d832312482878f6706a73ab41b1c0c0607c78d44ab949292fc5be0ff9594dada1fe7340a78502bf712290a24c4d39abe18e57f72d6f268823e8917c07462602b43a0b31c34f0fe7a3182465b849b07b8379d2b8c8cd5c2cff07f283e4502f8b3f75329e7a8748ff0560c28a3defd9e19d7d75b309343e1b34a0363b783064e1297c0f341bf588a9753df9d7d664b8cea83cf99cd1f7d157801188b792f96d480152ffda80398b36c1891f77dfbb39455e323846e4bc043785d86ba579b028858e153a808a8423dae771712cbddeec0e1a37a0c11bfe5f9d60028c0d54eaac1491ee9eb6adf9483b8386cdc02c9b3d92e4c5d87bc5ce1c8c88182077139432fc35f8bf5c382b7d33d833c50209cd004c49be28680932e6b79c745ad6d5247fd84e03fb78a6a2f8952c3d350b565a0edf93889065ca671984aeb44323dc9dc4ee64902bb1e00e12157c4db2f6cab8ce09acb961afa48a58446a678b19f6d9edd8e6f3880cd713dec1c5003fece8c9214518e2afb7fb2b59529c71c5a50c99352bff9432ef3a34da9d4cbc13105c45c100538fcf17a891668c889b91200e0934d5b7eb2f8c6fd60712742953c36ea6b1a4fc7e1403f71077c8cb0a58fd7fc94c9eb7b26ee44b4d123918e03e064263ee7651bca931f447eccd4d8ace1662ad79bdd80f25446c2a8f3e19b3fdf94620952f79511b0eaf5d3872f4b7e5038e0628ddb50440c12e5e4eb6d57c37ce56cfab5eafa6e7c65053783b618962d07d549146e595ae4761a3912d9d7cc97f76bacf0ace92aadeee7664d50c63241dd99d8ce02cfc7aacfdca5441671be9f28a8aa7c34bde965f7878db559201c6d78e9d0f11aeff961fc4f6cbf89124e0e792e8cc7af62b130b8aa6b28ef1b7242dc651413d8b622cce56bf39c5b483074add091d6a45bd8a63576e065d8a01b9762344f1dae45dac3bfbb0ecb39ce206e75151d819dbbfb7bd95dfa8e81e2d1c0959abfb74e59683a9739ee78f2332085f52b342e1c2649db0202b9a721d52dc0ce3bfc6028e78de5182b60f5cc9a80ee7f01076f4816c3d5ffeb1874d58136d07b260f069c5e0b064df19884e50f9d55f5af31b65d57d26ae78d816408c51ad4c5cd16a83cd333594f3955799bb2e9ae6fe1faa1c927a9a7d68c544d285d177aecd253c67290b5b5c1858af9c9305b21fc1ce5d8b49b61f0bc22f746cd6a537a39970dce09c2ffaed8ce20d4b8105fd1c3bec1746e26057aec542b6e0f9aec5511fec1331aac9af4e9a70940b36963103e2e68bbf8bab41cf93434600c2b4749904c6109217e9167df1225c9e153e15e1b3f8a03b4c07b29b4e856c3258d73cd9978bef0a2fc48dc8c621ae6eca8ae14a42df29bd5b9f8b3aecf907bf2dd119f24b52a69486ea4a78286c219fa8706c488a3be95fc01fca255f76f266871f1c59d05290ccd6df0c72cce285549573cfaf0e94e58aef790c22f7d45ba34e570cf3177c396b190a9b3471b0acad51f7e9c97e6b51f44cb936b5121bce8d2689ab7a15aa1b7d06e22038f27963deaf110c31b5fb2bffdbd0f4d17441142862412cc09344142a8c5a04ec6c14edc9b22db758d23187d18518edd0a131bcb7c8f9008728912dc31ca149b2a01363dc9d9b9d842e8afc8158dff47a6f0be510bc6e84391de527e514a847aed0f6e96dabb954074a7693039c1bff2284d427538315c2df1397a69cb119463e9f1635a7c83599226e0527f20dcfadb087cfdb8da5d0f1d9114cd7d834ad5d210324ff6776dafe44853a9745436a24d2914a8b5afc9291aeebfa0ff7b918f71c2cbe58e1b4e14474bf21c2fc1439cc6bab3f95eafe7ef0b5872478ba1e7e59ccc4b13577844d288043c2914dbb368c8d9eb6c0583995736c7620fe39d65d72432578a8bab90839206a1ce2565d23e67c352527476f0f619fecb253c663bc273948c262b74b628855090a58c78f41d5452c49a57e133b8f87f3b04e1f4b0544efaf2a215b7fbb44e0bdc7bcfceff343c9ea2dcccbcf92708fb3a633d20e55c57b8fb2c58d63810d7fb3c148b4b79ba6e7cd167465e1dbd6473337cd890c01cb4d9f5d66ee7c99d38183f6df06fa0b6d0f8a413ffe189d06af350192e30fc8aa211641f0e0f9d2a76aec9906a19af17f27071194c75100e0f5edce561bafc3a55bcbb3452ad0b0c862d8e62c984879ce026817673d1dbc08bd82df6a691cc2cfb09f3c8ab8111322cbc366db71c3189ec557b4a978e1776442d10ed8433aa3e748858cc43901904f0f51a70d960b9a570406070df94a97b79721b9517f97ac09d9c5c57e27445e8fad05e96504d2695604955f8c65bc8fa8408cdb3e1014da7928cc9ba01649668c47f7c9b8889ba1402d384c659eea3e146f8c05c0887682a55b64ca3022c9cbeb208b4428578c84e181cb502650e5676f08b3d7f40704825c22c83cc4ecf660d437db95b2b6d9841cf5e182c0b5373aeaa47870379b2c1176e45710c4c074b7116d0ff12922fe2001",1]],"callback_url":"http://127.0.0.1:8080"} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7642358e24..d3a247cc74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -533,6 +533,9 @@ importers: typescript: specifier: '>=4.5.0' version: 5.8.3 + viem: + specifier: ^2.30.6 + version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) wait-on: specifier: ^8.0.3 version: 8.0.3 diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index a45b3102ff..fc0af5cda3 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -1492,7 +1492,7 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-helpers" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?branch=hacknet#306196542750dd9c0c9f8d1fe2ef76a32e00bd87" +source = "git+https://github.com/gnosisguild/enclave.git?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "alloy", "fhe", @@ -1502,7 +1502,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" version = "0.1.0" -source = "git+https://github.com/gnosisguild/enclave.git?branch=hacknet#306196542750dd9c0c9f8d1fe2ef76a32e00bd87" +source = "git+https://github.com/gnosisguild/enclave.git?rev=f5508ef#f5508ef9855f66c4bfde3d9147a6d04a1eff2d4e" dependencies = [ "ark-bn254", "ark-ff 0.4.2", diff --git a/templates/default/contracts/ImageID.sol b/templates/default/contracts/ImageID.sol index eb936f62a1..367814795a 100644 --- a/templates/default/contracts/ImageID.sol +++ b/templates/default/contracts/ImageID.sol @@ -19,5 +19,5 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = bytes32(0x69f2bdcf375ce3bc8c934c729c38e16ade73301bcdc6e4ae97a98910c31ab11d); + bytes32 public constant PROGRAM_ID = bytes32(0xa56efeb96ad1ed58ab6606e39504329affb555f71046de19ccbfbe7d09c967af); } diff --git a/templates/default/hardhat.config.ts b/templates/default/hardhat.config.ts index 6fa4d28d54..930d59fc00 100644 --- a/templates/default/hardhat.config.ts +++ b/templates/default/hardhat.config.ts @@ -7,7 +7,7 @@ import type { HardhatUserConfig } from "hardhat/config"; task("ciphernode:add", "Register a ciphernode to the registry") .addParam("ciphernodeAddress", "address of ciphernode to register") - .setAction(async function(taskArguments: TaskArguments, hre) { + .setAction(async function (taskArguments: TaskArguments, hre) { const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); const [deployer] = await hre.ethers.getSigners(); const registryContract = new hre.ethers.Contract( diff --git a/templates/default/package.json b/templates/default/package.json index 234e6a244e..3a3b5d7cad 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -28,6 +28,7 @@ "typechain": "^8.3.0", "typed-rpc": "^6.1.1", "typescript": ">=4.5.0", + "viem": "^2.30.6", "wait-on": "^8.0.3" }, "dependencies": { @@ -44,7 +45,7 @@ "dev:evm": "hardhat node", "predev:all": "[ ! -f './contracts/ImageID.sol' ] && enclave program compile || true", "dev:ciphernodes": "./scripts/dev_ciphernodes.sh", - "dev:all": "concurrently -r \"pnpm dev:evm\" \"pnpm dev:ciphernodes\" \"pnpm dev:program\" \"pnpm dev:frontend\"", + "dev:all": "./scripts/dev_all.sh", "dev:frontend": "./scripts/dev_frontend.sh", "dev:program": "./scripts/dev_program.sh", "dev:server": "./scripts/dev_server.sh", diff --git a/templates/default/scripts/dev_all.sh b/templates/default/scripts/dev_all.sh new file mode 100755 index 0000000000..806726056f --- /dev/null +++ b/templates/default/scripts/dev_all.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +SESSION_NAME="enclave-splits" + +# Check if tmux is available +if command -v tmux &> /dev/null; then + echo "tmux found - using tmux session..." + + # Kill existing session if it exists + if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then + echo "Killing existing session '$SESSION_NAME'..." + tmux kill-session -t "$SESSION_NAME" + fi + + echo "Creating new session '$SESSION_NAME'..." + # Create new session + tmux new-session -d -s "$SESSION_NAME" + + # Split into 3 vertical panes (top row) + tmux split-window -h + tmux split-window -h + + # Select the first pane and create bottom row + tmux select-pane -t 1 + tmux split-window -v + + # Select the second pane and create its bottom counterpart + tmux select-pane -t 3 + tmux split-window -v + + # Reorganize layout to make it more even + tmux select-layout tiled + + # Run commands in each pane + tmux send-keys -t 1 'pnpm dev:evm' C-m + sleep 1 + tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m + sleep 1 + tmux send-keys -t 3 'TEST_MODE=1 pnpm dev:server' C-m + sleep 1 + tmux send-keys -t 4 'enclave program start' C-m + sleep 1 + tmux send-keys -t 5 'pnpm dev:frontend' C-m + + # Select the first pane to start + tmux select-pane -t 1 + + # Attach to the session + tmux attach-session -t "$SESSION_NAME" + +else + echo "tmux not found - using pnpm concurrently..." + + # Check if pnpm is available + if ! command -v pnpm &> /dev/null; then + echo "ERROR: pnpm is not installed or not in PATH" + echo "Please install pnpm or tmux to run this script" + exit 1 + fi + + # Run all processes concurrently using pnpm + pnpm concurrently \ + --names "EVM,CIPHER,SERVER,ENCLAVE,FRONTEND" \ + --prefix-colors "cyan,magenta,yellow,green,blue" \ + --kill-others-on-fail \ + "pnpm dev:evm" \ + "pnpm dev:ciphernodes" \ + "TEST_MODE=1 pnpm dev:server" \ + "enclave program start" \ + "pnpm dev:frontend" +fi diff --git a/templates/default/scripts/dev_server.sh b/templates/default/scripts/dev_server.sh index cec8377b87..def10e352d 100755 --- a/templates/default/scripts/dev_server.sh +++ b/templates/default/scripts/dev_server.sh @@ -2,6 +2,7 @@ set -euo pipefail +echo "Waiting for evm node..." pnpm wait-on http://localhost:8545 && \ (export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" CHAIN_ID=31337 && \ export $(enclave print-env --chain hardhat) && \ diff --git a/templates/default/scripts/tmux_all.sh b/templates/default/scripts/tmux_all.sh deleted file mode 100755 index 47e77e379a..0000000000 --- a/templates/default/scripts/tmux_all.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -# Check if tmux is installed -if ! command -v tmux &> /dev/null; then - echo "ERROR: tmux is not installed or not in PATH" - echo "Please install tmux first:" - echo " - Ubuntu/Debian: sudo apt install tmux" - echo " - macOS: brew install tmux" - echo " - CentOS/RHEL: sudo yum install tmux" - exit 1 -fi - -# Create a new tmux session with 6 splits (2 rows of 3) and run specific commands -SESSION_NAME="enclave-splits" - -# Kill existing session if it exists -if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then - echo "Killing existing session '$SESSION_NAME'..." - tmux kill-session -t "$SESSION_NAME" -fi - -echo "Creating new session '$SESSION_NAME'..." -# Create new session -tmux new-session -d -s "$SESSION_NAME" - -# Split into 3 vertical panes (top row) -tmux split-window -h -tmux split-window -h - -# Select the first pane and create bottom row -tmux select-pane -t 1 -tmux split-window -v - -# Select the second pane and create its bottom counterpart -tmux select-pane -t 3 -tmux split-window -v - -# Select the third pane and create its bottom counterpart -tmux select-pane -t 5 -tmux split-window -v - -# Reorganize layout to make it more even -tmux select-layout tiled - -# Run commands in each pane -tmux send-keys -t 1 'pnpm dev:evm' C-m -sleep 1 -tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m -sleep 1 -tmux send-keys -t 3 'pnpm dev:server' C-m -sleep 1 -tmux send-keys -t 4 'enclave program start' C-m -sleep 1 -tmux send-keys -t 5 'pnpm dev:frontend' C-m - -# Select the first pane to start -tmux select-pane -t 1 - -# Attach to the session -tmux attach-session -t "$SESSION_NAME" diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 325175be26..756562a048 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -6,6 +6,11 @@ import { type InputPublishedData, type E3RequestedData, } from "@gnosis-guild/enclave/sdk"; +import { handleTestInteraction } from "./testHandler"; +import { getCheckedEnvVars } from "./utils"; +import { callFheRunner } from "./runner"; +import { createPublicClient, http } from "viem"; +import { hardhat } from "viem/chains"; interface E3Session { e3Id: bigint; @@ -18,27 +23,6 @@ interface E3Session { const e3Sessions = new Map(); -function ensureEnv(key: string): string { - const value = process.env[key]; - if (!value) { - throw new Error(`Missing required env var: ${key}`); - } - return value; -} - -function getCheckedEnvVars() { - return { - RPC_URL: ensureEnv("RPC_URL"), - ENCLAVE_CONTRACT: ensureEnv("ENCLAVE_ADDRESS"), - CIPHERNODE_REGISTRY_CONTRACT: ensureEnv("REGISTRY_ADDRESS"), - PRIVATE_KEY: ensureEnv("PRIVATE_KEY"), - CHAIN_ID: parseInt(ensureEnv("CHAIN_ID")), - PROGRAM_RUNNER_URL: - process.env.PROGRAM_RUNNER_URL || "http://127.0.0.1:13151", - CALLBACK_URL: process.env.CALLBACK_URL || "http://127.0.0.1:8080", - }; -} - async function createPrivateSDK() { const { CHAIN_ID, @@ -66,41 +50,7 @@ async function createPrivateSDK() { return sdk; } -async function callFheRunner( - e3Id: bigint, - params: string, - ciphertextInputs: Array<[string, number]>, -): Promise { - const { PROGRAM_RUNNER_URL, CALLBACK_URL } = getCheckedEnvVars(); - - const payload = { - e3_id: Number(e3Id), - params, - ciphertext_inputs: ciphertextInputs, - callback_url: CALLBACK_URL, - }; - console.log("payload:"); - console.log(JSON.stringify(payload)); - - const response = await fetch(`${PROGRAM_RUNNER_URL}/run_compute`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(payload), - }); - - if (!response.ok) { - throw new Error( - `FHE Runner failed: ${response.status} ${response.statusText}`, - ); - } - - const result = await response.json(); - console.log(`✓ FHE Runner accepted E3 ${e3Id}:`, result); -} - -async function processE3Session(e3Id: bigint): Promise { +async function runProgram(e3Id: bigint): Promise { const sessionKey = e3Id.toString(); const session = e3Sessions.get(sessionKey); @@ -145,67 +95,74 @@ async function processE3Session(e3Id: bigint): Promise { } } -async function setupEventListeners() { - const sdk = await createPrivateSDK(); +async function handleE3ActivatedEvent(event: any) { + const data = event.data as E3ActivatedData; + const e3Id = data.e3Id; + const expiration = data.expiration; - console.log("📡 Setting up event listeners..."); + console.log(`🎯 E3 Activated: ${e3Id}, expiration: ${expiration}`); - sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, async (event) => { - const data = event.data as E3ActivatedData; - const e3Id = data.e3Id; - const expiration = data.expiration; - - console.log(`🎯 E3 Activated: ${e3Id}, expiration: ${expiration}`); - - const sessionKey = e3Id.toString(); - if (!e3Sessions.has(sessionKey)) { - const e3 = await sdk.getE3(e3Id); - e3Sessions.set(sessionKey, { - e3Id, - e3ProgramParams: e3.e3ProgramParams, - expiration, - inputs: [], - isProcessing: false, - isCompleted: false, - }); - } + const sessionKey = e3Id.toString(); + if (!e3Sessions.has(sessionKey)) { + const sdk = await createPrivateSDK(); + const e3 = await sdk.getE3(e3Id); + e3Sessions.set(sessionKey, { + e3Id, + e3ProgramParams: e3.e3ProgramParams, + expiration, + inputs: [], + isProcessing: false, + isCompleted: false, + }); + } - const currentTime = BigInt(Math.floor(Date.now() / 1000)); - const sleepSeconds = - expiration > currentTime ? Number(expiration - currentTime) : 0; + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + const sleepSeconds = + expiration > currentTime ? Number(expiration - currentTime) : 0; - if (sleepSeconds > 0) { - console.log( - `⏰ Scheduling E3 ${e3Id} processing in ${sleepSeconds} seconds...`, - ); - setTimeout(async () => { - await processE3Session(e3Id); - }, sleepSeconds * 1000); - } else { - console.log(`⚡ E3 ${e3Id} already expired, processing immediately...`); - await processE3Session(e3Id); - } - }); + if (sleepSeconds > 0) { + console.log( + `⏰ Scheduling E3 ${e3Id} processing in ${sleepSeconds} seconds...`, + ); + setTimeout(async () => { + await runProgram(e3Id); + }, sleepSeconds * 1000); + } else { + console.log(`⚡ E3 ${e3Id} already expired, processing immediately...`); + await runProgram(e3Id); + } +} - sdk.onEnclaveEvent(EnclaveEventType.INPUT_PUBLISHED, async (event) => { - const data = event.data as InputPublishedData; - const e3Id = data.e3Id; +async function handleInputPublishedEvent(event: any) { + const data = event.data as InputPublishedData; + const e3Id = data.e3Id; - console.log(`📝 Input Published for E3 ${e3Id}: index ${data.index}`); + console.log(`📝 Input Published for E3 ${e3Id}: index ${data.index}`); - const sessionKey = e3Id.toString(); - const session = e3Sessions.get(sessionKey); + const sessionKey = e3Id.toString(); + const session = e3Sessions.get(sessionKey); - if (session) { - session.inputs.push({ - data: data.data, - index: data.index, - }); - console.log(`📊 E3 ${e3Id} now has ${session.inputs.length} inputs`); - } else { - console.warn(`⚠️ Received input for unknown E3 session: ${e3Id}`); - } - }); + if (session) { + session.inputs.push({ + data: data.data, + index: data.index, + }); + console.log(`📊 E3 ${e3Id} now has ${session.inputs.length} inputs`); + } else { + console.warn(`⚠️ Received input for unknown E3 session: ${e3Id}`); + } +} + +async function setupEventListeners() { + const sdk = await createPrivateSDK(); + + console.log("📡 Setting up event listeners..."); + + sdk.onEnclaveEvent(EnclaveEventType.E3_ACTIVATED, handleE3ActivatedEvent); + sdk.onEnclaveEvent( + EnclaveEventType.INPUT_PUBLISHED, + handleInputPublishedEvent, + ); console.log("✅ Event listeners set up successfully"); } @@ -218,16 +175,14 @@ function isSupportedChain(value: any): value is keyof typeof EnclaveSDK.chains { return value in EnclaveSDK.chains; } -const app = express(); -app.use(express.json()); - -app.post("/", async (req: Request, res: Response) => { +async function handleWebhookRequest(req: Request, res: Response) { try { - console.log("📨 Webhook received:", req.body); + console.log("📨 Webhook received:"); const { e3_id, ciphertext, proof } = req.body; + if (e3_id === undefined || !ciphertext || !proof) { + console.error("Missing required fields: e3_id, ciphertext, proof"); - if (!e3_id || !ciphertext || !proof) { res .status(400) .json({ error: "Missing required fields: e3_id, ciphertext, proof" }); @@ -235,6 +190,7 @@ app.post("/", async (req: Request, res: Response) => { } if (!isValidHexString(ciphertext) || !isValidHexString(proof)) { + console.error("ciphertext and proof must be valid hex strings"); res .status(400) .json({ error: "ciphertext and proof must be valid hex strings" }); @@ -242,6 +198,22 @@ app.post("/", async (req: Request, res: Response) => { } console.log(`🔄 Publishing output for E3 ${e3_id}...`); + if (process.env.TEST_MODE) { + const client = createPublicClient({ + transport: http("http://127.0.0.1:8545"), // your Hardhat node URL + chain: hardhat, + }); + // The following ensures that if we are in test mode using hardhat + // We make sure we are past the input window + await client.request({ + method: "evm_increaseTime" as any, + params: [60] as any, // seconds + }); + await client.request({ + method: "evm_mine" as any, + params: [] as any, + }); + } const sdk = await createPrivateSDK(); await sdk.publishCiphertextOutput(BigInt(e3_id), ciphertext, proof); @@ -260,9 +232,9 @@ app.post("/", async (req: Request, res: Response) => { console.error("❌ Webhook processing failed:", error); res.status(500).json({ error: "Internal server error" }); } -}); +} -app.get("/sessions", (req: Request, res: Response) => { +function handleGetSessions(req: Request, res: Response) { const sessions = Array.from(e3Sessions.entries()).map(([key, session]) => ({ e3Id: key, expiration: session.expiration.toString(), @@ -271,7 +243,21 @@ app.get("/sessions", (req: Request, res: Response) => { isCompleted: session.isCompleted, })); res.json(sessions); -}); +} + +const app = express(); +app.use(express.json()); + +app.post("/", handleWebhookRequest); +app.get("/sessions", handleGetSessions); + +// This allows us to test interaction between server and program +// TEST_MODE=1 pnpm dev:server +if (process.env.TEST_MODE) { + app.get("/test", handleTestInteraction); +} + +app.get("/sessions", handleGetSessions); async function startServer() { try { diff --git a/templates/default/server/payload.json b/templates/default/server/payload.json new file mode 100644 index 0000000000..24f2b1c7a4 --- /dev/null +++ b/templates/default/server/payload.json @@ -0,0 +1,15 @@ +{ + "e3_id": 0, + "params": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001", + "ciphertext_inputs": [ + [ + "0x0a8a6c08021080101a806ca049c3e165dd0d724db8e7ff91bd3cbdcaa21b19e3f5d254b350b328207a2d854f4b244107b674477d101f50daafd23feca3771c0923bfc2a19a419e095aa967a0d7ed0c7b59665acbe2fe8ea7a99874546e2092f93f37be13879d8dd6364d06b18f3fdf4a678d31b7456222e772f9c6c49ba9e4d7541fd859905f357acc380e3bc259eb987a800d20feb5fc4ec89a5d6ba519ffcd7d75e6ceb448852592db96bf1ba3e29054b4aad860a6f433eda762cce5960a23f19ca5f6dff895bf5bb78a15e3808a608b9ed38603481edaa9208f0887841ac4af289cf6b6486042dbf5e2ac1b53199beeef6129a45df4c6521664f304b955108539dd14596065a14d3f339936b421dd47bb66b2a49b367e40c8f9dd09697bc04aef671d1db930b0855326a8eb31975415d500b0040e6e56f40b6574e5ff2cb154d6168015522e504de9b25ecdcf3837d854017be5c80bb847f368958cc1ae157e82475ee52c9dc7b5e5ef334201c370af95a3af1c790ea9e27a538e44e3d82a6b0181b7ad883e4f7def4d2706c208b3e7441d9afcca4dce9247fab7762a6ce2d1624b3e18672610f219bc9755c8314265185fdcaa3dc203bd79ec6e6ed4a7b0b3ad5db383cbf290acb4ae9eaa8904d3216df99b68acd1efaa78207b89aa7814d05835b501680dfbf8d8079dc01312ca147f54234f010370df9ffbcfedc737c87bded7a901cea5a3077ee7fc4af96f8e6386245abf707a6b68f1fabc4b6b0d1704c45852aba599db14fb1cb62d6a1740d5813d6bacda9107fb6b0a1e26c2d5388fbafd9d53b6c0e26298742d3c20ec17cde0720805295ccc8d5fc930bf683b83ab644c8c59b55d4a0418938f44f597cdec69c97c8a1baef1f674cc18afaab16a3138ec1ac664c200659b55f18fabb7db1b17251e63b05a556f129659504f6a2a0207cbf2ffe353aa816ef078ad4f6ec2a6a2e5a7bac9b3104b1b6c234811e1bbd415594151b73a334b4c3f28dd865348568b3a4fa406e56dd7b1b0562859c8cc1d0dbd2b72d34c5e4c9a7625024b6e3918e1346aa9c82280787c4de8842620ff78483eebe5349de09703afe32eb938e68c2030e9c0a8e4ec730279a1eb63291801d391cc89b6d13febfaf85c82c832af74681c0483efb6ca8a384b33775720246832bbcaec495efd92f72602e682a75c9d9f6d0ad35e73d1a4017a3868adb52ebe5a080ff6c1b8c7355eb39730b59c3c6e9a24c483bc997eabbdfa778eebe9d3f44e2e195b8740ed960bb27dc1fe08edd8bac12b264cecbe548dfd8264ed7669d7534a24f098aee146d46fc5efb6ada42af40899b0de9ffe27fdfbdbc6f914d6be23d9bc15691876a7d64c7aaa0fd58132f514fd3e772ae6b8dfc76e939576efec7bec78214a7aa2675402cbfd1c44f39af967004ac409b6743ca4f3a7acd50ad4af945c4d2abe0397079eb39735cc7ee1418026bc6822b8e42d0dc46b1e2c7db2862fa057c312c3c76e82d2e0987d27b7225e4b40eb67edcc2b35e671884937f2992c25c00fd8cd24e987ffb0674627dd613b2393040a70d5f7caa12010651d0d7ebddf17acff6b156562e61086e68971955c03fe0a7355038ea108302df3f47a91dbcd4fdc24a5e37920923f61c3a8cb665dc41687c3f6108f4dfd4536e305fa394a92e554f5fe3cbcb7f6c1a2b6799ef2690315ba07964fdafc64944d6c54a600362cdc6e4e00d1747cfcf9c433422607d51ce54dff2d7c09dcbf9fc282d4621c8d881e6643eabb28ed20188d6cf67ab7ba7f45fab1aca01d26b4a0076a6b6f029427ad2cc7babda3fb75cc044d70cf4aa9b6da079d318b5b4d8379a1913e80c5268ca4151db34da60343ecfd5fbc4fa5749cbdc8d432180dff3a480c8acfa6197c400c42e3f8eacebbd769e4ddd2374de9c750f84063a827715457272559035fdcb6e39fdaac699d7285be86d3aa64486085d3ad9c43344c9b3736c2469b9c7eb00cf98f0466f07f738cd3c96e12ef0728f20116ad462fa9cba27b7b7b0f6b18e94050c19fd674e43a2127bff51045ba975540790ef36fe3bfc2db738475b36f6abf5e9140bcddc95b1ef31992c38e9c96553d662f5f9b352b33237cc46efdf5f2e35980f07342678ade5ac5258463973f4d05f63edd0479723ae6a701989433c7d0dd4534d82e73acf22e4486d1c61e890e0246020b4b21563a4290ec4361b91517cf8c63847d48b36d8fb36c0dddc454f80671bf2d9d71f35307bc789948e27d9f23b079fe2ee1ba9e0504de1ca324c24bd915e049394bbf7c28fd327ab906a18abb6f33b40cf01a1217961948e8417adb55d54b7ad18e04c8da27f881bd554cfa46636e11d0a60ae5dd7f2e7ad27800ce53e0ac3dcb2e8556485b874b16f49486f9d26acd1d6afbcb06e1da93717fb6e94f8f0cd80840ad3f1ead39dd3faa2fc7818228963b1db2400984f94513ddb427176a63e4af53da9c31f9d279439a53b07e19ab68085f5ebd9091b2cdf4fd85d19ea757cdaf462b13871ed5a918b48aace7c5ac1287bcca734c65c5e330de3c96ea6eda9ab1450afb830e5afc88b2b925955097c4ad1609465368fda745843da614a97f7411d79268b4f2361e9bd83c83528dbf1a87fc6f89a7e2abd6bfa27c1be2270d28b6963142a07e6ee8608806f34247e2848e7a5befc8bc87b221fca7bce629d1c72e242f40e44edf71f062501947d68b2fcc6e038ce8a43dac30e7eff4e74f3c9d8f642ae90b57a6ab886bfb60d3ba42840270b15830a75538cc33fcc2bb149217530754ff370719d125f2b41096cfa4c745de9089e69dbd086a06a704abf108331a20a5ca1a72b723ffa157c6c1cc7b8a97bbbf3928f014748c9fa89542eaa6016c664eebd6cb01db4839c2083d5a4cc38a871cffeb3a52667c593ef5bf65c11b4ea4732bd3a6fbeb8ac389de161c565a6653499ffab5a71b09ace40dd79b6d7ee919db59541ed7ab694d817e37e467dc8429bd58b8ebdaa6c1380b0269a87e6fbea6edcaac0b42f5798cf0cde4a3d5cf5ddb724858b63fae88826b115d00c00bf0a909c1d364ba5766c890eb4fb865b2edb3d6726c61d449406a438c7f1c853329a62cc791f928ff449c4f289aef8a72da06b772aedb21113c27e79fdff81550f7f5269ead35348116eaf8401459efd3da0ee6918429ba16335d535f0af3d33d8a4c146bbe390b0ae6228aa41b37ba9177f5fdec944ff8156cb4ba786145caa47e4c3513be0fb8e9cbb220aa647f9c87cec202b8d625c639c8324e6233a10d0d74dcbe6d391cb7f5bd3e9ce30299cb4e01e569bfdc0324d503737e9c28c58e3269deb1688bc70c0db4c6e4c088c5d1aaf31c598c010a5590fc03d9262601741dbf0662aa71f14fc4cb3643fd6559b3407f2f3469ca208187e22f6bcca28df708aa93e8dc85a64489565cd69966cbad6a0ed805bff40c1c9ab84ccc6c4fc5ba8aa71720274301702df3c874813977ce2f2026213924a66557b88fb526e12b943bf9bdbc496c2e35c4193457650797b599b6362bb6869939c0fbb51486112a8ec38ce49d3b3a3990895f0aefba7bfb928357551589346830eb3882cc840965eb55b8860a2594e613cde2613663327c062feaa3bfbe192c5c53a29166add212d7ace1bc858fc65725163dd5fcce9e12f1102e320ecc623904339e370514e0ebc4a3ec8ab11bd099ff8805695436548433fad5a69d7e08b3b8e1569a0eb79a77e2252442434393008bc2bdb003b2175b79f47593d99146d041c6df7abf8bbed6a957e7deca154d53d597625849050c453ac2b8bccbf3b49989d8d0276223dcb97e9d3f209640fa2d455538fffff1502987953d5a34e27088515bd08cabce3d9ff2e35ed40f3b464a1797896eb05f79714a855b013d864714e16a553ecf79f71ee935871bccaa30c408e188a48f4538413ae13fd2091fa1a36acc981753e937ddb90a20af6f9eb2679ba5ba50a77d69b5ee62f11d1bad3d3efe31bdf108f1620417933170bc9062c739b3848ac61f68cc02b01987b74d33a6ef2025dc512e412153ef6a69fbd767516582dd090ad42b4e74c726cf49fa79f7ee18fa003420f5559f345c5b7deaaafdf33dd1664926ec339da5e08cec6a207f264323d70f90109a3621fb5bf2ce0672aa9c4bb52f66a0b661866c9792328bcf9b39c0073bab28757a006c9c3d862d6e208a16f35714f4e562fc10881f503277e035b9bdb9b2851204f5fe78347c6cb34fe3094fc5b41433fd509bbddb549840ded7aea3e13e3226893852e037c12f1ddff92ae671db83e64f24245e2148194b006448bfc6a3ca1b961c49f6850f8115f3c17c7452cef01aa260a2f648bcc4551ed00ae3b124f0bb37a2b50a206483cdd72673bc366c88396b76ecd789bc32c52a59cfb322a1758d7be23599e2f41a9d50aa3ca12739f0ea9fa82840dbb113fffd6e9e1fed7af23938c81d1801b1551216180f6a891b50a4336f67d4bcec74d8748ca2289da14cdb975c22a00f746183fb2407c38f006a246e9b1f562ad6a0ddc95f820c9768975310558044df1c44c6abc099753272ec06650a4a1117cdc10662bd19f66d9c2d8596ca2eab7137fc731f53a93154f37dc24b254d1c03d1d85244dfda7fb8ffe8711f6bdab0da62f7bc77f172c4d485f878aeb1ba4fc9ef1883bac943982341a39753ec2ef9b5c305d706a8b48c69a119986e4a35ba87036ccf1a2f3306f07b5776a25659b7256581a9bc471dd86c4f07b348dda7bd4f9f902e41b0155b0307209d5d61c400c1347b4de54caf3161ccb3d7f0b28661d57e737dc625ae60c587d3c55fe039dfc5afde9d4c159e1945f42586617501ad8b1aa0d8cd2449ab7f6df7aed7cb73b90c06753456b929039012451957670d1ac9370f28e5b6581965f8b143ddf2e2e5fbb6d8e43f7de75ee7358749047e97169899285e85b6fcfd4e4bf3238e8ac109e6b399c9209469b7804390970b9d0bfdae2ddb5a9e3bec72bbf458e1a23faca596cd1a432ba9e294503a97870e42ecabd3b5e372b9021d96951e98b85e4899f18d818189e64497f89d9e3ea93fafdb6ab31d88322e6f82341535ca39520827b8af3966c16ef6bcebabe58546f206b63745214c8d2b2d31ab1a54638402ac48ce253e8de8226f3640f989ff5968a1809dc010feb1a8693782aba839563c8c18d2d23a7969878f1585019a0c4475f3413479eee743f29d26a1bdde1922bf9fc61bbdd0ab390fe7cf74cc7ced8242c2c024e097fd17a96dc1e6cf5974d8b9469aade07334da346f589890a1d98fdbeb3a268c165ed4caf2655a2133095aa1e4574f260d79355123feff27cad8b5c51cc1e8bfba3af0834e90875e34129253e9d4659ef75ff71cfc49fe82b1c57b3f1deb3e9a37daf35e37f52cfe98a56ed9d3633ab21d39376a4c6e55771983ee57693b2dc28e6a935f84071d2729d308b8ad192568800ada82ae9ee44269189951f120939fc73f2318f75ed4d89cc135ddf2a5d648dfc530d55c63ca4283ffb7153fe86a37a549878995e4fd48dbc816e3a7eb705f8373ca1d1c3cc07de5cbb5dd5b0ff68a8e6f64f76c60e3362a10851321383a7f98aac1e0006c0fbe193c2a7827a298fd7d5e30cbc661b93172e4e6144f6bf2d23abcb7b8740b6f8459f3bce6177f6d0a92a26e9683c76f0e6b615cb09d251896d30c23e0ec1ce88433b8f8ba00014382bc87e0769588b5b5b970046dc9274e56d466ee4ef59d4287185aa4e6b9dc241145421443ab0c631b579462513a87468a7ea08c4f76d2d4d788017a4892a4efe60207f7c884bcd6a72ed45ceb6e99246f18b0b94d854a27a1084224299ea2669029ed01957952ce10075804bdff3d4ae0e58115319fc146481902fad05923e1bdf3a1511bdbeda1ae9d587edaa02acf0ac613889c4ab7e8b5bdd28e85427921e15c0b4f1c8404bc76d40d138e5deb02d632d7aa4d2fe8460ab8136928b456ddd4f642dc24ac0e0c21946392b8ec5f74f4ee9ff0f66d1042333396d4cf14f0cd6c8d76746af2440d70b22810e34f5d34d679a82118320fdb397e65fe2279337a226161197e72a3146d006f24fa88647293d959d8956a480cee9c298d734ace59297f0e51506da0ae462fa966d869bcb7923278b4e74926384ff9ef102a71d74dac0290e670d1123440484aeec7c77ea1388214422c27994239017c1b2473540b662bc30222affca45b054fc1903991bcff310321fa37af7af15f2051d11d8b12a44f20ed4dabc8f4be5c2ed91c35e9ba597db04fa8c1169c1765fca0e7884446c4787cae17ea7970d566ce218de3c76a7e65cdce6eade69e8aab807093057f4489606ba4ef49e70fc78974ac2d7305cabf142f3d0277dd995b13eef79b0fc397b60bce1827bb75e7cecaec8ee33ef0e0fc01600c8d6e4961801639aeb287159f7e7ca0aa151772a66952ba9c91a803c59d15c81e2431faa3274aac8bb2feafb490f46acc508d4d018b39a140f69ae252f798abf2d3671fd6ab08995b4a4ed85be958b7f44b837453b6596b610b7abe2d06842fb4e95142367e80d2dabe6b8c17c27316747328bc93d665dca6280654557bd14caa9ed1c808bf12bc2cc47ef2f4773f7fe596dd6ebde449ca20bd3946e67074229a69ac1f08dee5d9ace9c3d9ab7dfdfd9771fc6c7c2366116ebd7417dec676d1ee48de0a4a498c2eb031c89a82ba8f6916989ccf32c3c029af45a08d0d30199897d05b29a120c299812e7c8f992383992324861d57f27a553cb6b50a39003b567a293f496969bf5a6f4a3a197fd41b3fcabad659b426398942cd8b79fda00d644ec1429e60c3f16d3000c7b751818a548722026deeae5bc9dd295debbf52296adfce9e8715d6649942cc23bf80b38c2dc82f8ed1cfa30a0d9bb1d8c4a4eece32fb7d8e3e792ca8879785151a0e5443b63f81c9e52f842c2dd5633ca97a1d550bdcf7b165cb04cb381984483f0a49e79dbc578ca731d0bdc7e48921ec371f40b28ca92b99f2c6a022c23f23f9ac8eaf9e9cbd7a35fe8546dde4cbe7024ef9cc1b161e56fe8d8394372ea871efbcde6ab292797853a8feb11fb95ec02ec9ffddef8eb58e94b949a33c08fcdc5190ce14b60e82ca9012bd9869f376b6bed0d8582ff1f782e2821fd410a5249ec3bb5ea0efbc01df1c5859c179a7d64d2645f6fa02ca93d88c998f644dcd892d25a6a9a449bcebbc87f4b0861b5af3165bd30638e61236ff2f857160a8ae9cf9309efbc8fe94ff8e6fc7454f1c81ddce47dcc0bb80192352b4e25554250151c21a21104abdbe8507348763beff441739eed1aca278a244e812e5efaca70127a16a3c9c64779b2de4eaf936e5f159f8f38d5197575fc83ecae499b6a0e427dadc7717e166009a4026ba04938a55f00dab1587a4fdf75d89ae6d0c9c21debd128445fc922804097bfe260311fb19aa1d1835c1f0db069982e7a9e2ce09ff8913bf9e3fcc9988de2ffc237acac8f54f95b6e1794513c89e2dad62b5775f588f5fc6d2a48a43b9174332040bc89a27e1512facefba82d77f9a3216a36f28271502bb784cfd5f5715c806f04b46273bab8fc0a8b12f39d4d4da79bdb865598a774e710e44327ca33bc39d70e93d36cd05bbc3d56b997d9f2ec01c46e64af25b6005091d0c04de503d46a046c9a146aa35f0b06a7bd877e84d2cf52d6bf8c353d807c4d962eee67f2d5aafc6071fd62a10120abe17fac0281a0478d53b37eba1cd17e31ef4af12f42f52694982300f2a046fb3af606a9ff257cfe9ab0171f4ddc6e45d2613c16fd3336394c13764b98a2fe8f22f85bdca4967bb7c0cd0711fdaea11f56be8dc79ca079bed6d73957d3fa816ae883613bcb98699b833d55e22167a4c5303e5a5a0e8c3f5f385b269b9297eaca3aa023b91ac1cfe193042fa92a26ccdd96f522d729335b5abdc6aab80eefdf02e85a97b4a0a21d5173ad451294cbeb99288a1d6acccb087a4d9b3218dc3ad84868b3b21d01acd4cfc3a97a3579f2f23db1d955307008d9251999d362bec24d50ce11038fff143d70b5b8523c60fb2f56ea4b5101046e46b219c09f181ab3d0c6edb7cf2c7f901427314f0f0ef6636f7d670c8b241d8ce9d3161e1a7d736e47135c6167e26422d684515dc6d90dde11f2a38423ef2cf9b25c8ce0c97d1f8fbd3f4b7d5a3cf97d6424bd532345c4e4024bd3ed6ceac4c922632d42bb4f187509d63f32fb0181cd061e8ccdc45f2a30702389c798490e9b82a0b4c23dae3bf95e246312eaecdda39d9d4b601fca0b2bda3d26250fd35655d2517f068927965273a9a6d14cfe908f0466befdee963b766bd18a85b9af93dae09688d10cfeabdd3405737bd9ce484b16184772c3a40c9695fb54dba677bd1db8aa64b69ef2069e14493e7e18b9e86cfdbbb85198d73a932a6e972d830a0de56fda439507dc95e27db1c1512774aa91a4042ad17e2c356e94cf3bcdd247b39e5825440f65552b006db2923cca9e22f200fb21e6b7a7534e67d5a79670cd03659cc3501d752613341c413558de1ce4b52d2d3d5243b0e1f1c3a3d14bc6ae6947cd11157040804d2412d27b20d567e0ba88c03c1b60196fccb44a43a75ea0d0b70e465bdbcafaf74df63f5d1f5d958a59da490bd166dd18c60a726d0b56a1c67b04241a7f169fad65144ba0f0150abcec159c1693089ee93dcc37c2d099dc7f68181971aeef873a7e20d7772413d5cd245f3d9a5e56e0807139872bc332ae7df88ff36f4ced695582e986706d686359bf23903f994e5fa239c30fcb3dc85d3f8e28197a50b31c58dd19a8d33286fb03f923323072fe91a337a8d63aeb8b33e35011db017acd3287ac3e222f4534fd097e102eec9f22031b0ff0eae8ebdda1f1eb36cb540160fe985cfa28b36490fd350b5fe78a76758eb8bd26234832075e2435fcae22f60d6206cfe7bad8e5858e17800d3f55cfed826b920ec582674cf1ffa0c2517540b3742b09f0117cfb63cd68b13bf61f10742ab301a859122d862cd2c9bb9a70e58cad3c896686f937b21f653b35275c7b292b044d0e82868467f5d293f6e6ec7370c9ee7721b44dc6f19470726fe79dbe51f2a03bcf462f2194b0caaecc00550ef59edc6aa9acce9c2128263b782c5aba11e01ddba83c94e394d805c635b5ba01d55742554b3f2c80a05ca7257bfda43583e9e5cec06d9d0d55fd36ba42bda87662243a2978ee3427ade52075573018cd0b429fe7276f9fcff19f5df1596d76e253f8d6228821a5da697abcfe70ecc243934b0f75361f607ab8a2ee00dc5a2db003089039fd19d63c569aed4795debd782b262e8b968c5bcdeba373be6a41dfa08ad64da32ef7cb42c13a0f757c13e2d40bd8e9eb209b345bbb422ac8627f20b2d3db75f7f497f338f96ec013c81044e5761f0a562aebe1471cf5c47cacfabaaa93f9d659a90c3919f7fc4a9a9c1fd0435cdcc64815378aefeb182c95883cc6e18032e67067c59b2ccc094fb9d52f571873fbb59960050e2a04bece86a4d23640a0e251ba502ec4e2b3e0851ca98f88bd707a0aa4f2b507c15e4b6d38f2aebaab994ff884cb4ec0b3e7742b9f912bc63db025722787b5bbd7318fa362e83687e33233fc419ec2b65336cc88b10c73944f20ee4b57cc6d01e00505b0197be281a316006deb57ca466fd8e1c67122a8d95289f1bc4ebea5f30c3bfb7bdd322a4a993560e075951375fd901ae2a6b531b35ffb0c0797b3aca5e13d0063ea60e2ad9af26e2ff31b6dab7d7705e5475daa187aed78b2814c460742140e4375f9feeff8f0e67750bce584f0c2aa1627ea49f7cec1fda009dc47479359982a75c0a0e9e62e30e8ed113053cb4995e04997b2d1610fa58915ea4c87af5ef7e86d839a98a42686648e6210220fbc3392815c72d67a2e7d9d84590a4a733c4fe5e539ce418be57eebe16b2d8059d61f61a6f4c9a314d99973557fb2a57f54e3ff24398954d71fb9403ee44cee0e83dc8a90af13a57ba60b9040b575ee7045246e1279439f88a875d9dcfde6d9b132e46cafb43f5353a623b11b0d357e19470f764a53c43922feb3a9995bc8535ae4e577166837090775fdb4d94ee07bc13e780110207ca424fef4cbeb95bfe4da4fb151a8b3f2e864071a964c4746867f4fbc091b62a30860b9d61658f14615736eb244cc923a16fb5462290769d4e9cef84918aa806baf16cfb383397165ddd39ce9e9ea1524133eabe820447c1bd50878a1569db9fcbceca624e9e7695b7cfaafcd2e9ff876f05f6da03848caede660b8bba9dbe898ca05c0a076ee95ff213cad1b3854b51349aebe065a2b1d1f5c9ab080c27a15a9120ef9193eabe60f38505f62d3d473d9236f81d0a359c506eb4530185b8071178b8545df1f831e93d3992282df185d698471522868bee153dfa1678571fa9a800b035ec08d37f62b19849410db87915464260c7678b485e053a90bbac8b364aefc448aeb176231eb7800b17648023a9acaa69c193b9fff902f6f1c09dc10141b931f38a53860f20c57f3b2f2ab8e0c0d858a13ee3d0f73395929528854d9a2a8fac97fdc4384516ed54c114c96dc88f0dcdb2f921be29778a1b61b2c4b6339d6844227a7bf3b8c344f0b1f2eef8a27048ea785c7181a018721400b1c4b604497de4546d954c76186dc12986cbf08aa90bee611ac28c426c2040dd29e8437a2d11c29a1dac00476012338911e0fa245df97a6cdb8ef23d13506a838f19c43fd33b11476782d58135ed7189da165e41fa04890f15409062f391e381adaf33619571ccfcbcd60742e2d430dcab8425ce7dfbd46ef3a72e027a376f1a2fd1e92e78b86d5d82d45a66f9e55a32fa4b0096f5abe089187c8b032b4b9f224042bd0a45a5b6fd3e29c167b5e715cc89549fb40e2e4e96fbced9de4b4ea8e4018c665d17d6076208141a94bc5362583b2bbffc9fc8d79306be6a310c95a9b6be38ce429237b74c332e1ee1bea197917a1a2e4b7abf7abe3eacee0a945b138df1fd6b8942788cad7f116ed1dc5a419b1ce1fc3965ee17a3766ebd58c5ab61058cf6ee1f321c518614646cea26911914851c312f372583f385e79a1dd2ece6455dd30245dc046742a8b25763e6cb7e940432f46d10c5be70d81954067ff3f9db070df81cfc4da0db1d2a733e2770febf22858a766e984ca8b7b607cd749bd3a8ea0147d840bd24ab0022688bf942b651bc0a5651a479392eb507da1a3d9de2015e57b72ac1abcabe2c407ce6894087e565e27bd3ee9eb156d384839c01c5357df067e95fdb896b956906a734d5f6cf767882f2a45ab63e46f984030ad9a51b82e38ef8ccbdba7a0617f5ff499433d168a7d60194c076c3a66c1b52bf9cd0efcdc4cfc92b7f3c7a4dd0f7a12c1cd58a477a072033c156a7fc81ae128b9b3d50cc41acdb56b129ec2edb6d1b81ecd60737217382157ac1ea63e56c28f82c6d3facde849d4bb5cff9e749a88f7afeb464225d6f334c03f70b3da3bc743e7f7c5eaa46937c4e412a498ea1063ce4115d74565faf6f6f81cddac4595a32ab8f9867494e4793d1b5965558e264f7b65085441007adde5634feaebaca9cb0c4fbd33942fcdd7ece91664c54524f00d6dfb9563421527dcd219ff54b2578dede9ab9e2e01b5e5012385de900747caa4eeb772943fefffcf862be39080c2614c4d2d02ade05f30129d01007643e2e5105de0775f8f9bd63a83be110ac8b47d5c1986fad0fb3f7cfef8230b9e6eeceec85df2758631b1fc5bcbb91a3f8de6f7251a31e22ddf822cadd66adaadccd0a8853cda0ea06e2825aa6a8530412d88cf37845bc0443d3de39f7338c5898f82c268f60278d366235768c692946009a93d9f6f21ccd38b52301dab871016fe534b0528cde20e8d30bb8b3143875d84aefd0e2264b39098578871d0ede2cbcb274251ee0ce92ded6edd794089b7f9ad131a1ed69f349ab91b8d82f2cc76d9e3ad216404964d2a8d2e9226c3121730770cf43be4ec216cabd1c637b652c15964bbbd8bb22ef6080eecfac4b99bf87e16f4973299cfcf0d666317b178ab8c56b3ca8d7b0da257ae7f875db68ec2da25722ac7fcc1a1fbcfb3b8b771db8f6b4f9d079265cec3a343fa4a90c8281a3e2068d915fd4ccb1bc8a679e11595bd84f9024404e986316b450c87352f7e818a48083573af94b41571ac81aeef6c9c97436e622143bd2fdd82a54ecf0d3a254528c0218bc322cc72d5ba4e6e737cd1321b55145727772337b5667ac8a60b783c30130dd7961b2e63159cc9ef866219d2e316f5bb54cd399a4a5c3f465b924337f1f9d522087ef76bbe4a605dbf72ca09ef27274c77e765df97eb974f84b39a228f65d5558439cc7259dc4ea0b308c2afb7346236496dfe89a4b4986558d6822fb409ab59dd2d9552cb595a40b83aa7bd1cf0562bc97cf704f25d710799dbea51cd0cab61d3891a1fdbbe46343c593fca944acfff6887eef099f895a13772aca46265b3a87d4792beabcb97827205da5b93aa61275f2f619743caec9327fa981bcc549393c0b58ac2f076f10506378bf963cbe55b0f06c9a71c251d22990aee58e31587857028c107f5e610c1c780b378e78bb2b761aedb9e764cd7bc26b5425197ab833892b8454ab02e91215340f032ce6f35249517289ff62266a30d636c532f065b5540c1c55e746ce4c605f53f3844dfc12c24c4ab941613cb2acf8571219a1ad04ec2f5568f454c089b82186afa26a0b8d5ad36a79d73f1ab9a9ae3980e41ac827ecb5bab47a86841f14134aae92f2debb3813f315d909bf3dcc16707ba9fed3f471ad442108468661fcec68424f7cdaa62cf35a2b355437d42269a551f87866cec04d0e421aff55f7c80ab439ded71b50dd03365fa71167537fc450b83fa442e1c91de25c09d07d51bb1775e95d75e74420fa51c71770ae1c0830a56d648fef688ef9779406ed4b5e965a9a667947f28f241d0a22e8f01df4c18ef4e3cb5304ade9fe45747050250e64f9585d5de7f783b37ba9368f482bd5a4d2d9d1ecf819ebb0be6442a531d7a1c458078e399f37b4f251adb56b7c972355c6a0de6b7cbc740fec8065035d7166acd87390f13d5baf7d6edf176275181f288cb1b24242291d133d8838b69e6c9351f090abf52da73ee16b8a98c808a2afb0c486dd186e245075b1f28d70068aba8b907215901ac0dabcc3417f08aa1fa485941860865dc0d904d39bf2f18fce14030ae958879ce9deaf78b83cb4de9a57efbe56a7aabd834cfcce75123ca9f036f3cef1d56937a84d3bb92744a515252b0f3bdc9d82a03ad639f7e13fc8d6fee9aa8a561c787c391d237f4ad892f1d50e37284ccdf7539afa53c53bf97326d72d71a9b70133029aa169b998c3ea757dd2555180a4beb95825c6f39bfae8c15bcdb4be0a6cca7eea462f562ab23f53ca0a800d440746bdb3b4aeac234eac7acf05288181a72ac40fe2a8e0cdc0ff5282bc0aed6ed99b7f060cf92cfd8beea2ee30b2463bdb8ff236ac3068ca5d7c295ec61417fc6b802f1bcf425bdecd2342a962d2ee7ea00e1850830e5f45667fc150b30f0fa2effe1adac431da05b4eae913636ac6c69fb9666d889ce21a21725e444355b200efb4d9296738840e88ead1798cfe9dd4918ddf02c78dff8bdfc382287fdf8980d88b513224cf2afb3d73f248b99e3e97eb414ee266b3cee0d08a9880b0acb157fca424420319bdfe587734d568cde589bb80bfbd79924e3393ac550271e6fa13d70f8491a276157f5fd11ab6b09e94288304486bcc2b636c79af0d64496b7513f6bb34ae9a656e5d0e44605852076fa4c606e5d9131b9ac6f1fdc4e415d663cca6e76fa6a43483d97f17e4de38104db7974643cc068862c1c56b903cef19fcb16150c0b7c7c1172c58e388c33a1b55c728ab95954c515afba56bff5147acf7f3005942714c1cd3b24ed9f3b4b8418c5d6d3a3442d7cb0870f0a5bca6fb4ce31c87e59f320c34d57aff72e2c7de0eeb3998f4a5841f949909d786932b41b05f2dd4e190ba7284045fadc4c0b057c79d00d30e30aa31dbb02c5867fe2d81612eb64316979adc69f9e7668d12aa8b1cc28e7606aaf8a03f11caa67ebb821cf69bfbeff78c544759ab760ca211defd33f0018adf69eab503634dc2958a0231418fad840600b915ccb318193d0716f1206fec5846ccfbd43f985bf9474846b710b5456b9cc2275bc9bc83375e83c87b31668927523d50bff35ca11d8f5c2d23e5423b3a9a496eaec7145e419425e0b5644046c1a60b363a6e06ebbd668138ad4521b1cf09f591a80ed36ae37671b90330a180fc97be3d579940fbf9368de2178a087ecf9eeebdb81fe6e8e2f0549f7ca790d78914c4cc74731e092033f57d918e74fbb664d7e47760a6e1adfc6e67706465ddffa05dff9435eaef6b218668819274764123b4f1a1f1c16f01df4c102efa17752d0357de1184d5ac0b72150e56394c09a8007178f014905b420c81b1a457ef7cfa268cfb4b16216a8238b95466cb11e02824feaf841e7594a65eaaef75f6de5043db3a8dbba764e98add0dbeab420a93f874c5de458fe73e3b175df6c97052c10641d7a8ad310f4416ed84e837c6088e9685394d9a41d8b7e35fd49de1544c90c6113bb16d8cf6e7b365762122260a6c7ce36ac0e0c914e558423791d7c22cf505eb6debdc82c15eeab882e6214e018be2174ba8a3e1f0fdd87c9883d5e3c65cc8c649dcd268cb41f3488adaddde719ed5fd9ca571126cdd6ec76e9f1e831cddf9bb932d26586f934382e15038286ca068160636beb3e1af45c45b42976385adbc2c216875b1d4c6e743c21c241ab4c592e9b95565d0dcbef265446fa1aab340017c87a70a9aec75a8456e52affccbe4011c71287d69c6252acaa8ef47131f1403ff927ac985c40d724e5685c3f482acda6216710d83351c8671dc4a2e693398af92ecb0c9888b9a664c9d70054287738467f9ce13902ff41f4b8f1270eadd50f3a6f3e255275795531eaf8caf034925caffe36343540848f6e6f03033cbbf9c517e06cba124401b2c5985ea60eb52ad88ed9af17b251ba2ba3c59b0b2dcdaaed59bc3a34527f2df832a0d0d6b08cc2e801d332e445e921bd8de2b285d0e4e3d87b1d638aadaf75e0a265b5e1b1170d80bd73b8ad3342a7a981d43835835a62e1c73f3ec7293eff4e91607bb9a365876981a3c93d9aff0831380c6858c6c45c54249843ac6693d530f445dad5afd0f1b7316efc5262225b79cc44942a88bd00a1d98122b730cbae148b7abbc1a6a8dc454d53ef6ead421709ef84b5e7ddaa33c047b3902d4c78c09f8b91f4244068c3dcad9da3f3411a75380ff86d46b50c15e37da32d5869b9de60b907154ccbd6e667c4ab8ddcd730b23d96d0c841932742ec4351e58e6f878eb3d66c268ea3bc2745dee1e8e905293c647cfba938cfda9636868be0a645249fa1165965e02d8eba91860f28cedfffdf435eb5b9c5eab18956af4ea5c449435d6d2927b8206d9192bc0bc1a75f98ececea21d8087551e8b709279372cdcea4f5ecd29efbb7261040180448e293a7d2e71fa407a1962e5c970c603ac44fb4636b37582957b2b7eaf93408118a40ecf8175c8c3d4497df790407182a45f4ceaefb4df68294eec6f8308f5ad7808de8af5eda19d1ca224b3dda516412d2eb76d14bceaaff94ecc976b7f0a761d712825373a5a634245d2df02eec2950c2bd5c125022e6af75f9ff4448cc8c84c2e3081f7e4c1c3c4fd8439db822ac30ac24e8747269bc72b6c71e2d6c6a3720cc54a1d95636054a8e437227c09fea15a46b214ff445dd91a1c8f6fcf5878b6ed8e624aea8777549a80106e5e9b9428e64c3d5630878c033a0e14b5bc306102f380c1d7eaded4ad20b92660fcdb1fd8547d7fd7663bc1b298941b1b4bc15a6964feee961612cc398ca14a74c30982811db9cafdaac5bb5e22d3fc055738f42853f6007fbd198d0414621540386075ebef65a953cf072321d8c2cb8fd3b9f114ff88bca9d0717179b2733f83fbd6ef6b6f645605e3e20675e4b7eb519eb9bd0a50e1e73b8b93418a1677e4c42c371e720fad30134ee2ec4130fc7157f40817cca05ba1e6e585bd8aacf73c0b0ca4fb0de263199277e772594901418a7bc92ca3b787cdf103910bf7a25a48693501f0c1d3d81652fc7af935ec8aa70772d64249e1d68c1c5ad5705e67e9af387a7ba1faae7a69474dd10ca50c1691bf1dd7ba3cf0335ae341701db62bdf231219296c30a991dc370994a08c9204c00c043ff685dd26dbf4298a005cb2352fbd453abf8303739e2731c1ea0406cfa434550a3b93c486a8563de78e8f02bb2ed5ddb358efd6ed39a7610ab2cd00a4c5f29323a0a6a7783a5f5d1e43f88bc428841b0b46bceee1f60e52c16f2e833b15c48736a62050db111808952fa12572f9a52c7f5c31f77fa8159fa95e1d0a10f9e2aa831d98c8d8d2d97d1aa768694de823e78db257ac05fba35708acea795adff54fdbbd9caa9329601abecd27a679b75c53fde5386ca188d83c02097b82064337e402f58df7c1ba86466fbf23392b3c055fae44d72e5c21acf8e281e087b1952be9500d93c6d0d415c4b1fbea5f31dad8064ab7cda41b8eb8052285e64fbfa6fa12db84230c47aa582905926135766e87b4722d8d78ac1affd2318b5b52d37faeb2ac6cc36095f8de3be2cb7a8dda78e6642efaa0bd3d8866509d622adec0d6c1b628f7ca3ac62cd898a5cf870557847c6ea326b4cf4081e2bff183b45cf2689d174562538e34325b07524fcc8cce4cec5fdd8d74c9605d62f93e8ebdb4be0944583dc1d6e2aeb74b6ae978643ae71342e9e1072d717881d2c1e488e87d8b31a38e3e77c37c5402851573ba66482f175f1327174469b7850428a026d8545e9e150e8c739309bb6867f5a26d637eab865a3d97ed91520aa9f8ea9eb1e80ab7c4d7f5a095dcc3eed11427b4a02b9bbb9d7a708290793421ebb69d827d3cf69bbc755d9b7d90320cdabe81a19479639af5d8926d99e9ecd999333e110f4622ca0cd1d003394dcf4547cddc0fbc157709590ea56f1a39e642d0232cd667535b2ee233025ec1846f80850747034bc1491e5fd7b09c3133c0b3a04393f788a5f63d67bd70f45cf446b07e91da3797b2e485fda1f60344558a7a24c5858bd753b422fd568ef37992782ed90b811e3250e1f61ff01b7ef8020e55d76544c5277befc6662c5605d3a02944d6e81cbec2133a9ef3b9a686ee4e3ab58e8ddb1a082af6d91a2686c59b041ad900ba1a1ba9e867b078c3086a5fe8938bc34bf2719610e9319b2692a9f3e6ada18b014ef59ffe8503ce28775d59ec62347bc9ef646f35c099350391354d454852dcbadf2da9f74ff890847c6ccc0f304061d18d3e9d5d1bcb7bcff2ff297c48cd3c2a9930b3d55aa49856c2696c98559990909d2d966407e2dae527a39074863b15186fba55d0c33fbb46ac4a1e596bc647552447e9fbf93e70fc89a88373d8a19d3c29ce4d980b8580e5bc199b8d1f166f60e88e766c1cdb658b93a82704be97e12532141a409ce9a1767118b77379c57b00b085dc643f84a849cf4dbb0b00442a8be01b1496ea5b6f21c43d2f85ef6265fc58ac2a29247cc8ffb3b333daeb386f42b816ba68fa3373691ded54143ccc8473d279a00574a3732f7ca0217d431907e7ada6237ef2e556b04ef999b41fb5d4acd9145a54152367fc86ee509fbf088dddf2c486fbbce8293f3e248046739346f891cb428328e5a161a3ce49fce92410044922346c480ae00523cbd86c2ebc962ee95c6dc4d36447ad88668e6fba64c41da002e371bcc83d7c9f3df5685cae0581272b923ca29878e19fe6f16cfa72ae1dd24dd88aa3704ddc26e2164214e4b9fdc6a494ca7986df01c2196bb6062d34e4c6b29988c2b68bdfd96840aa8d6998ce2058294614e0331ccd2e8e86e5205a55a69db78afa706de10a4c1766255f9a71effc0a29f7c49fad73067d6486fbcde0c88d15e54f3153ce8eccc76a1cac24ba2f710aa16e1f93a1a235e628940c05b6a4ebc53073b767de18b5aecf118afef486fa033b451f145d2c03ebdf47fd8a6a1a42d05d4c2e28c6edd9c0733fe8bbf0f7d1fd1710cdcfd34eb82f80f0b42e05b5d40ae7fe7823deaf5af004d8cb50d8ebbe9b465882c2fd0267c82edf7255df91653080e94d0da44f1919241ff187219d33e385ea43cb36da7e652b3b5b9a229c4c74eb7f1a3011e2cc2edb93fdb00bf7fafbb28d3b5e4d626b29cbac94ec19a772eb7e27dcc38d6309b5feff03bcce8907f6b9720b02f08a8456954cf7718c04461c44ead0c36679dd414eb34f03f29d10db68507ed1f5d08b3754b4974feddc85dd22968f283fc83ad2b4a7feae9e1522415c7f0f818df363b01c1dc9405c5bbab8257ede9dbf02e10736c14e88b293481620719a27378c3ae015357ece9e706a8b1dc8fbb5a2dfb373f63e84bc5393d42d21eee4b5be99e6fe6fef77746049ea781930ae07f924b745b83862b6da37133aca7b6745c46fb035129352a45a7566ef3a53d5ad265421521fdcde90d29849ba7ca321206aa343902ad0efda87ec812d39f512be76121dcce4cce858ee66c743d37de0007e8a63f3ab0fab3e87a90a03377a8d1f38ee93c2b7ec561594e62b43da5862d51e14106bb162a5b54c119e03cd16b46d90b1567f4d5f22e9f8505bfe26d5affad99ba842cc72254a57465819b3484cefb02ff4324d7418f6d5d50727da163e032f275183a4b2f4950843a35cf916a4810aad2580b0de2328d41f4ff8f224cc15626a226da66ccb21869166bfb00c144bcd5d2113aaea3a6652644648b4299440a4015babfb199cb8b89eb599a956eade5e79e86cf87e4c05dc753c749407ca82189741db092ab2cbea875cf4a60335f3b61809b630e5754513b4eafe32da1e9e02bf6dd322f64155c1c17819fa76cbd196d192a7a81ec50df7ba0bd91681aa065cd0511cd05be43bd1c790a508fb131f91d6b71545170cba29c6c69665e01d6866c24635cfb50c6d24f83368342ef09936e31309ba3ddc3542b40aa63cf3ac272ea028a9bcf50b89f8c9f4fd8fab27ecc296d5c313b8c925ede2ca17576e428323b4476252e4a13752d09bfa48b6c15e3df8a3beb91f9c5237fd9df890e5af4a30bb9322d09f193a0ecf40eac9c3654f5fe88e7fd702bfa8c2bf5afe1ecf212d1fa20e1bd6236d709e286f55bb244f3521ecedc94e4039523f55f49c428442ae8a72cb8a104ee227c161b6e48d38ff676d8b262f5476040e0b025d0853bbc9a88192b927fb1d0d770f74b06b1b76c46dcc9eaa6cbce637aba6a980d1313ea76183061f793fe3df6a2c7e5badffbef0cc2d4a7272a3d781000874000c6dedb13d8e65574b3a766b6553b72b93e3fe81c85220da7cb4627ae062f90db660cdbae98f22c173fdcfeab0214fb35383f197113e96a0d2342fefa2f75e297a92e8c65b971e2338862af1a34b2d1eda3b44559edf38ad0985c68d032c45a50ab146d73e106905515b086a56a2efdd0a59bf7f20010a8a6c08021080101a806cc40a5a5e343aee2824b13e7ed4fb4de0cf1398b32fc5a5fdb22e7730f36fabf13b2fb370c2f839f5d0fb6fd3682a98d458a311083ebe20f8476b3abe63c6f9782b1e3e21e6cfbf16dad7bc61747f79a13313874ceab8b619f97b9110d2d07eefe65d7dfd3c347980634fe855caf2796d865a3258abb0d109eab7029d8453cdba2d0b99585cd8757816da59704f028b688535d5a7105a49b6c4bcb38912965e064b485f8599c31808f6b13a16ac2546a24668a3f1a9fb26b14e0b1a3dcd0250192fbc1dfb33c48631ce125084c4fdc2770dc8ec6208997a1bbc99f14eb2bc3050c5177d3678f37011484d7cb8f8d81f8f14f1b9b5a559c210e858480f9ae76408ac7431e01e31317858d4676f2550ea4a5e59a4da03cb11f68fd7091a1489a2a391616171a6ca733254f8d731ca91c11819e3135b2010f54948a3853b966d55d8c8c993e8ec1ded1efcbcbdadcb0468ce3cb1dac35561ed369d3f6b655a92960c4cf4520d0b7fd5505248d7cf9825c5ea35d991db943bb42a867255341fa9a9381389353c6004df18f1c629bf2de786a0291830c7f1f6bce65e2654f7cdbb3c4dbbdc4e62f7417e53d9e8fb1b8ff0ec4a9804bc2ea029561324292767c2c92ee5d31a3d1273dae232ceefc3168036e35723f0cbacf7ebd0a879f9f7bc0e24c90def80706379272b9384682a8d58b6cf28bd17fdc0a04d9e14b3330275eb50a5a9f1ace136a98358f985d549853045e5c0bdd61cb9b01bff8226a46b98734d51dac928c3806b1ab4bafa245f658c33be6e0ff4103cbe7806dea0f7071ef60a877757fc64bdcf2ab4bde05e9fd9d2145ff576cf0b3dbb4b0c674588216bf5e381f506895967ce837263f94095a537b5972dfc5fb6de8d99ea8b8be00fb04fd83dcb2bda36e420f9d87e43e0c559b95605a6effac66372464ae2680c45c67ccd68996e21f080416ae45bd621de88893d537b4c70223a47f8419ed20cbb6a19a095f2122b5df8306b2e1e665a5300269f399ac20a10dfa85252a3c8b70a47e6c11391cfed49f06425f6f140524cf2f23450d975b62303b4f2b478848c83e879222654fcc5f7cb0a34499e3ced1800722da54aef809a9d7654ee0837c41423145a54d1d40d22719a9f659156e184f406493ff7e48a0e37f31dd968d990a1edccebda1f6b55e6f9e46646b5cdad66de43718de1eba0fe11d43cf38a6bf428ce5e79eb2332d6e50583c7baa349301190d3e53f4495f07a0966c47d800dba1e53c7da241287cc77f5f6cd38aef7f91e751ed918af8802a768c536d19fdb15654c380171303378b6fed33cdf61c1f526f61b0c3e9e0cac4bb88de5fb55108f35d3ae47d9f8914c3d883b7a80afd4c2875a38d166a98d78169c448330b8a07956ba52845c1145a82f19fbad4ac171d17940d5c449e7526bb9f7190928123cd98d8a78a8eefde90be4ff4597ac102432faa1752b334b05b7d52049aecc0acc9934bb486300a23f5aea60a754ec895f1ecbc1710a32e559b79d2754acb000ee648ae5c782425ce3dc26a22d85575a8b02016853c471e05f189507f4ab700a5177ca1d501bbd54eb93e5c9ee92f79f79fc5377edd7694bca346cc67a4c0baaee03354f57b8d57b065a1b8df0131cb7583b1b6aaf6f8ab37839006f328aa6b2e5f8bc8488e7f90307a4917b9a0f78cc8b2b2e68d41363dd29d0f890a84f3bdea1cdc0f47fd620059c90524dffbfe9d1d9c48fedd4aed0c5e0dfb4c81b91fe9f4d0b611d4793dab526423dfab0d530dee889fedda823ec9a7213a7323503da49125cb9d93b0dd4ce641bd815a9009c9cd769f32de500358b1fb01e023b54e09783820bbb25e2009f9bd9f8fa8bddc64cdc90180edbdad11ba15674c9c8097428fc49b59643b68a11c6c0ba00d2a8a3001a9b1e4352b31c639a57698a18a049302bc95f78024dc9b9e8457723735d60fca2f0b5934360236fcf1b17c044efb507a6c3d69b05659f538eb4a97eb34636f6053f6619ecde2aabefe6409051c7567b17cfafff93111130a7f84270d91a2c758085cf88ea878e70ed4ced7f3641c67eb2545f2c76024735a274d3521642f6582ef7003840e7f012350fd514b72fa66f59bf865084857c215644edb9e0e75143b1afe221b345982588049715eb0042126ad8ddc70428928f47ed79579855383c75ab7df7a11e9216e995b1171fc55031110852e893950457e423f3bc861686908a2af5c65edb2e5c5716d27f0dc175e89099c8f3289042e2a0c7b8dad546a5097bbb0ec5a4487a97106e3b1f2cc81f966cdadf47e9fdec40623634911a9ef493476c39b3b15a29312668574853ad0202c24cead2e186e39477695cbce98dbeff3d1086144404927296824b84b6b28886f9e7924bb64b550c174dac2f806f916e78619d0b9bed92928fc9319361dafed6f682a839ea049626a74dd3accb61b028968d5fd162684a6357d5b221360cd8adde9f6ec52b803aa2c9d2f9f2cdd1223ecfeb212bbae78329f07a586fcd016f75490fc943a755ef7aec1fd5dfacdabfd71e92ffb00e823afd7c7c33e9c32f7fe0253978f7b654063bc766a23b5848a6b91d151cb8c7af5d49d2142ea518e2ae2424ca8a90684d97cc6c13ebad034a043fbecfcfe529b5cf75b6139cc4e1f3fe90575c4b8d06c07f4cc465d02f074b610be717b1123fb24245fe30c411018e4838b2eebc7c65663494790e08424abdd84e9752b0e689dc6539b802bd2daaf9bb9a24a6f322add96b80f24e79d499340823cdf69f67faf66ddc92055941b9991377ba0118ea86257132e7f99325715bffa7242ecddfe8051b05bf16f8b21df98c78f25eeb125537534032ab0b0de1b9e4c94064172e37880f05893e818904435d045369fa78cd80c2ca56779b461348d44615ab44dab10bbf7fcbb8da1f3757901a39dc4dba0de65b4a3362ecb07e81623a2d7b05685e197169311433dbee448ba93e80b0d0580e5ed231a4fa78251fa02830a437df8e76c668e7cf8394c3fa838552e82c97be755536da9372165d7afbb2997931d736d5388a732edb5aa54774adb45aad60829ea0b56d897c9060af9e5763fab6f5f231c115fe5ede8a6fefb9669b8a9d6f92235528afe5be1c19592e317cde339bc2fe9f5b6b40f00495002320fadac0855ffdb593c1d459ffdca721f624ef1d47d3f4e3329269480274d1f7aec1c86c9bb65adf4a36b06e6cad4774e7a5c5636cc6e9b1fe5ebad9cb30f5afc8b31ec16dbda5e3808ec9f5a9ad1de5fe8cd9ba29b295ca25a341833b33e1c8745eb44e9fb910c438545777ec875fc7ccd2f79d62f947c82e3f2daac82bbab2ecfa4ed3f39129e1c4a0f91eab6bc8a7303ecf55eb666c0039a9b733fb1e6d7d6cb0a852a26bc160529223f78dcfb388d6a0ef4929321bb8b561c5cfa2cbdb04a23d500056f847f393040495b7270588f2f7477cc90ed91093910b093ea510c4b96891380d539e1c971de0d352475838f22f5e4d10c089edf27838a0ca092c700f88401b62a8e62a9578cab647d1dfd53b031a7602751983f7a852f444b6a50651753072fdebfb67a86e420034492eeb94531e86652e08063233c84ab3121def3794d54189b08c3d55705f0af6d4e664188fc6115e985240238afea4eb1e26b91a0f451427b401dc1cdc816fc7f769ad463900d85563fd950fbe0a51713873fa97673e702084b00bdcb4028ac0a5974259de8657ab5b5e0df66c28c2307896103b142e4024c6416df4e4cb1ad934a348ab4a94932e75d063b71e8557e3bfea407e774c434afbda9a418a5bf39ee37e82e9780a67f94cad916ba6ae63735873528318180a8e7a9d60b366f2a8a05a2b368fd36685d1546d88218e7ca99b585e0aa228eea2aa8a896c77ec2569c9a6678e441f6fc44c4da7b3c8eb805e711adcd0d0ab0bc64cba3134a046752d2911748f5e07ec796837ab7787fb533308826a397686a53411d731d341127bd62d7a469ade421859f4fac7d3a7dc3f79ae824b8280489aaf45b7f1b73aaf82900f6bdf0340b9443f242c389449efd6ffed88eb38de8547afd55f7fd59e8c064126d094fba943369f5477d963c36fcad0eead625393ad7b2f903e7e0d9e1bf43618bfae9d5ee9743c7aa7480120cd134ab8ded4125373a76a9348748e2b9ee43ffa54548ddd175aceaae045fd32b5e94c68a131c41fbaba16667d2fd7b7feff6aa5596fe79dc5ce615f045060e625b1c285173dc9a73b99f185d4f2d279723b8ca243b95be151197da9b8597377ad361bfb0a0d410919a6dd4a3286a25a8eefa296a93fe629d8eb688bae4794f99136a78d698a8df0933dfcb5d0324b6431d377597cf0d1e24d44be50da7b00153201b21d885449cdcef7e26995d4a94227a69e1eb7e1405d79d18c4e94b2c9ac9e2b23c7a94d58f3e81a6e4b314ceffd6f162e50d1e23b846049a3a0d3bafaea480a85ce017355cba563cdd96c99183affdfae9dfde777b66bf583c41a6d3a7ab41380ebfbd63ea9181f0c65f0cfa68dae9395a7bc11cfbd5f94f1799a501554c5a8a3226712753f9f5825a50620fd1c5f5723bb34c2191bccd6eacdb2c3a0368d6f8d0c5743d25f948b9a80c915dd3edcdff42ed57d2bf4f8aa477aa7327260ba52be9d409abb573f56be311b55d684f637590e52433bd3280664215d502120e5fbc3f5763f1bd5459233776a44ec8e0348510330d8f20a69fd03962fc18422034507b0e4c3d272985b72aa94f561c4841526c15e268b1c6b8d4be47ed3ed765da7b6843605b25b1ff3741a6146f6958698a46c0f61c10c205145ce2cf79480199c94d92feeadce8a9b8c34b8c87c6f807e81d3bd002fa4945d012c1b1c2e5dc9d45f52f64b139bb436339ae7a1c4e314142e0771c28e27bd6867a53cc222848e0d292c2e70d9bd5cb1d3f9624844fbe49fe02da09161a4bff2ab56d8f1c6c3e71f8d73e706a7636b9a0b88826fa8ca7b121c5e7fdca80e3fb7c1bf48dcc872655cc5c6f4176d3559e687b1244836a2d44eb70aeb1b54adbd771984ee7ff0b415b98d5d8957032751bae77226196c48068c4287703c0beb0c20adfb11462c82f9d400bcb9317564292ea9afddc9d177b9f8386dc2d2f9c69b02f3f1fa2e7531c6c60b03447f5b98447d049902ee5b53ce9a9f54830a216ddf576fd2e17b5db6132c64f30880468fca4877015f0a28ff55753b1c535c8170335445a27cf6d07cb3c939d3c0c3d679245dad437ffcfe59853eeed91fb83ee49a4f5649563ded657a3664d269e902951e38e9c417c40fd6720c7afa30007e00710d9f3a982ca771cf6fecd32d7596b86158c363becca480d3b80a8c0b7c24537bb607a2ce0fd4c1883f4da984b8d125fc814fd6561080a5b202ca652c4e2540e8a8d48cba462d61c5039c6865d5233e36de07f4c615b3483be1542df8ff8ff65f86d61a20215b138c2b2b140568b66f216cdbd5a9a0e3592e94faba56e4f168740aecc849ebf695bfb49f234bd649ddd63afdac719649d09dce8a0f647e39906217fae1dec1acc9585f76ef418a4da92509e1aa3cc7a0d9dcf8415f0f12ea3b248132168dd3128eee5692b7d2223d6f45cb809fda742309c1a19595340e46e4b677d561018260edff6ffef213acfe571496f5a3c6e67a350878e0a453a9b90feddc9cb50eb919028100fcf9d7776edabfbaf25accccb4bdfd10955bc9dfe43e1076a980aa40af6cca67b53a85e2c343e2e1992415b73e62ce5f216cb6d4cf77200d6cc4ff87e99236dcd4c7a0ec95c92431e005e6ab49304298176cf475524f34a6eb5df593cf841b844739ec60e7c3ffc2b6f581c473b06251131d82cf1e6e26b88e2df00cb4e5e0eaf2f17700b58c674cac2ab08f7342bda833b219a781c072dbda63369206ae069bd281f1d886807ed18fe386a9fde17b18774025f3c6cc9f97b7906c2a8620581e94b79957cabaab202f045905c60f8a1c78dbb74ea34ed95ae7a1f35f67f30c2caba2134f4bd32cb4bf81e2efb72e9fdb8e57a940be50df13d04f39eeab82a8f43461918f71c8d175b2a7fe098f39ad15b26b4a04aa863ce508e5796843465b81477cc56184a9905bb325b412b359510ba169ccc0e46dc4567734de9dbaa1deda791b90bd5adea2c7c7d4ff42024430778adc3eec32115992595793c6cca2774e42e714418a6d84cc868489db3d3c1d1c934cf9c2bcc43e0b1a7e85452bac1041531e5d9206f514609b98ac3c7d410cdf717128bd39d0ece6f4d377d6eace3f892d6f973659efd1183a3a9ecbdea46a6af922a53f1220d4347c8268a784a00f1933af4f9a0dc251b3dbb3758e77d3914a51ccebfd593b07f4140bb1e08c32ad367c193f5322699b121557c2b732e84a9caf5c77bdffb3c6366238c5d5dfe6f060ca8a3699086e1f6494b74b02f49caaeaa880029005a0552542b667320a05d90f37e3cd4d1d221cf2067b045b7255fa50ba776df1b0fffeaa0a046d09a8f13520ea7e1884c5fcc1d1c82817501649a30a6df415bf403f528d7cf5b127db1805fc2549947a3e8cca9890b0fdf25378d7d136eb44f0e2aa046cd56ffc7026f08d9c630f90b750c7e56b22b971e06911946620e613d4140249e6a2fb2c0dcfdfa0c96ee8955af10f1d19a06130103cb24871a5ea018373992df2b1246e544dcb5202fb9c580fd626f79781fd7e0b4d7492aefdd5508287a0b109fb376ded9dd58ffa47a18b066069d4084024e0b0995cb6b9177ab2467af0ce72ed0f9f1f591536a17f9a93e2e4a25751605b2b76be006d6e1cf48f0e39bca6d361f7f98d52776737a02cc7ca572683c953196585168037ad5458b62e41d8540c2987cecfbd2154afcefb36afee3dbc495bb451a9b0efb15ec2f172eca85463161d9fd4ac57098d2f3830a5f2ebb0daa012a443463fa44f5905b30b26fa9149f8d860fdbd80203c856845338e72a7c1ca48ce784e83bfc3474b20d42416ddf9be1c89c76bdf1f9cc39966795ed882a8f3a274a3426b0ec6a15b3d63a8cbb4aa27ba80548a56b0a3e924d9a54974f7a4fb7d00746d03fb458829569029f39e4946b8c627edf9e41fa4cffe11969212b4a0f35990a19be5c07356ed8afd41080de013502700a238124f0570b0d371f861f6af8d093f562734b68db1b2997f0b3e0c2ce1aec980b2a03523a73f8a065dffb8dd17515f0e8ac4d271a627f6cc649415650b309d89757dd63448d97424b0af68be878b6846efcad7779f10a6ea484ecd9ec3002895f0d96d65a68c81b7699af28b66cbaa528a102dd7bf423a3a4174dce46af6fa5e98aef0105e244dffea6d8f2f1e10bcd69cab32ff7b455479dac07dd402ad69f934c549722c48980aca5582322ae36befe26440926290affef1748b5eaef807e847ed68623a4407e8380efc4c706d0fe0d103803efd7a0ef719774d650e9fdf7dd9b71beb45427d2d6f150aff61d935bddc60b38d9af1530f7a0472ee220336e96da68b29687427f09a94fc47f9d7e078eb92a3df59870e0e02f32f53776a5d29c74bfabf82fd46e713fa7b4c3544668265a4db942102b2f127eaadb57af5981ed04f2c28e7d922f3b3998dc7867199d6e4cb32f4a22b5824f9c9c01067afb3277dbd0da0c7a4f43b1eec362d6ed77ac014cde31f06708ee9bd21b709e874705e345955a125aa86e2f74d5311cba9a78219ce7aae5e392975e5519971baecd602024bcaabf4ef37973d488486e0fe5ebc30c333636c5ca131faacd7bbeb465c49094e485c672608eaf903138b8736a4f4bff230ede9176c349bbeb932f27cd3e0a0d9f0a8d5157912db833b0312d4a1257c4bbd9b31c3cb80ad355cd2a4f62834aa552e5e047fdc23c878309c9c80f626789e998095931e9e6512047a45ab4d730b75a68c22053ed0d9a2a5edd4a9caa012b03f1e992b42dbf8964036401b56ebbe680b35997231548a8632d6f4702fffb3dedb575ff0aff2ecde771a8c529b67a9decf40ee476a90a3a2f3cee61f827344ae02f3547b1e696f1128e58a8c1fd7e077e433c0a35aa7216bee91a9277677c8c2bebb3cf42bed2fc45e0ce406437d209c01c3f1fc27b61acde25cfd7b40f1b2722e1a428d05913f5c4ae9bab05de704d060715a5e8bb298a68a2231d1b08702cd7a52420205dbab9daffb0505584a6a9f449d306475bf68368ab4cee06597c703a89f4ff4dafd8317403e7d781d586a5916eb6f814ddb0375ced7d51ef4650ab2c48108ddca1f01b01800de41a5297426a54bfe2415b0a9896ccc4f3b973b45e0b1a4fa59f430e8e67b17d03368690397a457dd06be64d0279ef4751923332827abf32e7582697d655bcd3944403541d78bd5e5487623004327b3a8d984b6b89e18f2ddbac928e87c55bbea7c797a9cbc681ae257b4e58658935fb1ff87deebc755884b420fc77949c523c59f505740290e17501d871b4331e5a28e8c00d875302a306e819e3c8b915cfac72d5ff52ef5162f5953355792959dd5d4be46e54f9c38cfe9fdcb71fad9b0a02eef0ddb5329134d313a087a4aa49e36ebfdedf2eec6a723d565ba092b87d4528a6f2ccb2cea6b0f3f7fafede9183b24ddfc42467e7cdd094a2b1299c81a6fe8b7f13a5574fa1b2090c559724ad90916e0a079716f0c720ae2a22184db917945a4192a2f9765ad12132c8822fb4173120bdf6d91baf67864c8b3805fb87b92832251b45f0452139a367b7bcd5f2cc071836d2fe2c2f982d71632e4bed7682611f7e91c58ba111ba9e36dbcc296580b8ced40a7670b0759492e765edbe1f33ddc004a413440fb301096e55983fbc58ab1b420e5023303d7aab8e6fab1206044626f38b60493fa0068eba6cb974621d3152416a07637eecef4ca3e1895e2e5f79b66fd353db4babeddba2320f9eeb529148b15b6849c24313b17beff15bbc7cdebfb9dd980edd6a246df52bbb9749065f4d81e7af3daaa209914bbabc5bd40dbdb753680140ee05175230b74cb8b6c30ef4862686d18a332b41255a29eb37e9eea2e5cecc8f29cf0605c55b0b0b9553e231089400c0adf629052c9856ced87b96cf06b7aab580554e5c156dd81d564d661e1a803ca185f8b8ee7364653f827e86c2734ce9e65912b7239be93363980ad87190a4c989584f3df6940a9d1b6f9bdc4f75cfbc21566714b2e4d51e61aafaaa2f9a4494db78d347b6e93ac0e03e9a92796b3bb25b0ee85eec95784b175eed0bc6d5b502f11d3b7cfdd78a7dcd3959804a8953ce623842988c1b7abe04df5bc4d6ee90ba24ef4d85e321770f1abb8f39729d881b875bbf2731e899349b7796878c7d727855261121e33293a5e5fdbcc57134b8efb2fe0eb31ec34702913eeaa377cc1fb135a9495a0a1667a88de6086fee22fe573fb4a1e11d66be6168709333cc516326512e2a515b6ca9b0ef7d31096eb490096b32e57ddbd73fa334eb539b8f1a5f45fffe2d7c85c124588b8e645058364df45013c6cad1e729434f90f1b37507ce459f33ef77fe4644279f2cb398945c286fb4fa2bc1b5e44d5cd69faa98f6f9b9f7ed7e8f6982922b1b332a2e26d6ea9c14b8a4c403e449ca832dea4406f21399e5d1d4c45feae6ed318a7f40667b3d96822e7a6efdeb88c04e80347e73aa3cc3c361b455f1b5b334c32a3d32528ef6ca28b5ac68338627065c0aca53af1ee66880252b822d59f8d099c122906e390d7821caf20d0375082e83d548bad0f6b4e424c576941bb50234ac06bd2afc2f4fb9354ca501e273002582293af82559821a65257604ac10a2d2cce3e39e9028a29cb2452cfcc1baf2868c3d32ca3919232caedfd4a3c13309751a6b4189cfabf442cc938064b6beb754dc11198ed29e5c5ad6625e0e0b8c37b37a2781dd45c936698d51f36029f93fc3fb88d8792f998c0cac930043db8d262e6347a15d94dd128fc2b2e50c79e7fd039f8cec35dcf3397ee44c9e21dff66b4daeedfb4e6b4a79b723b2e2c2cd721587b99a7d41274691be7c8b9f8144eeccb453954ca11f7cd70628e52f9cc7eb2ac6cbf51a338b4f3c868091df803c81ff81a9447c9ab0f7d4317ea1f9138dcf0852efe907cbd28516dfb6546f25324053c83b0d0ab9b1b4ee181c4a7882775fc708c8171f3854c4ff0c76e72b0b818bd232f3aeb8825946d793552b3a79029b471cbdbfdc7fbd764cbc59cccaf67ee5cbde869e6f44701bd62c4c604019b9c4a28426137eb55c857ef92304d3d24134ada35ebdda7512067f6bd16d7c1d1ea6e0ed8e27cc395c5131c06bbe8d5a94169eb7e80b7779beaeb1d552e545954107e2decf315840c30e97fe3ad177f487c8a04a355e5c1f9efd0e5974572c222a437b23e62339d2a38b58c7fd0c0892ca2c5bb198e798fce395ffb5911cfaffe8a55f23f7fc906596089081850c362e64bb6f69ce3296801bd32db9cd1edc6f0bdc03796f28e9e6ae92afc4cd390f0b2c94c34e3f76b28c97c1cbab9b16bb1c4d680a840ad05c3f40a2957ad8fa1d49c1940074ea55eeda292cadaf05edfd22317c9d48ea26b708ef6db48c9d8ed968ac138e9ef7373056b7f98505f27de10c360a084c63c82ac0f3bbc7a047f8ddd16dd063953158369f8ed48dc878cd1069fc2f7d001fc17f956db2000718769d7eac07328a2e24793fbb8dbda5f8b515928885ca65e72c544f54d07b3a6489f22202332396e37a02e15796e6e6aa7c9e9df6b8cc2a34194b6cd734e59cb608498e9b41bf5d23d63b9d6d15a412ccaccee1cc74d9a0e7e164757dfca4a642b75f44a1d88758db6a1b28afbdbbe28bc3a89f21c08e2a0c941b5cce308421f0bc6a62455120c4c0af0238ac5998c02fea7f42bfa239d01e39007f2d53e1ae7e48789f883098c5a0f5db3b39a51e109312f35780f526f532ecd428412127d2f7f5c7a9ca0df0635e557da30e9d86f1678781bb95d089c847393fe51bf3fbdb4121786cf46ed1d2f976a446ae230842aed51786812e6a4e43d90057abe8843f8c30f811065c6e49ef26e840c463b560b3b892204fa2cad1f9fd3c6c7a25dd4db956c2f5bed0d5a2b3d08225174a108af9415e70c61862f3b51596439a98087a66e4352cd7d70b4a8b9f98985de6fabf8cdeef8ec5a2e790ba3007bc716b72bd21b8962ca9d445abf4ab1272f3194aa397e0e57e790e44cd6b16cdeb987b948532924727fd1eb25a3cec752a175c599c1e60af1aba977c25118bcf67d242b682a646d03e50fd2ebe5ea61a627603432833cafe52d6f07e1a6f45e48216bd057c25d57661af31e3dc27a018f156a273b45aca344c665ca3660b46a281a37f29dd34cf09ade186e3bcee512393adec99e1a6eb27fd4eef5a561b3a6bb2b7d6b96fd48c35aae4301f65a03548fc33d92a5ff035c618028852604a91fd31c3bf5953942cdf511c05649c84b7aca3aac5e1bf74768f926834b415eff60d5c12307b81e4ad49c22b4a9c6f0c6164504121074a1dd20a202fb877762c313f1484bb39ef5c134e705477198a5d2a42548836c9f6585fe629b287a4125b668c91d3571aa689ac66c40c20b5a5518192a0b1a458baab89c5ae738f9592b22770b647042549b23080aec0ff3f08ccb2cd85eabb18c305f06ed0fd29bdb0c7933bbe0947e709e056076126f9980ca51d6e172102d66b8fad996cbac4b70bcae218abbcbe9336e48c5c0154a6e0dcf3452e28c5018ad24ba6110614b851d24ff609673b176a62647e168be9db8c688672c2e3494e4e0553cf7d9c4ede27181a5e670264855a459b20d0f62e4be811ca87cb8681e58a21f892174f1e3b8d3fc51377cac1a6995ee6c86f5286bdf28e8266181261b13680c82a24b6c7b5047d9306ef4606dda5a1b2b8d016b585aaff23985c5d18cd9a9e03bef061c4906b0a044ac990f090bd037e86559307bf0d3b5be515b6f0b8aa4f4e582a9de1fe040f35d542c8afc5823b1ef4ecc612fa3c25e1226064fd4e2b9f88475dc3fa7058ac737ca85dc17808b649a2aefcc60c0b00bb7fe6f0794fd285f8afd029d8f0e23ea5fb9b34afc4bf5957d2b36c0b5d6ddfe2f17188e9c2bdb3d183c38002e1d18e3bd4723fa6c70be85bd26e3eb7131da6b1ec2ff3954b019f1dde9cca69d50d1d9b7469f210b1f0f9740756f426a194cdb0f7a3339470e539eda0443c490f6071615dde096f6b3ff573e3ca7861408b5dea735a75d13ca8bd5852249668960cfaff101c575071615a1f27942c93e261f0eec5ad3fa7c4e925999292be2222b1da928afda55cf34aeee8b641f8a1144a5ccc5da6c8aa23c7c937530965fdff1da838d11f7d484384b544ad53ec54ba544be0eeb27bd5987dbbde0137e10b907f7aa987f331f736638770cb509055f5bc60dc618e66bc15771d88efff8c9c6037c26e4216aeff0d2b341f48c6ec00c820ff0c8e69b83b81d59648f2f043f0b48a70e70535a1446e3c7c9f5caaccd3f98fe95ea65ec8ece3d9e7b8e836fbb1e7a44bc8d3133a1550287515f97bcaec4538056066d8a1533e00db804357404bd926fe7f193c7b41b8fd0a944c1683383aec9dd0476cc62a2c7010965da2cc016a8c44df0ab4741a3c1a52f8dd45b30795a531f02be86b851e9cfff65ee5495fde3aeae4d82a24a375eacd7a71cbac5299b552179cf89cc48d325a5418a7f8964014ffe2aaa2234f12c3e10614fc5fa4b9da994c05ca75c78ef29b3147a32fa4da90b7225702c793ccd4d68daf326b85e60bc28557109b400718933bdd62081418db176c5bd759040b7096682f592bb94b889b70d15a051a80c41800329bfb8b41c59d3c4f02494b60cf77584f2899871d6dccdfcd60fe0839d6a5d604b41358b6ec2f6a71501937d3eb250e70e8c19483a64abfc2a2624dbb63e2c81586417cd0487452c2ff059238a6eaa451ec44cdc2180c7a03f07ec146c19dbccc5e1e68f2ff5402f54630a3c5be17a2c75bc2039b301b3defc3efc291abfe98d6db6cb1227583a0f7abaa903543d4c9de3fb040b6f064a71f81cdbca5e389b4da240c135065138887007fea831b91ee6299cebfc03645181c726c72153a6bbc9ba9a6f8c7c5850475b6aa0a9f1eea1288a64977ae17646cf8c109851116d98e3f4f7e9ed2f3f5d8ef319eb333ccef576c09dcbd0f89c648166f17bca0aca799feae2a9689da6f5a956637d5036b8522a9b9923a7ad360539b00aa79ce1f1d237325b348bbede44258bb2f8b1b7119c174133c9620645e89c8fdc8e5d5a6a88fb4f5c3a8b5f050929071ba99de3634b97fc535732b655badd7f5f0ba5ed1adee9665145256f20d3a92f31a87f9bfe96c0a09307c438f7f52c7a10445022bf1068082ba37f6636beca13e57731851b118a9fd662c5e0a5a41633a68464a95ba241b97cef5d6aabeacba3d5e4e18d1fda18ef1b1bc23dc4226a3b86d32c84ca56a883012b6ac8196180bbccd3a347a55b9fc6bded44686ef8ac416bbd03b1b9b154f70212e5977f60d804f527497928abd372d220beccddb0108a7ae7ff7813eee21e4fef72c15171e6d73d13b4541d7a6838ab9394c5ac8412c35e7db7e81663b7a3384153ddb2ec4a67558180faf5691a02cbc15c03968f85fc4fff191537c6d5f77e8ce36e013d75322685e845fba008dfb2dd8771175bf0f9964106c9b7c04288a820c134a68a7796924e6aba6e6751864cc2a1943cc1f0925b79bcfd2c2cf76760e0072cfb2107e7d3ea41c349de9381c3c263665674674188c4d5bb7d4efdb8892d986564ce342edd93f18c28837e893a1f80c5bd0ee0a9e42d2005bf018b3448eadcc5364d94c6b7ae4e1f609029b5e191e9003186103f2df0603f6ba4da24702fef16080d24cd1a59ac5fda327b93f5c7e8cead87770e562da363adcba4feb630c51a839ff8d2539481e7f4f076afa835c69fc90d01886ecf70c70a46b4f1301c75feb4f6e5e2f126acf82c9f12e806af04e25290962db5c43899a77d0b8d6a7193bd3021297c47c067bf744bf6a1bd9e807e86f5b871499149ce57a72683cb710067fcdd75889d46bad7ec5463ccd75e45ae85fe6d4217da3289d0d9331ce1c9926f7f7ba335609c11d5b559105e79d9cf461b3cd2583440e37ae934561a8c2a7ee40bd630a064120a6c4648a11edea0d0054a8521363f51979bed301492bf4f458e81729bbd53102c3cafb6cb13837c8ccc0006c1c297f1cdcf38a535cc84f767cd99870db4535eda39df6c9c92352aa70c3da0355c6db5215250884cf1bc144058e699eeeb95eaeae2775cfefe23fe35e2716774e5af0011b31ed56b2aaff1e6ccdce673f124445bc8dfb04439e157097e1f3f97bc26aff6bb015418cd9476ace0c832d4a18e3dc35e293cdef1bfde508be814db448836a0950b23b77bd9413e0c5114813436668a133cad7086f93593612a81ab62adbe7d4f07ff78b4cd7f88f71edb685e25d33c800012f68fae51bad93a5cb412949a6283b969dad2647ec8c729a6ffae5b14034a28936b09c6e8c8180455c465adb4535a3e1165e9a3429cfa7b406dd86016801b5a0b1027562d242cde2fc14bfb440d20d99d573fed25c00b86fdf767d5d7753b4e05b4a05acec2be60f97c998b3a6aea27e6be940eae22da331a82243c1538f7d264d6dd1962b0c499c9bf9d2c4a2aec9b4dd7cccee9dc91c9044e0ffbc5c12bf699ed2d28f80b0cfef6d82bcb0fe543b61ac72bad344dbc023a86243219114f25d72cad332ac3500c32e33a64655b78d5173a4afb8bbe06b01f420f3fee36ed0095457d9de9de0d671650c04966232ec44a734782262c0a196d90c56e9b61961a0c37de2f7300773ebc701706c069efddb84b3ae8937e0a78ca3360b35646415fe38fa64308c0b8ae17e9bb5c03b12d72527efd2f2ca3602793c3901115aa38ee7947df0d3bfe474f893ee830322134be25b7d85c763c504f75849d13689e34781256836f60a2f5eb63da12f558b65dac6539610549743460c354b90ac2f2efec8b4c6ef0a07caa9e1240b402d46cbcfcc5e5394aee696de938c33fdb4b84370460abf921eacb3ee7f2d05cce6f360a19ff80b6681b4c583c7b8d13c99c8c191214607323f6ec9af489bcbcc196d5be57c4ca58071c54e4e6f6ad906cd3deec8e789e0e1af588c3170c5bde50c21565c538c093c0d98c6f5084790fe65f82539cb8ec898a819e14f986c0ad5dc6c7ec1087dcc6e939d4b9cff8407f656f59e7fc72e159f29ef09209b9de142fbd359c7f6882bb6b105fc24909defd74ea2102881b237ad6ea29d885cdba8a20a769869ac985aa7598b4bd1e98b62ba1f18115c091b9ddefac8259d295f9faf5350f7d3f5276f80e43ef803d2b35c167f10fe37e4e4ae254e3bb23985a96fb74953353849100b8eb7f230eadbc98dc9f8132de4da07c7d5eb835edc06b3c2c315246e79f486bcc02a5b06af8332755c244fb8f005f64743c4d56f43f291808c6620592d5929b83f92650f103646d76428a5214f5f9c635be70e881951ce3dce230ebfb755038a920cf13615cb5e53e165f82a0d28bf366b42d7012986de1793feef26eb1fdb60702a32766aae9696cba13e025caa3e740e11c4572c3f7b0a90c3c82894e31c0430ed26faf752320b993c40e92c567acb44e62318031bd1f242d96614680af9f88e3a7c64512afa9b4d2df1c17c519892a80f3d321d2d1f8882f5f53841583af3e07d4a970e2b2b42d2c6d353c0721d7dcbebf98e865319bdf173de289aff3054a68fc4be5865e8cba9568a7e009dd3d80071086476ed8bfd1badfe4c24382c32bfebb1a301aeddb70954de1d4c9dbd1bdab8228250fc30840d600809af90686cae00ee76e7d6647321c970aa877eb85d14b26224d945e355188460704c85e2c992272ddc1098d3f12132419dc0a6f9fc17917233a2eafb073a730f1dcd4242bed3564af01d88ca17aa08f49fcc0ce4cfc86ba337c90e731307710b0325abddc7bb1cc7e670d83bb15e0f7baff02a36a5b40b69b2f8cd9c7b32b5647f15b5dc683aa29b14b83d12d1568ba39d2497ff19b15ac464ca977dce2945b9eb416f41749ef1dea511d003f479a3f88d080ea09f29d4291ab387e9018e8d7ab953719853edc8c2b4daed6083d769f6f07c7d46e82c7f53bfacc8b1cc0137b6fe9939f2f7e84a4775ab7ac39258e0a0daf9170d74e6c3f3c9c90e56a4d8033ce2c4f7335f88993ca0a24c8d42feecb35c7b5b1b4687761d7171a3deda275c00b32f9e6fb3eba5acd553afb313a9da58e4de220034321b3cc1f518352c305c11c2ebf1f96f986c462eb5e027952d6a832de4f357653bfe535f032a59d0bbfcea2969909c99ad35525624d3fcc28e152a8ce391bf2c6c6818ea36adf43b35b165e5683c5bf50013429ae5a2e7c5456e5f10c4413332b008a2cd8e677f813681d754cd5e3ec13dbb03aa3088b61041e41764ba3e7600b1f8b5ce9ed9166686de05f5c7928fdf849bd0a9b72aa0f46302249a5ab939416db0af414e47f523f6f7613b63547ef132ba67c456685cf6a98c90dca0cdc9e68dc328c4aa8ec3e2ba7104290e06b2a92ef53e30cb24afc5f22ebac8273fd0f192bc13f6b50a980e7abe55e5f935ca43d4863944189866714e9c1a82c8bd586360383df92d672efb7cf402df9d72d10fdadcebbbbe4ea0f6ec8b72743adcb5fb14c31369f3210dfc8d6b4c5e19e63e56b37a5a8b5750a0f7f16c2818ff0cbbbf9e92581bf655b0f3df8276a4a7903596f1ae8826307fb7978f9aec6bb298bab4f8ede3cac45349f70544c7aee8ee49f928b7a7f597776aaf68b254247e410b429e7d936bd35ec65089ccc2aa86c56ad2273ebbfcecbd752d913dd65f62a5b947d7bf63db3bcf608053569fe392dcecdcaaa10031e09ed45e5769d6f8c3b92e128e570238d8a3c641621c0b331156bc7e85ee4dfe4ca05da896c5e557375130d814f647c421dd6b794963c0e49309cd13ab6ea0abf7d2baaeec32f733bd39988a6a5298dc31c31bfa0e78af17a87cda158dd2b78e7bb9ff12b91c2c9d67c555098c1b71c79651116bc2d1312704d885402f94b78453a1d97e82f1ad413b940be527c51bcb81d108bf94c3a9ee5c04b19a38e933a4f6fbad24a4e0690ff184ef095f18e0c3ecf87fa34097b37493fb8794bb07036406159be797350dd8373fdcca70f39be4d8bec3aaa1b9b58be42f80e0fb8a82fbf1ee8193bdb15e21e243b0de385fb22048a916a15d04554eb214b81f54bc04ac6e290899718687d6af490756bd3bb55cc6d0e530068d54fdde6243a6170026c33daa82bc736a7c77259ef557656da3a865c5de70b0c65639801719ff63c18547f64c93ce4c58243186f52dfff9556088e8f3299f048f0ed69bee21fda64aca7d92b344c1a7f921a4e90a31747bc110165bdfdc0d9eb0266470cd3614b5d003d9f45a1409327629548bf7dbc556696857112a445709731d17797932d337dd9cad8ec42525dee7b35001c80184d3d03949a99816571a809877627bc3dbc341d86d0ac9c659ac676b5428ed5850ecdaebe140fa8cc4760bf15d886aad4676ee336acd467289a26909c14826a4c0cd07886e8bba864c10b8e551038bd22d62547377320790a55bcddfc15eec7756d1faf95edeff7d651c152e9eda95c7a4bf3a511e8c97556f26556977ac193cb3a072591b94a06757905c2a6ae0d9cc817312b01e27c275eb309a99cf45dc748678ad52b872b05a465e82d98a913cec8506781ad3c74235219500a9a3b8bc5f4ee3a1e4070d0a833186dcba224116011573d956451f63eaccf12e3c6a4651c21fba6dfecd830aeb25ef97649ea884b0f8a8ccbcca14473e6717c659967544b1aa2108c16ef9c7f0d90517bfdd36432c8fcaccb806393ce1eeb5e5bb558911da71be13cfb83df90b949f6a64d57656816f9047407759dba413d0ca941e20aeb3e131f59a81b835a32cd8233f4c66e5fc4fc8a79ad8ce8d378ad52e342e91297ad599b80b29901d996aad6efef50c9854871a2d160193f4849efaffc8e8750395f7b12ddc613a6697b74e8d72f53d8101da5cd4a54f36d4d924c05704a9da68745745772018e9ed8bd476b930d0f9f92c7dc3abfce9e802a47b9ddafef0684611bc7e1557ad82b34ea3f627f4b8941c4b457616add2d40368f1be7bf28d03a18b583b6f07fef42891776b11712b99d6c89429152e57fb96f17ed56ac10ef48c6fca8922eb191db4c23f44e1ca63906a4d2786a5b4957007ba4c75ce00dd72d1f798e654bb936ea0ec54d2b5acdc95d8a3f8c55f516ecb1496faa99158f025ccd5a3f65e976b5799f3dd22d84a1b46829b0882d154ed55931b8e48a82715503c1a9f97b4f3482ac9959372ae55b1e09739b7c9336ef5fbfcb68bf31c90fb4fce181fa2ede8cd3e83357923a702086dc2a1352eb88d3935b1269f21f045cb3c9f9c6fc6e746ea9989869eb9fdd5067bf72af4ba291ca235c28b645c1dfd22a709bc4499f047d9c46b54ce020aa3a9ecb0b54ad95dba6e2dabcc653b63fe19c77fa368f9e9207588b33b85f9d3285697fd218c3e89295f685ccb6120d600de157504424b108c5c1f799d57194040f08fe83ce748b3d9d0b646b8b1fb9a353ab9548b2cd34bca40309ae93be2a051d3dff8ee4e6673fba5646eb5f63e6b32556d3e9d8036bb55c5996de9c0852e93dfe79181c91717f44291b99387ed41569b23e8e09789fe3e4b36df18a5e9518a42d9c5a77d0973299abeceba15f281e70cd5061c162345ed134b68340c37a60d719115d2d0197eb90fe09170f1b4fdb36e53581b1ddeca62c47aed61f90c547ac152854fe2c76f746d48e5be18148038c8952026d1dd6469f135bc54ff323624696106f3235480ee68088d82ba41df978c5f47bf2f497b72d77de5a8c531c6c7a023b6d5f3392f1c962ef5de45d17ae5521f062105b55dbdae4a4679a2c29fc0825f8696f79ea9d8ef454ff10c83200696bc7a3bc235b29e0c97db473518469109d3cbcd0dd188775dce184168d911fceb6fb436f44da25673fe8f8a510760ba8af0750200cd34f33190c8e9a7f46b83814a826d5dd4cfdb21b1e3404598734ad958bc5604de993055cda5f2d36dd10d8c7457347bc8ca022c6dba73cf3233dcb99ea21e992c80d7f9316a09ac8e3dc02835b3928ea3716ec3f71ece138114b1a8d549d77e20d5777afcddb5c7a8c0c5d903a02d5707fd1afd9d8b962c4f9e1cd22d852843eb6fb7aef12b30dbeef7e30d192e1b8f7c7dcb0a4ff10e6b90b5afa700ef6e4e1fc9b7cff254711c9dd04597bb31507bed87f516311f38df4ba87cf2c57ca3c619a0edf3d7f1e04efc5750fdf04fe9cec670832bb16e249ac8788f41d67a917069fbaba659759581fa2b0a10f78b926b857befb2eb2570ebb9a2295a4c002648733d0fb9aa89f35541c74bbc36944160fdf15f38f4e1f4dae35150f1f97c71d313d087a31693af164272bf145f4fc54a9d80fdb9a98a4f3325655deba242f25d70ff47702714de1979eddfd83bc2ecc0d42a052c480f704127fd0651a85793ef16bf5b6feae9951c32bf36ee52bec8dc22001", + 0 + ], + [ + "0x0a8a6c08021080101a806cc3319b5df1c8ca5bd9148831a54a296ee8692e8e2bcfb697aa49d031f4e1e74b3f4893e30eda0d44ce2fe9d902cab4e837782e18d4c7807c52fedfe4bc02605c6b0dff0af05efadd364c794527fd8ce044a42650a13242b3f80e96ac2861167c7264ca220185834ef71bbba7bf2850aa2ed72b2345672d7f29a39634b1f3e4eb9f055b7992d84e0feb2afed0b9dbdbae3bcf433bc4ee39df235600bbfab6d6803a67f434b7dda4947c4e174144e03e74714ecb64745c03d21a0a5aebdfa0fe2e2a07ffadf5344d1eb15e7001e57463e4dcd38ac2d6c3427301602980a17e1717f48f6b915033011afad2b8e1abab98d3245eb218b3eb6d3afa072a767c8f51795ca2506496cf9c058d121e88ad720e57d8af7449b4a66ad3e89f2f05f592fd9c1dcbfa85b336e51324f5ecddd0c78b486528616485db1f1f3849dc768b1cf7c219c7d6123ff5c48c3e0a96d94f34ca32e11a2d05be1542b3ac9d2cf59718108676e97ed353846bcc81ab7af14289ce7f11029113919468f000455440743cd16504aeb0d87c4a8dae61a179230ff30145bf414dac12e81604796158b2fc0bab52583a5ad52c47270977f156b37f175b6b91de7441b594dc174c41c6d47403f4f94baea74a9f7782aa92eecdbe3231cf3a98b995466d0fc327e53356dd13b7cd4ac2f7811c468951b82bf2c1b50e6c6a6d050a1c374235b9d5584d2530c06203196b0b8c2954755b02466b1c8fe71f2fb9af57f3b514c9ef2c5d96031eaad2d1314da681fba9f7eb3e545f0d6e28efa084219277783941305fecaa6d9b7d3f3d93c6e02d53d955ec1f07b7af95b139734515c88eff9529b9dd9a9c82694cdd0885b4007ee0992cf8fd100d148721cdc9af10fc6347dac93c5cb1de5b7abf20ae513eec43e03d8ed218a38e088914b58bb69267bb5b7e494623a84f0da7ff2810b3efbe8367d5235e0471ac32287b6803709fc686a1ca118a79b9e6b65586c328e33fb0d52de785c8a6f1dc56f11a90b01cb678078fdb7c0890179ac44670ab80a3a6cc6ce0415c2647099d6034fa22effb5e73fa66ba0982b849de898ba4f5cd5c19f508457f8b28b382a60dfbab22746896d71072a9e70462d29930290c38900175323c285232527b84e6793fa98ad2dcea9daf9021f09ffb6f824a16d9e96333a257a3aa666d98aa2cb589e9b18acd62839f736fb123f82a5d6b388f6044e8781166013cd47b2ba4fe8a301bf3e3a831f6f0a07c88f6c309ad90e5012c0bac243455954db06f9f698093281b04d930477ff3d50001c0bf677beee1be64a807379b3f91f5977a6a7de504c9cfea5dbc8d5188b98ec7bf50f38d8e2fc1ba6de9ab7ddbd18b419df3e1834505e564838cd761947366a20120b2bc993cc6ef457b3b1d78b2fcdcb29b1f8569fb714fa18e1f59761838b94a6a6829db2336990aaf241bd2aaec0c1081eb36161f4d644ea64b6f6d7905fc9b4783348183696e178dabc74fad0166669675645b41dc2a9927415d29b81c19eea3cf021c183e398750f76aab4bc07c97ece5130ecd53100308bf35e7688b5563153a8002feefe82a63eb540b23903c4817fad40826116f5277dde3c855e10fde07a9a54d45c9f854f94b9234efa1b020167d52542fed897960078d55942273134be864c5c97bc1035e1abd4d138bb3e12664fb0ec014185e2f4f8c4b6c2e1ab33cd935340340db53bb03562f8c9b10c8640fc0e3e8ea08f7954d529ba61907c20ecb3befdbccd522c1cdd75b15f2c9fa560f44f90a57566ae86a9c5513366d59e7ffe0aa1de399b4148c12734b2317038a25b6e8a72f21f782fec51f24d16894f308d5367e595131bb5f73cf501b3345bad54a42e06e078a1693c063e48139d3939d1839e7560c3f55e5d8ac78760df9f0bb1bfecf8c51e611a6ba833815e38760225161a6309c5359e8f1b7ed9d707007b17d1a870ba7ac25e0cbc12923883214829fac999bd56077bc48e20e20cf23b759ddc125e58a67cac34b3c01ab2ce905195d166e5429f69eb4402d809d05cf596ecb9d0d4f20bcb133bba0fbb704311cdb68317eebbdcde8cd80ec6ba20774e1b6d0e8d2b0ed6c9964d9f1e65dac2bd74a89f4a4dccc9e91920549f1b87fcfd33c24c4e2d8ff7ae59287160372b14f2e8bcc8ae410cf3be2c18149df686333217025f62b53a2df0dc6c573e1c07c5030726cbe7c78405afcf91567efffc066d4f2d76b81e8e824e69bb58192f402c1ba0bdfc632f5907daef4e7340627e26cf371918596897e1ec51f4568dfe9ed6406cbcd812847b4edcb8a1ff69015735bf4bcac011f8e5a62c85ac6be97b5b91a1314f1d37eab0e8e61dc24a155b41306272eebc4da8df6e2856a74edb692984b94af223e57dbd8eb7f23ada0498d9aed26ed0770c7be86a7320d7a534477b3b5c7e64e2229e79fbfb4072f68706fc47ca0ff4e138a7982349d0bba1232f98f39f28469470c4e0e95883178e595dcd06414006e200714baab0e5925af9d1c3313514d375280a4b0fc402220dda8621e4ff4e173142b113e40547a3598edd7ed60b72bdd22d62fdbcf5e4113016687c9d1af01e2fbb6aa0daf2cfd13abf7d36075caa2056c83d39e7c34d2f89a433a326ab01ff27953f865919be6866361991335b9f68e597d2b5bf1b732a38afcb33cc6933b32433f9cc72c7d0a9319fe55a531e744213037b3453e0444a50c36b89b699abd3d5951568d2432671310ac2960f06aca48497880546a6e3f0b4f3dd3a78cbc5c6465eb5b12a791de1b8a27e4c49f2c1c923e0eeaab94de3210ac4dfb67697a365740da550aab8704fe638a9a00c1f0427c80309c3d80956616fd36d8df1b5f98987d23cb79296247795a46b6c259adcf8fe6013f76dfa48137282e45cd102de060597c6ba5cdd64ed78c4eb5935197193ab2831504b64642ffabf1718950ab124282a4cc06bc9a2e84d52c5eb6895d5987d0b4ade4c31797591411eeb2c4e30b74ddd851ba2ef8345893efd5a146e40ecd7619e4292349a8814d0438b662fde8c3130c121928620ac5c5babc74014bda986aac4474fc5c983af422596fd88763ee485992a33708eb48ca57253ce1620447a88497d7d570eff72d1d4cb46005202cf5f6c0d477ff9ad8f8eb8e1537ce1f5a6e8d080b3b28183f8cc82f5c7a9069d578a99095da6e79080a81ed27526ee8c3614273d9050c28ebe27f31623003dfef51776e3078a2d2f7f353585a367c50cc931114ff87797c65d35c943ddb9f04643b5b079ec0767c06eb43846f4cab0095291b847fe18c4615d21d7267d0b2a8ddba6bab7515fc6aeadac8e930abc6820f5e1fa3182f725182c5b59bed3c47eac7e27db39790fee88fece2327dea6dc1887e415706b4f1ce5420bc062c0314dfc66ce3a3234a90dca4c71bfc06189edba318e23b189d4499518e7d9f8aface33cb6a9e0c45505bc3da9700740bbac0158a55caf35b93310aefbe2ca2b1d0416a4d55592ed068e65d364cf80674d6c6ffb79d6247c4914b0ae34400ec3def61b3f7d5416600fc985b6f318a1f183f5a5f14c09ccc6791661fcf477a75fc0ad9c80aef45dea6f5068f09d23ea72db5934cfca4c7ce5a230aabba563805bba4d4c27d4ea117d51d4df8d28804b1a837306ac84a460f4b8c2bb5648751f474db64b1326dc5e1c0631aed12a48249f3092cc1f88595088fa9218165eabf6e7b31c0eaac37cc005d7eef284c9957d17b14a4e41719eee641147308b2dc032b0c0ced5d67a9326d5d039ecf3a62dbda07b4ab0d6cc201e17debf69b642bf06729b25138c2745bb200854ced5758d883fe127e918bd2af2da5e899bbf83bb3a42b350befc9b1b1b25daa05c7382046e23e4a658b7fac99b0729614c60396e3ce848ce06eb4f77f0a7e6cb4124a451eaf2848b5e7f2616c3504d1c5c714802375340c910b902dbd7757f80a5825ccf8466fb15c8d85897d4d048aba1cc48ecce90ce9ac9c87ce7daed5bed8f6c79975f347a638c83a67784be7cd0fd64b95574f1189d608ab3f5728e0ea3eb70c29293f51d4b1d4498827b7fb6f968780b03a590335435dd11cac8fad110ad11dabb4afa40bd9632b279a233d3363ce05f09abf86b64f99e8eaded1e4c131dee8c05689749874766768891cc86aa3f8bb9ed5fceb4bc3701c7cc439a8a3ca92204f4f7534b87ba1197da6c7f009e2a1bd0af09c12cf91024fb2c798ce2e4a2b4fa6c60735245155f5496eec6ee836f94a5102e5a74e1c059287c7ae34a0b3a917224ce7b2e596c43475f6f7ae2302239c3bfad1802fec29300df28132e38222ea0609ab3526515fadfafeb8019e6fcd798143a37cdf1bdb434c4b8e5cee91e01d2080d5d12f8ac6ad2a3a421732fde139cbbab219cac320d63d02a011af806e68362fea72bff4fb11be197b022862a4e48bcf6e8d7a745afae69b96b8643fdb3b3db821697f77ea350c08043631a4c65a81b5352669216e5a44fd3a0d0ee1e427d41a99b7d1e0cc5c5919f92c7a9d6966f6f158a40076b8290b22c783b0b245b961d2dfe7d176522680b35092d7d2c8779e452c00f6bffe788033087a1730b7a47910dcdd60fcc57ce750cf925cc5d9c7056786b1361b35aa60ec081b4730fa9746babdfbb2640cc4bc98a157a4ae8d6b20d74bf68f17d08b6deaea4d715dc1a74a2cc4ca8031ca6922f1e434e09c52bfb97e9a66e53103180fe4bbf51a4126e180c3ac0a82c16c5cf02356f39db877035edd05d4afe759ab267c2e8869aae4c11530bfcbfc6b0974a14232e73d920a0c11bf3bd452835193d1b4084566e03bbd13da2c01db06d79b7407b10b2a91435671bd59f4a59b9baa4b7213310ab6343020c91dd0cb9f70b0919bf35a4a2caedf95248e73f2dc1ac6765d825f2d53a827c0165316ab4ab1d124ef785118b5527ddfb12b806669dc34d78547868674c4f6d8f744ceae5ec28c19be281acc842b8d26b2fadfaec839e8d9d92b034d0193e4ccf373868c5d16a7bebdaebe8c31929c8ad936d74ec5a0425bdfa507cdccf57514515ed5503fc4b707cfbc0336a5f70745640f70a39c1e98a29959a873bc90afcf6e172a6e2bcbea716293f66933b9640b864871b370d5121624c4991545d801b045904cc61022ed99c70619984fe8cb370912e302df6c01f935f13c2202ee4c3422830746f1387d9e898929d5097a53ca0ddd804120ba0195993343d70ac5db85ad93844f8a9a3e6968a27d48808a4948e74909ad4b47ec17be53364532b213a741529be98b2e861709ac8e425885de58e189331da7277d2958b1d6b76e7255bd69f8ec9dadbb8a167a31d393d9bcf5517aa90eab46b1716df454981bd95e958058747c6099078da94d7914ed6e82ce90e96a9e01bdc0110ed13cea1b58e095145289096698838d776187b754930ced4d08aef8af96829696a02b40b7c5689da27b64831024c80821a5ffe42d78ae2103ca76ce5438a264e5ca5a94f8a7308c2c3df7949b6af653f93b9ce2bce99c1f43b1a9237a680dc971f6590b2c4d4821616638bb35acaa18ad0d1534110a8eeb9fcc91e77b5dd65118384297916312f75447e5e1549057bbca2a485d12235f2e3c477e0ad23d6603c617a003f363be94cd8d99e0d00b3bbb519728383f0def22f1f77cf62c42a4dd582b7fb254bb8f342c1129f546f02bb3e614d21a121e626c285e5e995010c6bd51d252627d2fefb0b2c7399f0bdd2ab1543bed32d558fb570b133885bd1712cdef582035b2f97f7a5f6e985af60e4a5b430f0cbbaf51c66bb0ec901c7ca04f87501895a065dd43ac2352c2dabf8711a76abf5de7da151021879244b6e41638de6a3522ee3f14e74ab755758407eb516b4aebd6eeec127317119f9ddf9edc21daa0ccbe898ecb9737da00cd2bf73f395bce8852e7caed3c2bb9d67ed1a811640b8e2b36eb9d151218d0ba61b52f7a686aa694c2a76e12df8b3ce97df2a7fe4cd75e290bda3e756e79a53f755e51aa6200c502850e97bb5c1f2bd97a872a299ab4b0fd691ebb160b1327eee3d1a1c0f4cf0decb77faa7d7601cb52e54c3b49c4e56ce730c05b1c34a9660210e67599dd63fabc58b422f9c78a487cf3af3fe6f9106d4bfc1ccbc7c7054aceb4b44c971949409f3e28ad9d12c6119f146f0d00cd7a1a90333a2627a565f43d13633cfe2e970b087fdd898ccc36d6677696f6a2ca618d8969c83e11e7d53aee1e5729273712eb52b927a356a3321e8a54e8e1dcb4774410d82b21d800429e7a34cf49b8561ef6b7f48db426a6bbda606ec282768fb36f5f508d5b1a1995e7b03c5da7e348552a4d0b02a508472dc791a9aa201ecd2ffbea41de41632f4d11a8b9bf51eb47aadbb4aabb83472044d546557500ae2eb487282261728c4249cc1b5fc22f75bdd069c99732334c471a50c2c944d2563c67b93901e0304333b407a4ab2289db5a9cb0b3efad1d357e329199a3b9693595f0e1b5f2a0355a110761655f9bf94eaef537e648f23bbd57bdc53b5790c5b23b50e0003e0ac603bf9f4ce0632004b0407b87da898c0ce89ce4718f382daf347e69f873ecdc82d4151b86694782569fb114979e8f499c3e48377f7eb4e84b63ff841c972dc195c14cec134c7ed425222dbb704bb09beb8a6fd7067e3c9dd6c26a8aee5c59922052d6d1367956edf672b62245f044af38b78e67b780523b610c0b40879faf4fe71224659aba7852a9d95d87eab777dec8787576cd33b827b8d33aedfca5c21a4317c0d554fb78321992f8da9e11c286b50aa9f42dbe474c611f7f6e41647e2effe5b61282a7d0a7adae4c4a22b54596075eaa729668e731c6d040cc1429725bffbadd620757e38c57ac5ed36ff6861a75db7c32b41459f5209e709e0708a8f825cf50eff912049332f159ba6e5a2a05ceb243e9972ca4b1a2984ddbd19f3b5159474c0a6d00befc794c23b3b9160b6e57d804b506e17161dd1614e2be8b4d30cfda057aeaa5d75182cf870d66aab9b3ad927dcdfb212fa83be8089f935fa5bc21269a60a59c0d59e6914e1b8556211ce2e57d06b387dce4cd3e9aa6b6430859f823e6f94c1cbb4ec599028ccced912726679cf9ca9c40cde1fea539a5130e5756fc5750a125110f57b158778b0c25a61ced4f7ba63ed6f67ac77cb9a23c3d1e9355f1f04182a0ef0a9a9758283f1100830aeb9a66bc4da38c5047a149165620718641b943dc0bf3fe991f3aa0e3aecb8e019651c262d5378c2fb3f86c50e49f62d6d47bb90f7f10e5120aeab73c9384b8ccd23801037c5af5aba4d507ebdcb3bfde67ac7c1bc7e7d3bf632189f47cea9ac61318818fdc1fdfcae63a4c421b43e0ed36a461eccf485ca86bf5347b0c2a2bb0af6257b9044355a45ba1d486cba67456c0c606e0b654fc45462d56371a625447617409b0f1891782addbf8e3877f38e49b634a8bc2e17b47e49e482b4157cc15680e4542a5fe270fe7001d663fe374f8e5cf64c01458c639c8785227200315283ea01465d001dd031f56b846ea02dfadd6ddecd7482cc31614400d557d0ddc816577adc77347e29297a19ee21c1dfe7aad972f0a3dddce5c1d42474f205097091a4f6edefc218d219dc5304d5dbf27985c29a0ce7eced298d1970353037b4eacf69a4808f1e3ef9cb726336c970699dd83385278ff63ac472c4923927cd12eb9376de17d0640006e1e0ee90e10836462552a02c220179d7f1f9058a12be5835ff350db5c94cd2e92c5cd25950bb4760fb920c210a14d1905552f43366c98724fb2459bf0fffe5c202af3d293cc97c6c0ae1cf5486fb78e0cc0d26aed4819fc050b1b2c8f1175d10c94e6942a56b028f7f3f25a59c6cc8735cf823cc7c21859093d5accd8dec34a6dcbeb790f12e82f59b3b62ff8b9ff0a9d12c688f72e51ef7b8967bcf459487f4ba361559fa2da7eea647608410057174cb7afd86353abe59c521975a7e0ebed3a9b05b696a83063ad693ec4738f6cbc816ca03f97e4fedb59674be736e8cce508628a93511d20cd3f417fed7e10bdb5ead332183eb20c59acfb0c77adbb7c2dd3f16394fed64c62bae9f97b94303597e9cffeb7dcef628d63549ee484432ae2c5b6987d40cfff6e11b6037a1bc3e0f48bf87d8e1e30bcfbc739a2307dfe12e5e23aec7ec4802ab4e5afd4fa7bcdb3b81d8341cab08645f10947f1b772cb2391bdff0573d335f148457624116c72b20a5e53ec983f6e601dfe152e35e4b28de209f6aa4055c271cd85ea04746bd4efaa4816e8a71a8d61ed88d3791f9606b965d8aaad7741a9f6bf06d55e3d1bba1b88f2bdb6ae9e48db89f40e3d65eab834167837130a4e80d3a9838d5ba0d09c011f80aeaf5a3e8a291672408898b4933849a468b786464bbb3fb7d944e8bb9ef85d1fd671b2792d5faf68c5e307bda8df5daf543f6ecf3919a63b3d6800257bab48afe18274b8a1a08f823670a33fe58aebd2123cc46b754bee7318eae4637c2a6885d8d1d5f6539b152681b986c297f17116e17cdde777ba39aa54402774eebaf093ffebc8db90d071812c02849665f03171eeff40f527be475d8f49d87ac77454ec24c214b9e2eeaf973176654c5238cd272b57166145bfd917b8213041d605eae8e33eeb31d83069d046cb482eb6bff7c885bbb029f4dc120cb3853fe18a345ccc9281a867642a0823e5e02ef01635470b44c92b917481d93090a95a75b8cf7ffae94922a928c26846dd8df14a07e737495990e22d82fe19a2f3e06252a8b1a299a4a1d483a4e9abbb0e261b1100c03b87b126fd074037b9a84f8a891462f5aaff53ad5b09fae1459f217543ff00485eba91800de8a58afe5951b06af1e2cb6a25e679da1ced0d4e0b3421b00e712e1208e1dbd10118e81457c6fcfdaf5e8c6570096b7bab3b08d4fd56200bee44b89f3a03bf6e245a50cbfcd4287cdbf41a8820b57102ce49ceb482a9b2362e223e5a99d4efa31f27244265493066b74695a960ac0976097ca62a9c740706907fffcaf11e4501bc05aed9b3d34ed7922b740aba00d2c4e3424125ac3dcb2c3cd743bd159a1443ea5cb27d6d3d09c927d84598f37511efb4e77343dddba507507d73719d7b53a43d7710ceb196795677d73962fc2f9e3d7c0602240bf5ff0556098077be4d75230266e936b2f7eeceb7a35baf9a91a2c8faa1b1f96d9d5b8b551caf0e94420e3edd126ef1dddd4d0e0961592b1cb3b2b67290663c086a0d96929fadd74b0da3dd64d3885b2f9e2e275f54b0ae3f1edac0fe568a28108f93bd9e9d2f4cc8c6265e3ee79c9e416d4d124145270cee7b41a4f32716c9742ab6cbfe3cd6e9298df8becd717fac63c5a7880169691d12a31b0763310d7e558e2c1afa6ed8e9ac776a50fe7cae2c3100e8f484fae1565b5cdd2ddb2aac7d9062e8cb25e75311d0b447c8149245c92a76cfac862173b37074aba19153ae7baa1f780ea899d99397fcc25fafb780bdf0b43978e325a7d355721ed2b4361eb08ece897670744beef4d31e52703e0736f8846f4c1a4678824bcc4eee0ac0a64106e586fbfedbd246fa7ffb090b1e4e807b1766d0820ea328654aaba569ad0290a2195349d25485e35668ef113054c39cba9153d212485ec2d3fe6d3c1b888fd6f47b479703598582b048552f9a3981ccb544c1a4836da60f776c5f3e485a8b5907903472ca2ab9f5ce92fe2434f444970e1a757fe19843ed55c1c6489b963664980b030c034ca92d5ff3a00197db40239f937bfdaafe4b1b4ba85bf6d041b96f5a422e754ffc5705248226bffe006e8efe943f5ee74df69ce5734cee1faa4e9be43edaf5e763a5cabd2048a89936143e8489489915d6ab1a51a2d85379045c99ee6267daf8ca67991ce9189d314d61b07b93241b4fc4c7dee8c9b7eecc2b4b9e74ec89706f47dd17eab6d08bf77195f1659733e7e2384246f3024df6faa50f76a6b556de4ac9b16926fda83a686ce2cbb98aba9e050bd5fb44a66d16617b4695be24bbb1337bd0aab29f504d6d6eb89d0a949786ac64954494cceeb6f3c4c87c39bc9c3f06e321dd8c172fc355c9faa8740809e1d325955d1dd4258d88bc20e931c572fbec36f5a4e045179356486f8ee53e1401c61127b8c5a17cb81614951e5e889366ab04243f08fb481ffdae619973ffed5bcc98cad271bd882b65719f5bd3e2a35896dc4e219dfa1a377d27879d0e97cbe046ed40b629773cc279076a300bb51d0ede08e148364300ec9b2ccf809e628daaa622160cf705b7186884ec5cf45b3a297b76b8add4067539b375544dc17dab27df841036bb2d2526705d184f9727d87aadc2d352c61174449b4417a93cf44d8103f09a0c03d2bc02e345bdb2ab8923b8a074ff48ed7cedad936cb633d39e273d152eaeba3b9e381f9067a6f4b1756a1346c966b77a550cad884699a3ec5aa31dc2adc12693915f21951faeb4c91d19577a0c7209e5d3bbca8d84c605a8918cd9761ed1240f258881f3608afad4415fd74bdda742a83da4a399a436aed7133ff24414ebbef1e2764d4c34d17b8d06bee52c338b59264f080ff06e728c5c8cc9a62d41316e796aeb17783031bda05aafd8e9656ca0f004884c33f87f4b1886c24e23fc7b59fc83077642245f4a584128111721c9aeb19fc6cdeab204a817367f04453ee8b58c4ebb16c7fbb62116f0e10f9dc288c3daf1631cb3e66ac5e7a0ebdc60a35ea7b486ee62c97e10e59a93837fd7e8e0e9d53c79d666a6432d1c78127ef6cac5a4fce8e85407d651b6e6fdac8283ba50512b8267a326e856dedc91489b2036d8cfdf3c571cde2ef5a4a6228abf440b43b29bcddd5a0237c002bb1b2a85378834ed97ccdcaff962da3583b1e63d2ef6b391b887d67eecb82cee4128e2f71086bd5762a1860a45c59d94fb7e845cd2f5416ac1f80bf12315190ef0526d532a1e9d9a8157fbb44a7cfee66de0a8b0480ea16dff23b4c9dce31131039aa6f6af41a772ea19ff3c5df7416686154e06c6e20424daddeafe3e6e6ae2cafcff58fec7ec45b288ef73e9916405204f2adaaffefe6a5ecd93ba602ca79223f994ba487f99ddd8bd0c35600e11048789b279ef585d37e62ce1d1c437239a58511df68bd316063787177f8a91925176f69a7450cb03828698ca31905a27f98318cab30186d0f34e2ff45cb365776a0f94f5e44e0410cc051e5b96266e26682fcea87604d0d73361fdb9fb957d31db5b07f4b5d97b52ebaae31b067359afb0c8d68dee37bc442cf5ff86b05538dc8d31fb7768cbd3756490a30d194065d849c57e791287260435b3acceca1363b96eaf52bed43cc6ba3b554403a47beb7ce32bcbcb18c56e6d918e36f6b420640f867e4982342b57ae1e2126f5bd1398913935af5b57852b8fda4a277cdba6ccd850ae578ca2622af0896d7872227f029c5a9529488f9ad5625ae5a7a6567d87e8a3a84329d1b9f0c2b3711c7ff37f14ab6f81780aaa7c7bc3434eee2284f02dba4110396697d43a2a3b64cf25dec64a2c59943839ac1b45a059f366236ba2c0d8d7a42da04684c0b212de066ae4cb8de50ab1472caf2d53a718dec4d64e31b2aee32616119d8a3558317237212d18d2ffc5e0a5616a7906b91c888ac6a76f70a15236beffee275964268ac5f91e955842d91c2bbd04c19b1a8a9d5e6df05bf224aca4517d8db9f0b9086b3a053cd7f7a15082ed0413f6eec98088203c78e8ded7192623329b4a533fabff89b89cf100ca1574ab15255e84c2033481dbd5ac0464b1f5e79731308df18d9164b2aa51818ea9dcc058fd8e983d38d7e84f89483c6c03ecf65fbdd4f3eed1f654eeadc7225faed914478ed94409689d216f03a306a3c52e2c153b1de98d7773266bd5a5e930868620c9d20544b2b0e157abc0c664302bd0a7bede6cf157a542407aaa30895b57515cc265e8d571918712c774abf68c42dfb6e5b67167d1a0b03d49d99812ccdcb4907cd6ca52afb9a82b17254250cbf56c2886b71cd2570168310ba7ae6ef46520632686d28c0ed495629a59b361004819ac13c8b1b27735ada548b91af4695d1247034ad9af3b2ba6659101b49ab3fe3276756e7ddca48d0d26cd4f5867b8ecaedc9644a9209b00fd076bda19e15c3fea4e02fc6159c5b96b0d31649c99928352eeaefc3179f82511b37f7a25739e279cbf7c3eabae2488bd0389496f3e4112536a473bc1233f27b472468ca847eee082a6afa4ca365a87362603ccb61935101c997b7ee946e89d47abc3d0abd883914c194c17cc17b510a19585881f224e89ed237a90ebe2fe7bc47e7274222b7d16ac9d56cd007c570a8f4f9052babb73f899d677fa2edf7babff38e5f718ed09b8148d4dc5aa24df54e2ad34067b91bafabf89dfd19a4c835e9dc528565949bb78bf1f886e0e1981d86e3ee9103240ac14981b074af45cc61c40f581a4ba630a920ff9e14b5a8ac8cbc1ac2863a6a64f144add63683e1713f5eb2edf832229b45912ece8d971ee3c3773d2653144847f6e6ea89449cf9cf1a7c6f0f676dc4ad67af5a880979fba322dbee26725cbf57971281d6b87a7cf02515dec94c7618054e58dd5937498f28f752e46157f7a232437c3a0cdb4a6781a09f91485392c11519f4618588a03aa1c6bff54ef2225c1080731cfe30dc237a4cae3421a98243d1a0b42366ac9256dac8dfe7694ee3869fdc28967caff931f5a7400f50d42b9453eda8b9e29bb9eccbc99592b87f26f42904fdb24837503d47e1e123a5cf278accd82f95ae3a0fcd20fcb73f4d8e4cb9eda50863a84fe21a34da368889f814015122fa33b859dd7de701b3160383223813451cdb5534f966a956efe2218fc9cba9952b5f6a9020bcabb23e1c0028e0b3f26a003d169bdac4f54beffa27e2f5f9cad71db9d3a097035acba205a9c60898338da3f32fafa4cf5dadc2e70336f4268518048b98f8637640f0ea45ad29646fd4fbc270b661b5a5bc596e0d1b2207666fa6283504ff88c21563c4b03e0817d3e3f4a9fdaf1ddc668574b2341c6afc67ae3377322ac9626c85e088cac7387234b7d5743ef93cc7df7076bcdd36de3e1deb00c6a2e2a34abe0dbe8fc75ee0198ce8b14ec8bc5d6fb211fde84d9629babcae5001ad4e6ec8afffa9cd02f355b466dcd8a81115f98ad896cbbed33c8dc2d3247a598e4ae78e2277748ead8a5071633b4512204098c4d9a0b717125ce53993759fb12abc550cf1415fce5001c397d9629c237a7a3e609317db5b3b483d4e99331100cb7f417a899fb92be3f6546aa3849314c863ad1d78c74bf97a0b79a3cc8bafc3ad58aa6a5da5ad8d5fd09a9d679d96d12d4311da3591556592e381e9239cb77bd66d9065d8dd2616d2807b55376d8e907ede7f34383cc0a53c300c6e6b6a498fc060f871305a2d560f926e2c7ba668452d73d44af62d15afceaf2e939cceeb50bc98d079c4482da75636061a334c400892f2b1ee1da8e32c7004e5285737c1b311a432f2b4408fb69a15d36234489a7f1f50c451d8275f4083a9124f7fd070eac8be98f16a0c5f467f93b2cb5f283ed0dc022a45946e5c46b39e0be9bc844164ce032b430587e2419752dec1b67c5aff5ff72758965de79b5122b80ab292b4704a0ae5ec9b3176e6d647627c53f52d4e363af7db58ed976ac4f63adaf19775f297e599c01bc85425e822d0c3963889be7afe7aa9584c912ef23fec578f6efb4b46dff66bd5fce6446f8a1f880947c33fd81298539b63f2b88881a2d4f064bd945cf598ffdad4dac5e70a1c386f2fa9a92d3fbd4029e27018c8dab866cd313fa045ad914cb1ce7f9fd727effb3d9d34b12fef06c1c0db513a2715d9a247b52de1005d87ba20e3bfc3b06986021c4f834cab4c86098d7549fa4d26fff7c779aa1106090a4be096ec7bf9b975af6f4c174282f4893501dc462b5f0d3e9c56aec1f65c489a77bd8429c180b3094da23b098e620ad94f86a3bdd87225ad40cdf07f291a06c909dd9202ead4266db2d39cc52ab7dacb868f967bc01b8e79e125e8f43f323cb86712a0b94e12d9c9ab524db75bbf49c0f75b1cf83e3752a2de2621d5e3f9e469f6a25585ff444936a12f2d704bd6365a555a4e182410d9a85d84cf4dc40d57088d06452cad2457eeb0792fda119b21625b0c048816dd5356462085ac82c81a6982fdda285d5fb14e87d11edbdc21e4958db8c8083617b3195a3e74457aa6be4ac12c288b6d999109e6f7bafcef8b669cbbe352437b3bb4803628e8e2fa2282b677ed41afd2a48550f80b8ca281e8f10e39769df87c51de50dc550a9e9bee3ea7eec1b2d35fabf2c3fb129a02a895799707a36cc192a1821dbeddd61323d711ab03022df2a438971821329ebfc27ae89b468a9ae30a0a8dfd4192f996e5afbee98e0fcf82d0885daf4f614a03597d9d873b2a0c4d88d02cee84e4037c3ba5895bb88f2a6979789c9a32d68612cc31ee8f9c39092d645913feda93b53b44db136b3576a3c877df9006651ef36f9712d306ac6ecedd2f3597c93cd8285592a85eac0223bd3d5a041a66bfa6864901f9217f36b13f6c8a47772de206e27cc6802702e3011549d6af9bf6b14bce532ee7ba1a1a1fbe15f3732b8ed806af1108e56d43f20d2724f9621f307615eb4060412af5ec7d9029fd3a339e5d9585268005268abf1755f9be78ceecb0bcbfcb96f09c1627dc1b22b28597388a97f43b1dbf0203dd6654a005a2b6442c4893b62a28534c49f1a234abc94bcaeab075825e599fb27224e4254099d297e2a659a79745368fb1f9e38d042008fb3e035c68ef0b799a3c14ad38893b63c7e189754128be43c9130502f2931fcf910729edb2d3ee71aec9df98d269730df66aa1a0f5b7043774b2a3bb4d57761b5ef702fd35c35e34f9b0f476a83d32295b48ec62e42ec0cc4fe0b9e7f1d3b205a6fbf848ed347dbe3d339a296d0b467783119f6cdea07be058c64e9c96c781f39a214d64acbaae211ce76dd6bc4aebb365bc3917ea27cdb53e5849b0dff068ddaef33a9a3a92000fe284528c9f591592bfb98fde74246e08dc6a001a91118cc9ca9c05186d3aff33d53d0577c5061ddd3ca7ca5bbc3dbe2ff63d54d23dd3cb8d12a4b2ae65e111b6b335e6bfbcf07cbf6663a179b6c21d8e5ad6b678223203c54083e5772671474b713185378def76392c934dd896755613b3dfa3c816b013922db4e77919ec4e4be1dcd0ae98d1738e53902d4ce86afc184b21f7da1371458bf68dda0ddb25c486bf88d754c1e10524d067f9d77af7d0220652357de578766af2676fa2a22c9dee118e54a75268a0f15e6bc825b0f7d34cbe65c510eae604d3b987038f45df0b4bbff97629e623ee14f48b893e66186c6edc961ab6292082d3f368ed74f663272ea5400852f09d5c6be4530b99b87d22b05aed8a646ca8bb6ea29c66f9786cec8566b1f1ced4bc7b933338d7076cabe2e2d7706cb30cf63d82026894fd8929766e8f5b622ece3b29a52971de73cb9c50bcf76b259302fe71175ccaa16359556d2162be8cb9e6fd7e3d4ad5d722fe8276c3bb3b19e15ec4bddf4b675e22d26ab99abbd23b818eb75d41d8c3d250ef239434f7961176de77971a87eb245aa2fc652796e9dcb2f0d021315c8f23b5ca5338f6d6b16625285b4f5f4f1aaa46bab1e434fd885c0e0532127d415047423c6dbc753e3385514a0acdfb6d5ba988ceea40db458d2b4001c02858b62654d736208d0a954a18174ea63a48c0795f0c27020715656d0b049fbf9cf3630ebb4240cf69824e10da3c6744866ea20bc07171fa33598b4e5ee5eaa5d59973886524f278f831e8b71787dac358b9a05c271289496c842ec49865f43e1e1d888afb3d85b3a8b74c17321897e3c5fa8abc51844aca9374ff066db410e2a4b45ddb2fabf1b202c2391fc3266accbde91a95318f35afb69883ee5ec3721bba12213c7181de23e6651655d2b9619d4aac08de66989afcffa2e5c1ee67b04958fa58bb4bdab3fa299a97b59e499721817e83998478156bad449558b11200234352f3d33c745ab26ab111a073509a90c6514175d295fa71695d8e485290ba63f136778eb864ad000673d4daf53e782a5e52684892aab6a4fd0430e404ce4195d880a0067018247ddd2cd07f4b19a8d65369e2aa6e74e42d5a6b32ec3ec32f4a7480f81358ef84ee201e10cba1379897ac62df5b359a357e344efb72763271157da8aca1bc9f4a2d39ffd4173e89dcdf6bae37c43d2c665ed38dc6d17e38a0f691cde3fa04d3d9c1df7325131c7734f582ccf15578fa8e0c6f3bf164bf2896671e624dfbea87bf08204041e6ea5c57cd14ac676ccc0727c8d55b14c4a1a6f3f227912686bad380d0bbabf3ea10b44efdf8ed6f2fd359773fcf4abec3f7f3ac6feef96a33e0436fd632969e4e127b4fb7579cda127af98e56160be2ddf7e6d8b868a8491a0e25152a6912ad6bdc561f63169315cefef202575fcd0b9c7de473cf3a447049292b95e08c0a3bbf5a969a7e563c3cb016da033b7e5e68ce78c2a877cb2ba806b21aa5a37ea175d11c3b548e1c47c6460d91419214603862f6728861f8f36d2682b1f177716857c3eb345f0641e569e31cb992b6c2046fbf083adc38044bbdf17bb115f707a7f72da8503fb6aa7a082b2b1905cf35d416ffa996723a23123f5567a5c9cad55cfeb470c394123e2874c27cf9ec3cb830e6edc2b66f43b4342f45fe260022f175e94279e2a202a18a052888aef459ff82e1505fb343869c793d56fd0e58555dd28c87242147d81787c57e1f8a964a1e8839986d308f0ad3f9acb65109eb19d821bd58c19cf30e071d8132a4cbe782d4054b870ab71c8e88a47c934644cb3b164feecd2d54272b0e4d54ed9e7483d1309d3ed79b46ae1feb65abe11ae879496c10a0479569e533d78b321b30242681f3a6f6460f608d853b748710602460771c578eb6c4d7c0ca0b8d46557947048d5d8c05c80bc2f12ec3a2de865047ce8e8c8edcbcd26ddbe5f25ffea6f7a76d4b693bed20f69da7ef5c892f4e78e53b6e68ea86e83f0da67b7474244ee0f4c71d4e10654ce6663bc746bdd984c91fc47c9e740b70635f9365de39652f1c0ba24e6d5db5da3c0203691add207aa9ef38dcc261d97497613a3663187d01ccba51793ee43837729b070168ff01c2e33c57f91c962c621942795223d4700025175287359a25a9954b81591e390ad580e88dd0416593d1022312294785d97e1854a797150c19d4e9467dba068a8112434ce4f49a7125aaad95050b68c40ddbabe531399870ea39386732f30ca67d1d6b59bbed9c55592ef67556d054c05741c5a1afc3a4b0a34f4e89bbb7d2493966cb0c473a0a6fc40cec1f71429c7a826a286c7d84f1f00bb66275cf6f0271136e7b599a06f95f7158e6f432dc35686aaf6c3ed3e3de856abb88e80552c4f3d2a3bacc981b1a49d83434c707fbf7fcb6bdb36ee4159d7a59854ede3b8dc21759f047a481041f25fceb00cdf403efbcc90f82b39e2ee050a105043e7e22c6eb6c1d12ca8b5695e109a3f4fd2fbd56373a4e0f34229d666abe0d1ad62e2a66946972af508e888797ba4b913e7c659b3f5715362e953fcc3494c904ebf9e86352845985b23e4e6cb642d402b2382327e8a25f2ec616ba5f7b42ac1192f862468d711c66662fe965f8743b8ddee4588a00916a8d3ac82b07f2ad78cc4fff6897a0a4b14881f5c746b8304a7413ae2fa5856cc75beb14d27b7d966b5137f658520acf11ddb4ba8f9b2041d906179c03c749c90a2a53d4a2bedcac3ad680e17b585e2348005d7f7fd1b2c72bac3e9512195578b0721215819429e59f189e5b681e63b9bb0528565c6c413e8fb06b93385b446e3427e1189ee0f91c97605d25a244d4ed63d9c551c1851af75b38648114e0592b9cac74cabbf28b93166fc46e336c065d1f09a0f26cc6d0a7b480fa52a79ac6d006bd4f95eed6e6d47b5eee066da00cf27c4c2a5cd136f36f48c20d81e1ab1c3aab6d6cc7f8dd8bed31a60951818fbef26eabde0d93ef1b1d4b206192ee0e3b484e5c6fe603891ff507b01e146bb674b457420031cfdc0809384daf0901afd58e429f32c25d8286e1c70a7b7a126c8e3801ff4d91c71f33ad2daab27b30397da7d104314f84391744de33a67aec1f47e3e933f142e42845b040fa2682232462752d453f84eb8e5aa2e82852dbcc64490c61c98cf2bb0051d230a3d726426fb8857404962951f9f1970c8f708ed93fe4ce9e8bfc7262f5c120a133f329b0f005f4e5f59839d3e007c027c118bda957d8a6eb697a832656a6b17750f809314477e5032729bddd47c9b7c6ebc2baa0982d6ea1275f5f16d9a3c987628bd3c1e9fe558816f044440d1ba2367af1044afec53ccdbe042e8c0fdf8fd772fd9cc813125b7b5e9f0124fe15cc920cc0abdb6c8cdfc67d5019167fd2cf5d060cc0b64a6aaf03423a816aafe3b250ea048b52835991fe9444c5c0ff4e94859d7c881c73708876bf3478e9817394eb784b324b2918044e51246b9b4a108a89b3453a852d3d40c9851f573510f58519f4beaf06b4b578e7d9bf346a621e188a4ba4f3137d3e9dcd83ed317ff1971eb42182f0b8c70b24ecab4132e01d6ae65b149e18cdcdf50c05038188b8408e87fd5df998fa6365406d820a7abb2062db37593c31ca523db22827f761c8d9ec4a8d2c1112dcde7a8f114102a10cce708be77755352ab9f1c2b980ad6da6a0c046ea024ee92b98296b293264200daa4398b3731764fc6d68a3add782567186b3ea8673f84e54abb859cd81170377ff3cee91e5cbdb3e37072ef262f698eb43c35cd526b3525c4dc6468cf760bb81784911fb513846274946b05608f687c4dc970e5d2a97b0532fdb6b3bdc176fd4937fbbf1b18803762f2bab1abb0a46003613bad8c7a596d691d86b909f6bdff11ed62fdeb2d71b0ca8f1b96519ae532d8e6c4854b3615f2ce1a9b53f3f1f41cd733f647a04076370b524fe2111d3f66e9c85a936391ac4b0adc0df553a11240d4af6ebda207608c473db8111949b756b46dc26fa70c9e80988fccd0ec6e2ffddbd3e12d8bc77fdb5d87963d32dc3a9f174510f530d3157e9abdeeb0b72113abeb945faa39f7a0f507f8096a7a6da674c49ea752d46936a8a812d1a4d475ae349942f59def4c38147037d89956127c321ae16722cfef8107fa7248110861605a5961a37586673f756b431d169133de7340da04ae9ff00f0e09385ccabb3f49a89c8663eebf6e721f992b994f77bdd81db84c6fbd21b2bc609877aee6d438da6b20f63b5cd4b5f96f7949312bd9d827d4f0db56bf0c2959c600986c70a884262e3b1d889c25c5ec936f4af59040009b7853603ec5b88ff07c3f96c6e5ea62409b22ce6898f792c222499a11bfcc101990ca9082eb6808f85acff3002adb6b99c344b13b489967fad0689f30e975baa23dce933b136471dbcb07a38d04e0f72cfd13f8bc89e111b42cf1e453871462b93ac96b7e570a6db3db83f9dbbea7b353b6e7f2b36e55d6a88ee220d2a2796d448e305820010a8a6c08021080101a806cca51809f6fb028bac197a1ad2b2aa3a9ca7e1f29e640d91fb2e89476bb2d14e4b14aa2af28ed8f66e884a4dddaca97dd84f1ae5cac96986f514152806ecf71c7b2abb22312e4dfd3aa6b2acf96885bce250bac75b45bfd5bb4ca1b140e8be097220474c23fdef63d7b951105a0745354f3773a4c04848432e10dbde3033aeede189c1d1c7e08f4557bdfb708a44b0754eb183dcb47f6affb554c7d4b851162ee4e5e57e66361311fdb7d5f1efd942199107fb61e477ce239e1badc0180b3eeadad1fb7774d6b2454c1e596044063767c21022066f563d4d49f203e21748961109a1cc3263856897d41d7fd7822c6f0c71f63c6f40e3b9d291005f94ee1bfe29405c89f19d28f26a2370ec9cf9167a2447bcafd8627b8d091756ed5037412795a19486386e1f2250c80f42b758d6b284ec3146b369387af07e98ef39c1fb536579ac9f39a3f1c809c5ee3d9b6666ecc7edadc3c45e4b9cd611b33fcdad85356c8d5943027ba91d3db8fd606503bc47aae6f430b62a15cb762921b53bb1e72a22062579865409eb70407bb1984b84e167f799a80e66db69adb195d58a5005968c55197cca467679ece0c80ed94976202fd0eb34635fdfda421bac7064769ea85cef8e8f9a1c89d59146ead0e7ed5ebb2d74c2b75fece75a5ac721892ae2bce38b12d858a61ea386a5e811fe5f477e2dda001e6bec1adaf5f77efd7a97bd1def6742fba28818a975d06cb74c92b062578c65fe6299a85f28a7bf44318dc3c81d6c3daa6f01693beeb5b00159583ec2de1e8e350a4339a014001ff2837714cb6dd226582cf4b9c5e3e83d5ddb23eaa2ad0e9777fb73fd7ad34e7890ec4614984a399ee135e6ea168c270313574ab37537d421244832c8cce09c5c1d74d3823014167f2e01f5a33bba2b7bc9cb7f101507ebc27cce5dd19288c8ee68828e1f191dcba7187c8ab25aabb33feb843e6c0c7325df43627271b3017fe27c62a6dd719c9c385fbf57c5b9a5f983f44534c8371e181eb29c168cdefd6befe8de3b7c938e6d61496cb92f3b141da2707d4570fc4e559acf912a8be0c2eb8d8958f8cb73497da499944377f5be83d8f0d54fbb6e5d76f0ec714c0177dcf7e9455473d99e8e1bb74b8273e14dab62890ed45726a1424c8d360c600c7cdd49c3b0559131e2759ff11dad5448b56a1191819b7ba7d70916d5b6b75a4abeecf14253e6ff71dd36b001ab8d10479653a64a3074775be9251aa18bff3dc236c9c2a12aa597085fb9900763733d305ccc10c21ffd1d8f3a128979f3664de4d7eaa87e22ad62072ca7c729d2acd682e66b058e6bca192de134e16803090537f797302b277c1d256d72b71406d30150e8ccc2b555f81a65bc7f63ab80cf19a84b1b35da933a5ad46d35ecaee9e22a68891c11157dfcef7773b37ed10b65a56dd8931e7e1aea10a43c0d42b0ea6aa017fe9bd0c5d9c5c1c7c51c51ead05ef77bddc327a59bdc0875d0b7ef8824fae892f46855e342af4cf8424b4bbc1da56fbfa735d56a8b5d94a4690632a56629d2a4b2b0a634f83bfc92cb77847fab265dbb4aabce07f5ccfa1c397cba9b627e7f9327b142d0d9aaf10110573a9789d2edd6a04f6506dfbe1a26182948feff185363ed4b8ae595e120a7098e6accc69df8fef256f2b0fa05d212670f4d55830843ad59b3829074e55b7117c2ea91c22092f6ae0585e7eb1d569d27ad2c16355d5a83df7805c5645ca2ccc6a20215c48ee0f0ab77b3203f61e5916542cb99fedb1e3e18f6d4e370cc2ca73f2fe059688047a4a067d626aa1aaa03616ef8447e3fe311a583f4cbda175f8b9ddb3062afa626d582f21753deee94df19b0eadf9ffd72a9af623b902d106f7322d94e8e6c8201d053497cea11a8b9a97d1e76b8d1c4f749d34c268f784e1d35ff8504aed4431140087dea1c043bc01fea4c5000519d7959720d9e5e45bf9a6c74890e04d44dad266df3bce699dd25e462d089d272d65cc3446c8b33bbbb16ab921b20e14b159b2beaace745653d801bcef30af5bc2a76816c02dde348a8bd4663350742f682d22b27e2b4712341f23811e151cc339dde6fa637137475ccfd1f02cd38f212eaff8d52bf4229647eab61690542f7364dee53fc41ce629a22fec802f41f52f19c3047ad3e85d6175486676cfbae47546401c86a7f5dac96cb65b194fbd3a1895d4b5cc54cb30594d81674a1212205214d624e10e0d300ee36ad5c2211191401d28c56bc7126d3961dda7532ebfb05a4ff206374007fe49968bb2fb8e4cb2d95dfebbd7f207fa8ae6fc535564e6cfa76af8596e56138af4b685b52f7744ca12396ca78e918271ab1444e65f5a79c3327bacfb8280bf5bc54b4cf3d1c03b998d7d9b2487d9d42b1405fb25f9530dc3f1fad04863d9bf5cf4bed1102be34883c7f1dbde224a3ca31430438e1abc23490f65f8d39bd3b0e79adf91b824191a16dde672754392b857a245e40979d2fb6226dea5f17e0d9c5b4c519f1b08bf9e32e314cf4275fce2031cb3977f946e18c2655ef6fb0f571826af2a1cf9a1dfbee4c07bc13659b609751e227a30555a43862020d4347fab9812efa82f235e775c6f1e29d9371db0592a9a4bfcee6d7bc779ce5fe11fd558dbb1463db8889e7658b9f0d2d71f4c2bdb3caba1a73f785741d3b47af729f390760dd8b67587b06fea1ad78fe61a2cf6978fefb282b0df576182fa3077d8c8bf722b8f6a26f889de3326c5230c6293b6e18c12c73ac42799bf91acac3484696b724c0f60f060a5cfd8a52187af85f4becdb7aff67bb0c5ef57b67ca455a0cdafaff7d96b267d265ffc0105f57de09922ef72561c82e16fac5cc9f1b3f968e45990a5fedb3403a13d8b577a6c2dfbeb911ca924012763d198b902378a94701b9edcf5a48f57d1c526598f9d678e503769fcc2d7246f955ae257efc44cedcadb44921f109631cd8987eadea41bf35c54e44e23accdb5c514d6622b0d51f4705594d272c6962481c037bf15b0e50ec42e370ecb1c3202c8ec4ddc36beceaa2f505baa3a89c1c4bacd872b7b89b99e9accdc802131c347540acf30b20ca42dece9f6549b9b33416426b4d67aa7b1d2304b0d3d3e606e1dd225b69a865e8916c28b1f8c7a8ec0213fd421186838a69bb38a2d442168e29cca916aa8c9cb133ba34e739ea93d54fe2f58ca8d24210a59193b9aecc9ae7c4176ebc07858c323788848611e4821f2b57213ac290314a45f7f31f2f68f0023beb3f473844c19ad281672b3aeda7005ef11baeefc492f04eca6cb6f0925c62898343958a5f10ee828bc51c7e2bdd07efac5eb9ff41d1fb46f240ac837635e964ecbc431abf57a9eb681f720ef661edfee907d66e550327f0fc61af0e2489b2232a543fa5b4d8bc75cafae7db71ffd3c555fcb5416fe3d7506c5e03f1850785605df8c6fcd1e41fc485f12d421980632bf85a408c42ce430c0688a2f2062be7ecbae4c319317285c2d5b8bc66087e6c892f1f85451a02711aa81da20e8d3c6b8d0fa8779f8ca2bdd4af1cb83dddeb1de43d6d9e2c1c26f91e216c26517b1ea54d36a4c2bbd7f999b1ad2c3f6f9ebbde6f2fd236519fa12feaecf9796cc8cebb843edc166fbd2ec3b91c1ccdefdbe42b22a938118b86b74c821d974cd65e14d5c7b384182d1ecfa22670d6e818f25da7eace1aa80c0f5ef7a208da22faa029393cbf52687b80c02de2ead3010d86e2728dbc031c88253a3977f9b6228ca760b29a47d1a71a1473058ca7c2c8adf38965b748a523ee9c6d44a4f288da885258bea149a2f3c25f77bdded0355cde33b32f55f1c9104fddbd13a17fed4ac27a1f798b98f7f9058b3d8ec630c6d1887c2c2d9ea89dc79d6e5d1b0fa202b6e3160c0ce1a0b6aa2456cb9a708f9a8480d94df87f6030dafc80e5f51bd7181065309b20bc156d58dd1ede6a73fe5b970e7bbba58e615841de209b560a6464cf381624793e2cb3012eaefb371fed189e1cde846781341f965d43f59f1e234b77e62cab81dc3a1a79d9de9cd64f7677d5a14fd7b1c50e91db4d8208dbe3e1ad67399e2bb9715b059097f47134d9bc8dcc91ff16e60cf084881db05059b747e275a880fbef8b7271dbfc354009f832420736f0ea70c015f2dfbb46adb69c20595baa9d66366876e843a74ac92c0647ab29e16cad1b1d76615741a547963d172e56fad058d4f0cb9281ba78be66d9d09cfb1ba5971fdd077e1a2bb77942461f04da4f7fbee5e8247c3fae0e7fe664f2f564399496682dec224a9bf502c974c5ab6318bccc127354d870f3c94659988be135dcde6e804b1cb76ae44a54f38712689b0cd86fb2cd2a4bf257c91b6cd474b629d5616d4b47ef282d1b74d633749342963c424b8cc3bd3c8a944e48ef888755d09571e3e8b86439bd7777cd6dc922f0dd1a236442514ef8131c628a0b73e6841518ec88f693f1e16d8f39a52706c631e44d20e71894b00c1f14b75a3e58fdc27dce0581cd46bd9ae66f54520842ed060d9eae67230c58df9b8694fc443d4530b51e7ff5ba44a3aeed4ac6b7bbbb125075e1933d7a0fe997296b12f0136a6cf5c78f1c24560f4a0c99e1038529c4f8f3244ce2ec56132cf45ca12989a6ac41a897f34d83c0168ca71c83060097cef3cf7f97b4d78f1c1d0fd01c18b4ef5835632bf20080c579d1e82e7d032f3c1e7e9bb295c8319e88dd001c69106d74e4ec0c3dd5d24bd1cff2c287ca61ae5b45e4d2d659233be3ce6a7c232d1c535a28086f4b1fc1ae25bc8196520ec1429413deb2d777b35069304a928c12526d2b4755ab052011a0fd6b5501f3193ac49b37ffa85d0be031c972d47e6a390149a08d8a84314dc3fb086cf5cfb2ce66087ea5ed9ffc80b10cab0d05fa179dd20fcea5cb922e750c60b74a2844afc5872aa6f43f4659562e3841d5d2d5335dff24ae360a697effbcaee3c3b511213446e53eb924243ab9c04c9f90123377a038a09b9932a0bf78fdc40d3b4c6706630649e797089df761f25baa62a2eeff55049d2b3fc566802498b3ce10ae69de25cf9c881ed786907c199c3bba7c835debe55419e87445a402ff6cc169cc152695c2005039eb1a55275f958f933223cb0145cf67581b64c0740dc3df73a465c9fe74a064b9e855edb72ccc80dd0090143e28450e5ebb1c1a13eb4cd3d5f93aa1354a3f18386ae358ae061406393cce531959725aa945652a14a3ce40100368699dec490c7d0b494145d48a35396046faca1cf9b3cb39d8392e3728c22adfaa327ad54bcca94df2d949a3bf9b84f1faca6c6ae612e99949a11f03f7ec045efd0207d21c75bd64537c9f6465cb2e917985d7ef0ba320c5dd713fc5c8718eeb1e50f37eeb176dd37ad7a50f6d0c666b7bbc05e4e168b07ff2a87c025c8b51eb60a2c8e04c745be1aeae87711a1f1c030b8623a82064ceeacae6f9f04dd67466330756b425f776e9919d1cf56a6dd4bccf0c5465120212ead57b65478f189fd3803b3c6963c67bf30fee8f6a80dffeaa427cde1b34012f1a2d2d4775d395d4c5537071c29aa6cad2d09f66800bc787ab700c90c028c2b7246d64d0840f0cdfdc89db41617f6e72e65516c1e8cc944e76899663f29746eaf5bd7e22b81428abd2193370a545f47e3a1e025c697da235ce500f2535cb4d416bdfc433b91b2f8852369c313c88d483ec9f9f59e70ab8cb504c13c6fe465067ad02361db2546aa6182f0538ad0d6e2a40a81fcac68c97af900ac6813cc174cd69e4df2699b42e915745d0b0ad601abe784d39823dcf3878f373f9e2350cf0eb0ee7ce6fb155649e06297174dd000d9af83c8c4320f0425617879dbc8b6733b9e42646efa95206bf84336dee38841f3813ada30976b9af372e48684eddeb7076df5afcdbae6989f8ed56845d34ec557bf749d3bc629aff0395464dc4666dece07dc31795d73edc284785e8052ec57d8138b3347ba547981c591c873468087ab5eca1398dec718b8347e879ccef782093e5eaf82412d1308b2e794387448cb04a750e8295c684e6b9d2a7d4e97f06b631cb5ed148e8ea7210e8020f41b4317006077096e64ad73b3c9e0bd2ea3863ee9142d00690bd61e1d1499006fc4bfa9ad54b993261f779490d0971f18148bf3678d70601b9a1938cc8ae66ac52499d0ef692e23bb769c3fbb60df42214c552469591188bcd0768c65ea3c90c002bc9b50bded4527fecec42921c6f349b8cbce3ee07704e4c9896ba524e006e3c8509c6a82574b5e4547de5022b287896e943344f32b7c2f144dd49934f301930ce74f46fd8e000c6b56e1c5cc531a5996315028828159e0c6b8ad7874f4d478182ddb4b8d864313a116711ead8ef45b1bc131645655f387ab13247406a7bde67f9a01cc4b25a7f8a46b2deb4b53dd1b61401b6ca4a0ca1f8206f460c4d0afbdbb364ac0f56ea56f1b9ff44f51f55423c371a375c6197c000b37ab4575f9f2c1a4ac06d2d37ca4028fb566f0b0a7a3a8120ea9edf8913f03e2a5ba56797525220dca17f28b740c004b12651c914ed37d7da669f7c7290f144c8f656ae4cfcbded82752ee2d2c9e622d5d083b1249d2dad020acb1398112a96b4ea7925e691158486bb609666170179576a8529a2df4ca1aacdd72596811a27f43ab46115943a2e931a230a8347a1688240b0a8c58f5bacf3f721a96fb6124ad6a92dc596ff1dc96012fbdedd095749a4b1334041c01cc82450999ef7987fa08cf6a681d323e5f4030be248570dea2ec5a33dadcabb98a0869a9e308f7a54c660cf6b8fa92fc79ffc2c218234203e45fa4e253255aea9ac6e03c715d9908829b3e9f36ad5a068298aa5c5e47b05e2fdb4517749c6149c8c8e9c9ee27bc64bab5f02deafa4bd663783251a5840d733554f17e325c234d78c3ee68ec4ff0547d5ed09e93c67a4d5f355a53e12cb330e4f044250c90a58f41541e87afa7ec2c2268ec95bc7644828d0b105191c4c6a6641c9344810b5bca1864e578a9f765d8827c5782012320e83399ecdee4606650aff3dca5d680de18cd2b1e4159a63034514442d7786e323216fede840f792fb8ac9feda1c38ae8f0d3837825b1a5c1e81fd1e06ed97724137304c6ba67df69e6c3085175e100c3eea911b1b85aec953755b9c3b76d29e2f69f2f3f8ff859f6a3a3edeccae8f266140c281b95a9da0733a57627ed7f23b52ed705fd27f7544867f9c13bc81e4252d8121d8fd471ade562a961344b35bd63b78dae83ea4c61282440ddb519cb0ae5c2e48bffe7171cc2b645d1ff1428878250d969d7a204ed95ee78f119c9d7b8990a9178a351e48d49433f5d5e1f79a01ee759168a721ca9dc36865092b6e7fc5af1ba338a75377b5eaddcb7196f57dea9be9b082e6d149fe2f34da8cb16e62735e80b2a8c959b041578f37cb6125ab7a1ea6fed9d68285f0db10c21ca87b6eb45a8f04d55436d22883f788ccb60d78d0ea34e989f020d5aaf123186d41487980df028c7f8b325755ff0a09b24910033ad6b7cbd03efed54dca1a59b42e8f11bdd8319d3a2e0cb9f614ed315e68a65bb681278fb97ab62b5351aec2766ce5d67522f2cceeb20e077fa6d0f1faf611f1d11cc00506f7124e46ed3711a8dc3f9d475b1a92c32a7a00f2a16e02727a4b467f99063501715fe9c888000dc03dffd0f963613deed7106920c8d003cdd144c184117d373c050aa664ab1aa0d874b8ec3d0e075ee29f965212ed06c361a18690c987cc7fa44b19d01e7dd7bab2119d55cd4bf112f79f375b54f8a1b6f1e8c51a0b3abe2708fe1c00b927c467d33f6a65a7572fb39a85578fd375f67fec14f8893f1c3652863177f38d1cefecc41d38706d5f03d5ecb160ead5805336e78ae1af1ef24ca86d507368723f71056794a2b999cddc975712245c213e221328a2ba8c5ae14e8639f4aec34df7116045d1e0a17ae5386c242d502c2f3242eace9f9aa33ac862f77bca6494ad7c531aa32c1aca70c702fe52c2a2c1a5ad43c8614dfb323edfe00de127b741e5c5f8000d892d982ec6782cbe4d183257e8715a52fbcd845b684999eba74c769661db3049de41dd47e523b79685d79f41286ff5d165b462f1d33b8f9ed5b6660605ce65b63172412061cd0a055be6414019ded66443d52ad6fef801f4830e33526399b4ca356cfd67e4bbf9ce7641e70df73a0141975fb8b7c0a2d71140904d7dcda3f8851bf8a207189b29c25617543a07a7ab3788c2bd6a7ddf531d444a1b43d5330d2887bc1271386051dcca5607caad836b0b8d9472e133594f2506c8edd3052a79085827e32d682fe13941563f0f8d888caf374909265ad5ee869094258212f75a1fddd931d511992dbce5bb4ec52ea7bf0b9bae5be67117eb45d7d7d523e3190b4f814eb77ee410c40e1fd5820747546b69849ee6514cb29eff5554c3d22e1fe0ce7114f540953f1b5d780b0486449950df22ba93221ad7008424308d6358a3704a1b449845669072ef58a5b68f40147af8231ccba2ab4e2751df1bbb00085ed112a7148954e5c5e8cecdc4b5f0b1e33de3351ae93b1241e04fe55dbaf1c8df079e0731bddfdea75cd41573c703ae3d10eaec247d6e4c217db27543ca630f12d6618b2437508aca230cef127971938db02aa57b782ab448888faeb19048c18a2d3b7b4c179581b3cdc1953a7f6f96b719b0f2e75fbf6359f1fe1890f4cb4f8f1f064a4a891ed65958b4bc1cef84a3f36825a15b326939229f1b7c4897f99bcf206b3b65f29ea7274fef2704dfc2605d9438b556cd2cc1eb0986bc356219c70df8d22da60b3e45baa768292cac53480f738a5ebc6b1a64950bf3809f9c37ff97f4a4c3a14fcc1ae39b775bd0efd01428d41d82c8b2ccceecf4333cc4cbd9f03c42b781be8f0a495c2997a9edcc73b9e900b02173718c0feccb52a28ddb8cb439c5c7254978ac06ea601c08f3f7a824a951a6590e1bed0257e0384f1b20a10252d53713472190ed15dc09ed005f4e808060435330603b9d3b856a8d9979c0eb747ebf946a9b73b4d39a239f7f0eccc36021d1b3348b9681f9de1115342a1aaa7019a2e9d4f4d29863fe0f343977caaf03d4990cdde431c279749bda1c247fe76bc07c5a14a6414e64a607a4f48ba3f20432642ad88213f1ece7ce8cbf1a95cee334d60aa366223d35ff207ecc6683976f3d3193fd25a257cc420513554ee30598764efc07d11ee3980794e775bb71c8d7b8ccd7f3533df68e7d2f17228b6f76172ac7c8ddae5baf844ea02ff5c17b363b4564389d449551e785193353676f81ad72a7e15e23f2bf11a2d1a399c6f3b22c082c49fa57166b0434f21fa8e659b3f8eae83289aba1136c48e11967c62c9f94334f5354e83da6fa3f4dde915cbb829914351a17fb4eda0811410ac4181ad41c8c4c7f04edd028f0e77217d7d606961f8eb07fc23064d8b9c73b12b1a634543bbc52601283a7ea1995dc459191ce002aa216df7f35615a0598598aa18ac5319992c2a73d77ef98575192ba9a8322834faa9a38f3d4863339c55f4f3972ce8e2b79dd112eae87fcb5c95ba8bbcb867da56e7b42a6ad919f56293600a40697f82fc2551c6aa2cbd20610acefa003b1a4e1c08248803c940844730cd22df38677ea2ccb6e6fd5e30036d92d3668f3c0464881367517f04c15ff77cd508c1f42bc5a4ad243c116b78184ba34a3bdbd4edd8062a8982926e36d916a8ef52db205e65a71568c17a50a742d1cee993ca1479a90120524c0ee0ce6266c4bae96e81aa6537a04ad820b683b1c8a01397be4c69cc96131f1a9bcb611b03546c082e63b6a1cd324661a30a91841294654123e6346513a4c69d98d9074706387897476145cbbdee48d5e587e6160b1f506200c46b8a4be24a345b8cadc2ddf4e1e777873b4adeceed2b6fd739f63c0fc73b29c24685c57989acf539e876f5ee13d3c9c4934e523b1cd3610a8e8585d963d4c13fd5d9fc935a9d0c1a8179aae1501f4743d7278ef08b92ee6a9d574b627435d836a5f3d7cbc64fc6d3c7751ea00090a2258aa9a877ec198ede3f84af892fa3ecf113f036667c743ee2d2c111f006eaa848de2628bbbac82e1adb7b91f2165d9e26eb3efdc9ac3a3ed1c90120bb8cd4eaa7a4b779477a4db47508e621c6e7279f8c7fead38aa6a7190291a902b6c6d190001f511a4c146e080e9fc4422fd281bb03529ab7432a798227a769167e610ec58d79c9fce50ec66501276e96aaa20f0c2840e8d8be2913cf9e6d617b9e8c4292ec3de4d0d0d2378ebf64bf0abdc4f05e9a9be664a526d3ccac50dd689631f8a259cc98e5ded2f0bec288cc7d2f3dd39ad84a8d3ced964a483ea1dbbc8de54295f69b02de86b06b4044fbc79cfd3a71b3a584f4777d7bd9904fccdea3842069f3e37bd750295500b53000ff6b03aa1647ce3199cdb1e52937adf58bdfef7299e211989e972183261265766e1dcb01b7779c4ec16df03a639e461b917f668f338c5ddbe98e6a2d12aeb994fb33665c7faced75f888cad5f1a58605038bbf715ca5c4d07ee3a0af9c29da545ba66c279e0afa580ed95a62d86871d741f805e2aaaf9ebf55f1835751fe0c667deb6cc970c728e5cbea49934fc7636a03453e9cc84a03f46d1d45cfd25c948edcb4ea277942d2d2ed4422eb89dc7f374e3101d730767739f642faa3e585e7efcdbefa35223b8e2f740ab7441f60385eaee0337aedb758a3693a72b2cf92e6d119469451677d2cc3cf81c2df76eee59cfab7748213a0435f2d1f28c5ccaeedd45aae23c70e48f0cffe2fe059d42f4a8bd2204b425d9ea970f7788260d89cec29fb0f5234aab238af7e9aa89c33992b86f84be73aaf959ee44e58b6b7ce8e5cb1e1ed9a2e49971cdadc97c1c7c0b2212dd3743e779ca3685063fab308c907f7d8ed662c69abb378ea5ece02b1cf5b2a23d98e3259f1a71092676eab7ddcd0267e61054e3049d39996fbc6fbcce2113a774cc2b1ed611f4571e7a2afe45bfa362b450715006619ddde58c6805c4b5d8278838c3ff9a33ba4f534b870a3a2d77e6de26b3ff3b74251f3271190aedc8a2e9ae9c80db393bad6ae9379b5d01d6fc161eeae1bc945d86cda537c2966ae6536010d43894955f03295da361757f9dc21c3ddd52ff1d68a9d60dd01a361c0b97f29f942d5da8c48d9c3c403332089433b72c66a69b0aab8f45737d91ea3027dcdc083c79b1b42c09c5fdd09dc403d44f3e19e6af7c324acc82d265ddd04b4c333f91464a2adf04cd17e22fb2cd7a72404d31e66e1d48e8b92ab7ca3bb4d4f4e301342bdce04ef1fd9c06240a403c1387edcfac9d862412c5638b58475ea4e831302a4938358e54647c6a1a764bb79a801451f6a3e7bb4f27efa72737447db72d77ef42a9fdfa2dc52bc06c8ab6fefaff92edfd3cd95ac57d7ac3a8ae6bdfefa1542a0cae653f7b78626fce19736a373896be22a245357671ff4fc3172066e70f30b9dac186943b92cd63796ee555c64ae34df577f0a81d648f1a55997c58df296a18c89f0a48c3c214108fa009f6d59f44242a877494f1b4eb9e92447b17fd63fa2d32a7bd88dc050fa85dc585a83c346ed82817b22593f444554a77ac6855b50640a1cc0e4b6e112e1bdd4ba1fce9e3788c50287cb96c50bde9563b11cd41cbe2338901bd1da4b9523995d4924fd66b5d070951757ca28361f2d322677705bc8c9fbe8043551cca46ad1c1c5d4d5b73a787321102fca6a50a215648cec49045b5c95dfa5233e60df80799d2fa746ac5785b5163a1e632c9e8dceeb0a857056e60597f0a31d113810a5e5b1254892521cae4a10f321aa478444cfd831d7cf3a14333bc890166d70043a4c7256177df981a8eb72dd4e7dd34a71d5c4a33f48168186aa51f1b03ea92a4c8214b0ca9f76c255f068602b54b15b1394b762d3f212951bea56a7d6cb5d0d124714f03c6a3300bb1bdb8faa730f18facaeafec1de34c78c00702fa2188658dff7e8270603110299ee314c404340f936073316593957dcbb798b057b01e743438caec716ca0fd5cd22f04454bb64bfae9360ced000491645a505c7b98a2d088d9167c6b3e3bf20abee4b04a05c0e47325936b4a5fed06d4d955f84254ab394975314d2df19f495d854a86ba06984421ec194a0d278c3f9cff99fbe3c3b8d29e3c73dff4d6a69173b3c48b967b47ad4a7ae5a2db3f7477e9b92f99468936685d1f566341f82186f53cfe098bd75b6e75e6c5196588578fa19e31131ab330a3531091d48e0f69152b077eac82f3287353756165062746356927c2e9fa2ec028d3a6580c8f1d84bb0fe897924a074f575f6eb756f5d89a6cc47232276dd83171f54f505cb28ae34c7f3bac3ab649933f4dcd6bccf7430d37b0e53abef0eb599f79be237cad6b19c748e0e503b9a7146f16c716bda7c4e2d5ee84a595f6abae029a2dc1cd5992439d603c92c18446b6ae34fa4e101c6af92054a5bab740f509b8915bd84ef86b86ccaeffc46d358db737e065cc7cd28db50c720a406fcb53c91fd7ea37d8304af1e036256397b5241a540dd1658e00873bd7b54b5d62158aad92185de760a974c4d0de3556823f2d269ecf7af9e209bc798b1ab53aea094b02df91a373b297b7565973ef52fdb0cf868439db8e9b88c6ced779c809fb7bc4d2946d1318ebe3679154ff510a5df173a47e9b9296dc96f3f43d219e4dacb90cdca8ff4cf75ecc60b43a79afdc6294bdb534b24da6533e8e54ebb1a34a0e7bdbf6dd4c79ffe9eadc3a002e2a53f0582953da8861b8cba715f4a3042d4e863d88a178b003b9a05b60b6b5feff3f0b42aaa814e79890b3f664e045e52c8bf873942e14543bb39e49f1007053da237f26b7bdc4b0ae7530913b0a629bc9838150276a3f40edaf75b481d3d1becddf14c39bffaf7fff2c1f8e828d32eeb43bf65242c7ad64b1d8a3e81112eec2f36bf5fe34a8bd43726c976ffaa0f41361a32cdcf5feb35706ebf6effa281d93d5dfb7f925c7c24e96a5b79036ba3e8db7f52cbf35aaf0f50d4c2308d03a6bdd58445f95fd4a347069cf26913c6f5379933a47a3211776fbaec01f6b2e212de4379cd7d367fac28897a821e856c578a2c65517fe7d867dc8df702edf3519a79107c885612342961300b32f68768f5cd616c862ae242b4e513ff711f2052809b4faddb982312ab95654bc6669623f6cb9136dd9d6555ad877fc065c405fbb1f58a5c393a4438f8a74534ccf6184f50b37207e7521ddb5e145570836d16f3ab27e318804d47bd4b33c140a3029516ce5162966723f903069446b8a8f544cb42d86528d2538d7eb32c435040337306919d7b9028e9d8de4d03a091bb7f915dedc0dc8ce8e6da8aeb0be210aeaae459b28d28f282f1a481b821f0d6a3fbd7f1c518b022b48992ac155aa4516021e942c8395241ab6719e64b7783ac2bb5e3e9d3eac0ef794281c42a64db73585e6dfe5902878232595b489f8d17c3dce3e26cd61288f003f110f9525dd6fc65a8c1bfdee3d7cfef891bd546e90e0c24698c50aafe8ede905257bc8b8f7cacffa90ee2b9b618afdae3de3bbd74a5c8a572df9c7ac8090a4efcf3d0a06b648669bc1d4bf17fdc7d1bf3425881c5059c87a30f5b79c92940f499005ef60d31f41143d919048fadbb7b7bda08d98031cd04fda6567cb8f671d76538d9da8345c04ba130652c4d6e9c95bb52e72d8059a7d99497f08c9fcaf03e7776523dd491bcfed0d6ff69d083e7f09d8469a4be78d8bc508dfc02f1e45f4e3ed9f5a25d41dd290c1c32a3a2847ebffa3ac300576aae59f24a954a6e57d3f4f84d8151b4076ac82665a0ea0c86a7f9115dc28a3ce34d6775b465611d07af445be5fa05a897850edef3bbc81cef43ac80df37c378aab2f8e28d8120694ca66289c50d963106beb146e95490734d749bbb2c49525945efbf670aba9ff7487ffe7972d5c422738ffd0c22aa722dcfa728a5866b30c368420e7a01ad326c7119d2fbbfa77dd80adca8f2360b387c386faa62f12524f322d5ee15cbf1d9ae1238eec586b28293d353c35bf0a914b19b22fd600837945b46ef80f20b04de7716e5d62cb85e48cc33c6396951bc7149a35d5e040982ea2675273cdbacf1822d6f01a8462a4b3f1a1cb44a7059d49fb732e9593b872563d9deefefb327a748d8098c3d82e2fe4ac46f213919d3dc2ad12ec87164c2eb1b78f133bba3e513d8f911181621a7cfd138423b17556d9263f625b618c74ee90afe891b73098460fb427683c9172d137caa977ad6ebab93f14b28613f60be6871b9bab80fe12e8a75b231b68bb37d925b942f3551a4f308cf5c8008c72e9ea3f3e21e187da1ad73cbd7a14c538c46b5621add6246f1d7980c9ff363da112d39469ab8bf67ecc087ab650d9be309aadf139584ba5f0ce082cae5bf51c77c21eaf8973c3218878f9c134a9910ce2dedfc65b833f587d03c065c024942f5e2b8f48ae80b6c11638ee45d25c91099d07121126000759ab5c4cfb72eb4b8decab6abbec1f4fa5ac32300cb3f6c64c82c9b037c4f188bf9da701fe84c1ab53092eced7c9aee69ca82caa6247a4e43c3c6542f20eb77568f8055b196850aac10eb7553c75e340675957a36ce9088c7791973ad33edb88dec96f8acbdeb949eddace60acadd9d3e3c1e65b65d42e22d0ca4cecac1ef63604ffe7a6bda658ad6baf8d09321ea117560a836fd44370793653fa0a8e6d084b33c1e01d4b9bf96c6e28d841f48c8d9590d8a99d06af7639a86c3609cc35b32e9e98454dc73ad034690214f75da4d63aa47e5c3168fa9e73e4d3d474efeabb5675b77a194a076becd0c5795776839697562f7fa54977075cf0764377eecda40f4c7f0c82124ac479244264418c11792d33294cb4fffdf9dd25a5b101a7e67eef825ff80754d1419df5df648222f8de777ccc37e835435fe0c378f8bd5e34c2e76977f60ed17ff7497803850d469d59469dca2253366a28c60c769ee5e07e5e450696577305859cb65edcf9cb69c949ae49e41e8ac16adc95080e97582a09a963d6b2749b0b41737f041cf529187aaeceea4e566add29d1c4a6a771c7254c7934abade89317a1b32aaa628356c72f643fc5379cf1eedbd0060309e65d8f30b1305d7cfb1bae60ea264260c48f3fd14e595b504ab4454e63462bb3430b2b6fe751ced4646570ef0c0dc8dcc6077b2ebf738e96cee8fe194455939c8802698dea9e983bc251eb5015dfe1cc802a2e525f0d990185b4c64954a94f0d6a4fe2abeecee27c4eba28a63be77e83a217b89883f4e5cab1cf4b04a5c07857fceb6276a3b32bff1f4f2850caea84f468ccd1b13946c011ebefb88d17a70d16591d7d990973475f322ffe86c70cdb66082a8f8d91e21dcd126c1dde4ccacc0a9e25e7cd7350d0823668c646f56029eec5a64cc66591b4494ad631201c64dd1cdb32d9ee74c4cb1a6ef5a13074203c4341a5d3107a29752eb3ce772a3c995938362f224264786189796e43a08d4f19ee309114392ab5deb6bb2cd0b28540d06c4e31ad73867e804484f7ed3538f0d5017206b0bd78755edf80f3421c74ff08564d39c702a6ae3671706cef5359580002ccb9ad48bf5ce5a07f44315b88a002420e084709b89ca25bc6f71b61f445f52de0503678e06f60e82d7896b8aa9131151df5d81c56572c10fd3d19cf16a319205a9014058a006ff6f64593f40e71b3d08f076845b98404128286b3731882fb1ff36ed24424b4cc18766986e8fd411bb389e9af81b49177d96a9b613f579da5a2e42d30ea0239b405e58d0deaf7634171d0499f4bf8aabb42c50a089b7484c4adfd3eb036c816b9c876601241f910c841d17b29d6f28862e155a0052f9c3640f3e85bd383ef54d997fd7c067126f40188a9c453a17dc2d35050738788c014bf9aeb45bdb0fc040a3dae9087843b7a7d61f736710c7246843faf1b159429555db921d3b6afbab29b487f99e22ad23a223ed953ef0558d3eaf690c2feeb587b53e85cd4f7460cc94dceef788abef63fc43585fae5c1ba451989b98b955b923ef28772d5de73791519800929ae90c966d2108f77be48d537f7f976bf526d422a3825f79099425dbdcc692bac4312a1816c573e6585d1c7848983d0f778a4cef8fa42351eb600d2abcfabbcf4fe884c524182755343a65ed4649e016fe55b38c5c4ad656a0fef36c5ff6d7cd2364a866a15f87e6d8efa4ee4ae17704f22280e3dd7021c13b0790cd53175a165355fc7fc818fc8fb947d281a81dfa6950a5e0946e667ff1c8408fc9b145900d8e71a91f9da8d2621627bc39e0cce4a714ed35affa7b0d602ff5f74b2e4aa4c165e1179b0413493bba42354bb21f021237f4fa51086f6f1a4b8926c68f2686efde9f3189a6eb7b0628ee7136c45bfe19113c5ecf8793b2baf64073cc4001c04ed6224adcd6dbe6739f80ad25150602f845d82fddb2b4a70477eaf63681b656fd07a86ce20c1d5077d3702ac7d8db563bee75d5b1b4fc18445232d29f4c477b0aaa668d8f36699b31331e8d7c485b8d6f2cc753d24cda807660b9305def828e7f88d8052c16d69b1a183e5592d7233224cabe76f357177124550ccdd8caad9e3a494a6db74f6ffa6acefbd37e8faafdd31d69716b3ee5922fd82a20343c8fd8f52cc1a0a7bbaf68f160bf007298c0a6724271cab4d800a7d9d074b12260a7bcd7fe613308b2559ec10def2753129826c019ad891456a599f97dd0a8bc629410912ca781ed51c5e74de646f73e6feca16dc5c1dbf20834edd2bc2f50c19d613a8cb4c6406781f4e533b0aff13084f8df3555d0834cb3e24db0ff2f41d1d3f21e7bc81202f56ef7e6607d169c39c6df1d9538745e9fff829e09a0f910e9a5d315501efa46c12d4af8587fe660c95154cf1c23b56635217d77577c7f9be1ff52c514df03229ceede0233f5048e82025f8a63bc3fe857dd01ba2c5844137b3a410257f2f318fa766a3b8c03c1186b927b724fdee1150e662a832ca1d91fd44de3c5da86e0172b6eccbffa626e487033d445b1d301432ebe23b03d832312482878f6706a73ab41b1c0c0607c78d44ab949292fc5be0ff9594dada1fe7340a78502bf712290a24c4d39abe18e57f72d6f268823e8917c07462602b43a0b31c34f0fe7a3182465b849b07b8379d2b8c8cd5c2cff07f283e4502f8b3f75329e7a8748ff0560c28a3defd9e19d7d75b309343e1b34a0363b783064e1297c0f341bf588a9753df9d7d664b8cea83cf99cd1f7d157801188b792f96d480152ffda80398b36c1891f77dfbb39455e323846e4bc043785d86ba579b028858e153a808a8423dae771712cbddeec0e1a37a0c11bfe5f9d60028c0d54eaac1491ee9eb6adf9483b8386cdc02c9b3d92e4c5d87bc5ce1c8c88182077139432fc35f8bf5c382b7d33d833c50209cd004c49be28680932e6b79c745ad6d5247fd84e03fb78a6a2f8952c3d350b565a0edf93889065ca671984aeb44323dc9dc4ee64902bb1e00e12157c4db2f6cab8ce09acb961afa48a58446a678b19f6d9edd8e6f3880cd713dec1c5003fece8c9214518e2afb7fb2b59529c71c5a50c99352bff9432ef3a34da9d4cbc13105c45c100538fcf17a891668c889b91200e0934d5b7eb2f8c6fd60712742953c36ea6b1a4fc7e1403f71077c8cb0a58fd7fc94c9eb7b26ee44b4d123918e03e064263ee7651bca931f447eccd4d8ace1662ad79bdd80f25446c2a8f3e19b3fdf94620952f79511b0eaf5d3872f4b7e5038e0628ddb50440c12e5e4eb6d57c37ce56cfab5eafa6e7c65053783b618962d07d549146e595ae4761a3912d9d7cc97f76bacf0ace92aadeee7664d50c63241dd99d8ce02cfc7aacfdca5441671be9f28a8aa7c34bde965f7878db559201c6d78e9d0f11aeff961fc4f6cbf89124e0e792e8cc7af62b130b8aa6b28ef1b7242dc651413d8b622cce56bf39c5b483074add091d6a45bd8a63576e065d8a01b9762344f1dae45dac3bfbb0ecb39ce206e75151d819dbbfb7bd95dfa8e81e2d1c0959abfb74e59683a9739ee78f2332085f52b342e1c2649db0202b9a721d52dc0ce3bfc6028e78de5182b60f5cc9a80ee7f01076f4816c3d5ffeb1874d58136d07b260f069c5e0b064df19884e50f9d55f5af31b65d57d26ae78d816408c51ad4c5cd16a83cd333594f3955799bb2e9ae6fe1faa1c927a9a7d68c544d285d177aecd253c67290b5b5c1858af9c9305b21fc1ce5d8b49b61f0bc22f746cd6a537a39970dce09c2ffaed8ce20d4b8105fd1c3bec1746e26057aec542b6e0f9aec5511fec1331aac9af4e9a70940b36963103e2e68bbf8bab41cf93434600c2b4749904c6109217e9167df1225c9e153e15e1b3f8a03b4c07b29b4e856c3258d73cd9978bef0a2fc48dc8c621ae6eca8ae14a42df29bd5b9f8b3aecf907bf2dd119f24b52a69486ea4a78286c219fa8706c488a3be95fc01fca255f76f266871f1c59d05290ccd6df0c72cce285549573cfaf0e94e58aef790c22f7d45ba34e570cf3177c396b190a9b3471b0acad51f7e9c97e6b51f44cb936b5121bce8d2689ab7a15aa1b7d06e22038f27963deaf110c31b5fb2bffdbd0f4d17441142862412cc09344142a8c5a04ec6c14edc9b22db758d23187d18518edd0a131bcb7c8f9008728912dc31ca149b2a01363dc9d9b9d842e8afc8158dff47a6f0be510bc6e84391de527e514a847aed0f6e96dabb954074a7693039c1bff2284d427538315c2df1397a69cb119463e9f1635a7c83599226e0527f20dcfadb087cfdb8da5d0f1d9114cd7d834ad5d210324ff6776dafe44853a9745436a24d2914a8b5afc9291aeebfa0ff7b918f71c2cbe58e1b4e14474bf21c2fc1439cc6bab3f95eafe7ef0b5872478ba1e7e59ccc4b13577844d288043c2914dbb368c8d9eb6c0583995736c7620fe39d65d72432578a8bab90839206a1ce2565d23e67c352527476f0f619fecb253c663bc273948c262b74b628855090a58c78f41d5452c49a57e133b8f87f3b04e1f4b0544efaf2a215b7fbb44e0bdc7bcfceff343c9ea2dcccbcf92708fb3a633d20e55c57b8fb2c58d63810d7fb3c148b4b79ba6e7cd167465e1dbd6473337cd890c01cb4d9f5d66ee7c99d38183f6df06fa0b6d0f8a413ffe189d06af350192e30fc8aa211641f0e0f9d2a76aec9906a19af17f27071194c75100e0f5edce561bafc3a55bcbb3452ad0b0c862d8e62c984879ce026817673d1dbc08bd82df6a691cc2cfb09f3c8ab8111322cbc366db71c3189ec557b4a978e1776442d10ed8433aa3e748858cc43901904f0f51a70d960b9a570406070df94a97b79721b9517f97ac09d9c5c57e27445e8fad05e96504d2695604955f8c65bc8fa8408cdb3e1014da7928cc9ba01649668c47f7c9b8889ba1402d384c659eea3e146f8c05c0887682a55b64ca3022c9cbeb208b4428578c84e181cb502650e5676f08b3d7f40704825c22c83cc4ecf660d437db95b2b6d9841cf5e182c0b5373aeaa47870379b2c1176e45710c4c074b7116d0ff12922fe2001", + 1 + ] + ], + "callback_url": "http://127.0.0.1:8080" +} diff --git a/templates/default/server/runner.ts b/templates/default/server/runner.ts new file mode 100644 index 0000000000..c9f5dab3d0 --- /dev/null +++ b/templates/default/server/runner.ts @@ -0,0 +1,35 @@ +import { getCheckedEnvVars } from "./utils"; + +export async function callFheRunner( + e3Id: bigint, + params: string, + ciphertextInputs: Array<[string, number]>, +): Promise { + const { PROGRAM_RUNNER_URL, CALLBACK_URL } = getCheckedEnvVars(); + + const payload = { + e3_id: Number(e3Id), + params, + ciphertext_inputs: ciphertextInputs, + callback_url: CALLBACK_URL, + }; + console.log("payload:"); + console.log(JSON.stringify(payload)); + + const response = await fetch(`${PROGRAM_RUNNER_URL}/run_compute`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + throw new Error( + `FHE Runner failed: ${response.status} ${response.statusText}`, + ); + } + + const result = await response.json(); + console.log(`✓ FHE Runner accepted E3 ${e3Id}:`, result); +} diff --git a/templates/default/server/testHandler.ts b/templates/default/server/testHandler.ts new file mode 100644 index 0000000000..0a3c6e055b --- /dev/null +++ b/templates/default/server/testHandler.ts @@ -0,0 +1,9 @@ +import payload from "./payload.json"; +import { callFheRunner } from "./runner"; + +export async function handleTestInteraction() { + let e3Id = BigInt(payload.e3_id); + let params = payload.params; + let ciphertextInputs = payload.ciphertext_inputs as Array<[string, number]>; + await callFheRunner(e3Id, params, ciphertextInputs); +} diff --git a/templates/default/server/utils.ts b/templates/default/server/utils.ts new file mode 100644 index 0000000000..260872d538 --- /dev/null +++ b/templates/default/server/utils.ts @@ -0,0 +1,20 @@ +export function ensureEnv(key: string): string { + const value = process.env[key]; + if (!value) { + throw new Error(`Missing required env var: ${key}`); + } + return value; +} + +export function getCheckedEnvVars() { + return { + RPC_URL: ensureEnv("RPC_URL"), + ENCLAVE_CONTRACT: ensureEnv("ENCLAVE_ADDRESS"), + CIPHERNODE_REGISTRY_CONTRACT: ensureEnv("REGISTRY_ADDRESS"), + PRIVATE_KEY: ensureEnv("PRIVATE_KEY"), + CHAIN_ID: parseInt(ensureEnv("CHAIN_ID")), + PROGRAM_RUNNER_URL: + process.env.PROGRAM_RUNNER_URL || "http://127.0.0.1:13151", + CALLBACK_URL: process.env.CALLBACK_URL || "http://127.0.0.1:8080", + }; +} diff --git a/templates/default/tsconfig.json b/templates/default/tsconfig.json index 83eae42960..a2a3e02585 100644 --- a/templates/default/tsconfig.json +++ b/templates/default/tsconfig.json @@ -6,6 +6,7 @@ "moduleResolution": "nodenext", "forceConsistentCasingInFileNames": true, "strict": true, + "noEmit": true, "skipLibCheck": true, "resolveJsonModule": true }, From cc101d01d9b961658cb2ad5a398da2d54b36d452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 12 Jun 2025 17:58:19 +0000 Subject: [PATCH 068/106] Update README.md (#508) --- templates/default/README.md | 166 +++++++++++++++++------------------- 1 file changed, 80 insertions(+), 86 deletions(-) diff --git a/templates/default/README.md b/templates/default/README.md index a14f5ac6e6..33cc566a62 100644 --- a/templates/default/README.md +++ b/templates/default/README.md @@ -1,144 +1,138 @@ # Enclave Protocol Template Setup -This template allows you to deploy and interact with the Enclave protocol locally without copying the core contracts. +The Enclave Protocol Template provides a complete development environment for building and testing applications with Fully Homomorphic Encryption (FHE). This template enables local deployment and interaction with the Enclave protocol without requiring the core contracts to be copied. -## Quick Start +## Prerequisites -### Prerequisites +Before getting started, ensure your development environment meets the following requirements: -Tested with the following: +### Required Software -``` +**Docker** (tested with version 25.0.6 or later) + +```bash docker --version -Docker version 25.0.6, build v25.0.6 +# Expected output: Docker version 25.0.6, build v25.0.6 ``` -``` -pnpm --version -10.7.1 -``` +**Node.js** (version 22.10.0 or later) -``` +```bash node --version -v22.10.0 +# Expected output: v22.10.0 ``` +**pnpm** (version 10.7.1 or later) + +```bash +pnpm --version +# Expected output: 10.7.1 ``` + +**Rust** (version 1.85.1 or later) + +```bash rustc --version -rustc 1.85.1 (4eb161250 2025-03-15) +# Expected output: rustc 1.85.1 (4eb161250 2025-03-15) ``` -Linux/POSIX environment +### Optional Software -Note for Nix users a Nix flake is included within the generated template. +**tmux** (recommended for managing multiple processes) -### Install Enclave - -``` -cargo install --git https://github.com/gnosisguild/enclave e3-cli +```bash +tmux -V +# Expected output: tmux 3.4 ``` -### install wasm-pack - -``` -cargo install wasm-pack -``` +### System Requirements -### Generate Template +- Linux/POSIX environment +- For Nix users: A Nix flake is included in the generated template -``` -enclave init ./myproj -``` +## Installation -``` -cd ./myproj -``` +### 1. Install the Enclave CLI -### Run all services +Install the Enclave CLI tool from the official repository: +```bash +cargo install --git https://github.com/gnosisguild/enclave --branch hacknet e3-cli ``` -pnpm dev:all -``` - -This will run: -- `pnpm node` - hardhat eth node -- `pnpm rpc` - Server to accept computation output and post on chain -- `enclave program listen` - Server to listen to onchain events and compute over encrypted inputs then send to the rpc server -- `pnpm dev:frontend` - Run the frontend for the template +### 2. Install wasm-pack -### Start Local Hardhat Node +Install wasm-pack for WebAssembly compilation: ```bash -pnpm node +cargo install wasm-pack ``` -Enclave contracts should be automatically deployed. +## Project Setup -### Compiling your program +### Generate a New Project -Use the following command to compile your program: +Create a new Enclave project using the CLI: -``` -enclave program compile +```bash +enclave init myenclave +cd ./myenclave ``` -This should create an `ImageID.sol` contract within the `./contracts` folder. +Replace `myenclave` with your desired project name. -### Your FHE program +### Project Structure -Your FHE program is a rust crate located under `./program`. +The generated project contains the following directories and files: -### Run your program with enclave +| File/Directory | Description | +| ----------------------- | -------------------------------------------------- | +| `./client` | Client-side application | +| `./contracts` | Your contracts that interact with the protocol | +| `./deploy` | Your deploy scripts | +| `./enclave.config.yaml` | Configuration for the enclave CLI | +| `./program` | FHE computation code | +| `./scripts` | Scripts to run the project | +| `./server` | TypeScript server that coordinates the FHE process | -To verifiably run your program with FHE locally with enclave you first need to setup an RPC server to receive the computation output. +## Running the Development Environment -You RPC server gets called by the enclave program listener when the FHE computation is complete. +### Start All Services -We have set one up in the template to run it you can use the following command: +Launch the complete development stack with a single command: ```bash -pnpm rpc +pnpm dev:all ``` -Your RPC must provide the following methods: - -```ts -type Capabilities = "processOutput" | "shouldCompute"; +### What Happens Next -interface RpcServer { - // Handle the FHE - processOutput(e3Id: number, proof: string, ciphertext: string): number; - capabilities(): Capabilities; -} -``` +The command will start multiple processes simultaneously: -### Run a listener +1. **Hardhat EVM Node** - Local Ethereum development network +2. **Enclave Ciphernodes** - Set of nodes for FHE processing +3. **TypeScript Coordination Server** - Manages FHE process coordination +4. **FHE Program Server** - Handles encrypted computation execution +5. **Frontend Application** - User interface for interaction -Next you can use the `enclave program listen` command to run your computation: - -```bash -enclave program listen \ - --json-rpc-server http://localhost:8080 \ - --chain hardhat -``` +### Process Management -This will listen to your local hardhat node and trigger computations when the E3 round has expired. +- **With tmux installed**: Your terminal will split into multiple panes, each showing logs from different services +- **Without tmux**: You'll see a stream of logs from all processes in a single terminal -## Usage Commands +### Accessing the Application -### Ciphernode Management +1. **Wait for initialization**: Allow all processes to fully start and stabilize +2. **Open your browser**: Navigate to [http://localhost:3000](http://localhost:3000) +3. **Configure MetaMask**: Ensure MetaMask is installed and configured with a local network pointing to `http://localhost:8545` -```bash -# Add a ciphernode -pnpm add-ciphernode 0x1234567890123456789012345678901234567890 -``` +## Next Steps -## Alternative: Direct Script Usage +Once your development environment is running, you can: -You can also run the scripts directly with custom parameters: +- Modify the FHE computation logic in the `./program` directory +- Update smart contracts in the `./contracts` directory +- Customize the client application in the `./client` directory +- Configure deployment scripts in the `./deploy` directory -```bash -# Add ciphernode -npx hardhat run scripts/interact.ts -- add-ciphernode 0x1234567890123456789012345678901234567890 -``` +For detailed usage instructions and API documentation, refer to the project's README.md file and the official Enclave Protocol documentation. From b426a8785388cfd32f412affe04d86afe82a6934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 12 Jun 2025 18:01:01 +0000 Subject: [PATCH 069/106] bump (#509) --- packages/enclave-react/package.json | 2 +- packages/evm/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index 92e81cab7c..36709c6f15 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.20", + "version": "0.0.5-test.21", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/evm/package.json b/packages/evm/package.json index 9e44947bc5..938b8cc568 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.20", + "version": "0.0.5-test.21", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", From 8e2bb449abe71b47b22471fdcc2a37f99fc9ae96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Thu, 12 Jun 2025 20:55:03 +0000 Subject: [PATCH 070/106] Update package lock (#510) * Update package.lock * Bump package version --- packages/enclave-react/package.json | 2 +- packages/evm/package.json | 2 +- pnpm-lock.yaml | 129 ++++++++++++++++------------ 3 files changed, 76 insertions(+), 57 deletions(-) diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index 36709c6f15..a3d36c7900 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.21", + "version": "0.0.5-test.22", "description": "React hooks and utilities for Enclave SDK", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/evm/package.json b/packages/evm/package.json index 938b8cc568..766e055e12 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.21", + "version": "0.0.5-test.22", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3a247cc74..8ee9df4037 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8953,7 +8953,7 @@ snapshots: dependencies: comlink: 4.4.2 commander: 12.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fflate: 0.8.2 pako: 2.1.0 tslib: 2.8.1 @@ -8978,10 +8978,10 @@ snapshots: '@babel/helpers': 7.27.6 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -9022,7 +9022,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9039,7 +9039,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -9060,7 +9060,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9075,9 +9082,9 @@ snapshots: '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9092,7 +9099,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9101,13 +9108,13 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9125,7 +9132,7 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color @@ -9143,7 +9150,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9170,7 +9177,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9214,14 +9221,14 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: @@ -9260,7 +9267,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9321,7 +9328,7 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9367,7 +9374,7 @@ snapshots: '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4(supports-color@5.5.0) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -9487,7 +9494,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) '@babel/types': 7.27.6 @@ -9701,7 +9708,19 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.27.5 '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9940,7 +9959,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10235,7 +10254,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10562,7 +10581,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10815,7 +10834,7 @@ snapshots: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -10839,7 +10858,7 @@ snapshots: '@paulmillr/qr': 0.2.1 bowser: 2.11.0 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -10862,7 +10881,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -10875,7 +10894,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -10889,7 +10908,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -11137,7 +11156,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 @@ -11146,7 +11165,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 @@ -11172,7 +11191,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.11 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 10.1.0 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -11258,7 +11277,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@20.10.4)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11273,7 +11292,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.7.5)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -11288,7 +11307,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) ethers: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -12507,7 +12526,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -12523,7 +12542,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -12537,7 +12556,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13243,7 +13262,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13516,7 +13535,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -14716,7 +14735,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15024,7 +15043,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15142,7 +15161,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -15193,7 +15212,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -15533,7 +15552,7 @@ snapshots: axios: 0.21.4(debug@4.4.1) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.2 @@ -15611,7 +15630,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15662,7 +15681,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -15945,7 +15964,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17093,7 +17112,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -17115,7 +17134,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -18338,7 +18357,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -18420,7 +18439,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -19177,7 +19196,7 @@ snapshots: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 @@ -19225,7 +19244,7 @@ snapshots: typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19631,7 +19650,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@22.7.5)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: From d12136f80b7f7bfe96ad725b16f38f54847bfae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Fri, 13 Jun 2025 06:29:57 +0000 Subject: [PATCH 071/106] Fix cargo install errors (#511) * Add artifact to git to avoid cargo errors * Try precedence * Add artifacts to git --- packages/evm/.gitignore | 7 +- .../ICiphernodeRegistry.json | 220 ++++++ .../interfaces/IEnclave.sol/IEnclave.json | 698 ++++++++++++++++++ .../NaiveRegistryFilter.json | 306 ++++++++ 4 files changed, 1229 insertions(+), 2 deletions(-) create mode 100644 packages/evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json create mode 100644 packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json create mode 100644 packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json diff --git a/packages/evm/.gitignore b/packages/evm/.gitignore index 2b59089360..49ca6926b1 100644 --- a/packages/evm/.gitignore +++ b/packages/evm/.gitignore @@ -2,7 +2,10 @@ .coverage_artifacts .coverage_cache .coverage_contracts -artifacts +!artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +!artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +!artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json +artifacts/ build cache coverage @@ -18,4 +21,4 @@ deployments/localhost .pnp.* coverage.json package-lock.json -pnpm-lock.yaml \ No newline at end of file +pnpm-lock.yaml diff --git a/packages/evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json new file mode 100644 index 0000000000..a50ca20a13 --- /dev/null +++ b/packages/evm/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -0,0 +1,220 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ICiphernodeRegistry", + "sourceName": "contracts/interfaces/ICiphernodeRegistry.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "node", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numNodes", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "size", + "type": "uint256" + } + ], + "name": "CiphernodeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "node", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "numNodes", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "size", + "type": "uint256" + } + ], + "name": "CiphernodeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + } + ], + "name": "CommitteePublished", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + } + ], + "name": "CommitteeRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "enclave", + "type": "address" + } + ], + "name": "EnclaveSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "committeePublicKey", + "outputs": [ + { + "internalType": "bytes32", + "name": "publicKeyHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ciphernode", + "type": "address" + } + ], + "name": "isCiphernodeEligible", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + } + ], + "name": "publishCommittee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + } + ], + "name": "requestCommittee", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json new file mode 100644 index 0000000000..c0cf65458e --- /dev/null +++ b/packages/evm/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -0,0 +1,698 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IEnclave", + "sourceName": "contracts/interfaces/IEnclave.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes[]", + "name": "e3ProgramParams", + "type": "bytes[]" + } + ], + "name": "AllowedE3ProgramsParamsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "ciphernodeRegistry", + "type": "address" + } + ], + "name": "CiphernodeRegistrySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "ciphertextOutput", + "type": "bytes" + } + ], + "name": "CiphertextOutputPublished", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "committeePublicKey", + "type": "bytes" + } + ], + "name": "E3Activated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3ProgramDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3ProgramEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + }, + { + "indexed": false, + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "E3Requested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "EncryptionSchemeDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + } + ], + "name": "EncryptionSchemeEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inputHash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "InputPublished", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxDuration", + "type": "uint256" + } + ], + "name": "MaxDurationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "name": "PlaintextOutputPublished", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + } + ], + "name": "activate", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "disableE3Program", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + } + ], + "name": "enableE3Program", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "getE3", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "getInputRoot", + "outputs": [ + { + "internalType": "uint256", + "name": "root", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ciphertextOutput", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "publishCiphertextOutput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "publishInput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "publishPlaintextOutput", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "filter", + "type": "address" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "computeProviderParams", + "type": "bytes" + } + ], + "name": "request", + "outputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "seed", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "uint256", + "name": "requestBlock", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "startWindow", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiration", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "encryptionSchemeId", + "type": "bytes32" + }, + { + "internalType": "contract IE3Program", + "name": "e3Program", + "type": "address" + }, + { + "internalType": "bytes", + "name": "e3ProgramParams", + "type": "bytes" + }, + { + "internalType": "contract IInputValidator", + "name": "inputValidator", + "type": "address" + }, + { + "internalType": "contract IDecryptionVerifier", + "name": "decryptionVerifier", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "committeePublicKey", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "ciphertextOutput", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "plaintextOutput", + "type": "bytes" + } + ], + "internalType": "struct E3", + "name": "e3", + "type": "tuple" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxDuration", + "type": "uint256" + } + ], + "name": "setMaxDuration", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json b/packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json new file mode 100644 index 0000000000..e6c6abb981 --- /dev/null +++ b/packages/evm/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json @@ -0,0 +1,306 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NaiveRegistryFilter", + "sourceName": "contracts/registry/NaiveRegistryFilter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_registry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ciphernode", + "type": "address" + } + ], + "name": "CiphernodeNotEnabled", + "type": "error" + }, + { + "inputs": [], + "name": "CommitteeAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "CommitteeAlreadyPublished", + "type": "error" + }, + { + "inputs": [], + "name": "CommitteeDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "CommitteeNotPublished", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRegistry", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3", + "type": "uint256" + } + ], + "name": "committees", + "outputs": [ + { + "internalType": "bytes32", + "name": "publicKey", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + } + ], + "name": "getCommittee", + "outputs": [ + { + "components": [ + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + }, + { + "internalType": "bytes32", + "name": "publicKey", + "type": "bytes32" + } + ], + "internalType": "struct NaiveRegistryFilter.Committee", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_registry", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + } + ], + "name": "publishCommittee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "e3Id", + "type": "uint256" + }, + { + "internalType": "uint32[2]", + "name": "threshold", + "type": "uint32[2]" + } + ], + "name": "requestCommittee", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_registry", + "type": "address" + } + ], + "name": "setRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080346101f457601f610eb938819003918201601f19168301916001600160401b038311848410176101f95780849260409485528339810103126101f457610052602061004b8361020f565b920161020f565b600080516020610e9983398151915254604081901c60ff16159291906001600160401b038116801590816101ec575b60011490816101e2575b1590816101d9575b506101c8576001600160401b03198116600117600080516020610e99833981519152558361019d575b506100c5610299565b6100cd610299565b6100d633610223565b6100de6102c7565b600080546001600160a01b0319166001600160a01b03928316179055600080516020610e7983398151915254811690821603610186575b5061012a575b604051610b7b90816102fe8239f35b68ff000000000000000019600080516020610e998339815191525416600080516020610e99833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a161011b565b610197906101926102c7565b610223565b38610115565b6001600160481b0319166801000000000000000117600080516020610e9983398151915255386100bc565b63f92ee8a960e01b60005260046000fd5b90501538610093565b303b15915061008b565b859150610081565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f457565b6001600160a01b0316801561028357600080516020610e7983398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b60ff600080516020610e998339815191525460401c16156102b657565b631afcd79f60e31b60005260046000fd5b600080516020610e79833981519152546001600160a01b031633036102e857565b63118cdaa760e01b6000523360045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816218449a1461082e5750806329f73b9c1461053a5780632b20a4f614610468578063485cc9551461022e578063715018a6146101955780637b1039991461016f5780638da5cb5b14610129578063a91ee0dc146100ea578063f2fde38b146100bd5763f5e820fd1461008e57600080fd5b346100ba5760203660031901126100ba5760026040602092600435815260018452200154604051908152f35b80fd5b50346100ba5760203660031901126100ba576100e76100da6109e4565b6100e2610ae6565b610a40565b80f35b50346100ba5760203660031901126100ba576001600160a01b0361010c6109e4565b610114610ae6565b166001600160a01b0319600054161760005580f35b50346100ba57806003193601126100ba5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b50346100ba57806003193601126100ba576001600160a01b036020915416604051908152f35b50346100ba57806003193601126100ba576101ae610ae6565b806001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346100ba5760403660031901126100ba576102486109e4565b602435906001600160a01b0382168203610464577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161045c575b6001149081610452575b159081610449575b5061043a5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556001600160a01b039190846103fb575b506102fd610b2e565b610305610b2e565b61030e33610a40565b610316610ae6565b166001600160a01b031960005416176000556001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036103e9575b5061036b5780f35b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b6103f5906100e2610ae6565b38610363565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386102f4565b63f92ee8a960e01b8552600485fd5b905015386102ae565b303b1591506102a6565b85915061029c565b8280fd5b50346100ba5760603660031901126100ba5760043536606411610536576001600160a01b03825416330361052757808252600160205263ffffffff600160408420015460201c16610518578152600160205260016040822001602482805b600281106104dd5750505055602060405160018152f35b90919384359063ffffffff8216918281036105145750600583901b91821b63ffffffff90921b1916179360200191906001016104c6565b8480fd5b6334c2a65d60e11b8252600482fd5b6310f5403960e31b8252600482fd5b5080fd5b50346100ba5760603660031901126100ba576024359060043567ffffffffffffffff8311610536573660238401121561053657826004013567ffffffffffffffff811161081a578060051b936040519161059760208701846109c2565b82526020820190602482968201019036821161081657602401915b8183106107f6575050506044359167ffffffffffffffff831161075557366023840112156107555782600401359267ffffffffffffffff84116107e25760405193610607601f8201601f1916602001866109c2565b808552602085019136602483830101116107de57818792602460209301853786010152610632610ae6565b81855260016020526040852090600282019182546107cf5784519067ffffffffffffffff82116107bb576801000000000000000082116107bb578054828255808310610795575b508890885260208820885b83811061077857505050508451902090556001600160a01b0384541660405192604084019060208086015251809152606084019690865b818110610759575050506106dc83869796959603601f1981018552846109c2565b803b1561075557839283610717936107296040519889968795869463d9bbec9560e01b865260048601526060602486015260648501906109ff565b838103600319016044850152906109ff565b03925af180156107485761073a5780f35b610743916109c2565b388180f35b50604051903d90823e3d90fd5b8380fd5b82516001600160a01b03168952602098890198909201916001016106bb565b60019060206001600160a01b038551169401938184015501610684565b8189528260208a2091820191015b8181106107b05750610679565b8981556001016107a3565b634e487b7160e01b88526041600452602488fd5b63632a22bb60e01b8752600487fd5b8680fd5b634e487b7160e01b85526041600452602485fd5b82356001600160a01b03811681036107de578152602092830192016105b2565b8580fd5b634e487b7160e01b83526041600452602483fd5b82346100ba5760203660031901126100ba579061084a81610990565b606081528160408092815161085f83826109c2565b8236823760208201520152600435825260016020528082209080519061088482610990565b80518354808252848652602080872090830191875b81811061097157505050816108af9103826109c2565b8252600281519363ffffffff6001820154818116875260201c1660208601526108d883866109c2565b602084019485520154908083019182528051936020855260a08501935193608060208701528451809152602060c08701950190875b81811061095257505050519084019094905b600282106109365750508293505160808301520390f35b60208060019263ffffffff89511681520196019101909461091f565b82516001600160a01b031687526020968701969092019160010161090d565b82546001600160a01b0316845260209093019260019283019201610899565b6060810190811067ffffffffffffffff8211176109ac57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109ac57604052565b600435906001600160a01b03821682036109fa57565b600080fd5b919082519283825260005b848110610a2b575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610a0a565b6001600160a01b03168015610ad0576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303610b1957565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615610b5d57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", + "deployedBytecode": "0x608080604052600436101561001357600080fd5b600090813560e01c90816218449a1461082e5750806329f73b9c1461053a5780632b20a4f614610468578063485cc9551461022e578063715018a6146101955780637b1039991461016f5780638da5cb5b14610129578063a91ee0dc146100ea578063f2fde38b146100bd5763f5e820fd1461008e57600080fd5b346100ba5760203660031901126100ba5760026040602092600435815260018452200154604051908152f35b80fd5b50346100ba5760203660031901126100ba576100e76100da6109e4565b6100e2610ae6565b610a40565b80f35b50346100ba5760203660031901126100ba576001600160a01b0361010c6109e4565b610114610ae6565b166001600160a01b0319600054161760005580f35b50346100ba57806003193601126100ba5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b50346100ba57806003193601126100ba576001600160a01b036020915416604051908152f35b50346100ba57806003193601126100ba576101ae610ae6565b806001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346100ba5760403660031901126100ba576102486109e4565b602435906001600160a01b0382168203610464577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161045c575b6001149081610452575b159081610449575b5061043a5767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556001600160a01b039190846103fb575b506102fd610b2e565b610305610b2e565b61030e33610a40565b610316610ae6565b166001600160a01b031960005416176000556001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054166001600160a01b038216036103e9575b5061036b5780f35b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b6103f5906100e2610ae6565b38610363565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386102f4565b63f92ee8a960e01b8552600485fd5b905015386102ae565b303b1591506102a6565b85915061029c565b8280fd5b50346100ba5760603660031901126100ba5760043536606411610536576001600160a01b03825416330361052757808252600160205263ffffffff600160408420015460201c16610518578152600160205260016040822001602482805b600281106104dd5750505055602060405160018152f35b90919384359063ffffffff8216918281036105145750600583901b91821b63ffffffff90921b1916179360200191906001016104c6565b8480fd5b6334c2a65d60e11b8252600482fd5b6310f5403960e31b8252600482fd5b5080fd5b50346100ba5760603660031901126100ba576024359060043567ffffffffffffffff8311610536573660238401121561053657826004013567ffffffffffffffff811161081a578060051b936040519161059760208701846109c2565b82526020820190602482968201019036821161081657602401915b8183106107f6575050506044359167ffffffffffffffff831161075557366023840112156107555782600401359267ffffffffffffffff84116107e25760405193610607601f8201601f1916602001866109c2565b808552602085019136602483830101116107de57818792602460209301853786010152610632610ae6565b81855260016020526040852090600282019182546107cf5784519067ffffffffffffffff82116107bb576801000000000000000082116107bb578054828255808310610795575b508890885260208820885b83811061077857505050508451902090556001600160a01b0384541660405192604084019060208086015251809152606084019690865b818110610759575050506106dc83869796959603601f1981018552846109c2565b803b1561075557839283610717936107296040519889968795869463d9bbec9560e01b865260048601526060602486015260648501906109ff565b838103600319016044850152906109ff565b03925af180156107485761073a5780f35b610743916109c2565b388180f35b50604051903d90823e3d90fd5b8380fd5b82516001600160a01b03168952602098890198909201916001016106bb565b60019060206001600160a01b038551169401938184015501610684565b8189528260208a2091820191015b8181106107b05750610679565b8981556001016107a3565b634e487b7160e01b88526041600452602488fd5b63632a22bb60e01b8752600487fd5b8680fd5b634e487b7160e01b85526041600452602485fd5b82356001600160a01b03811681036107de578152602092830192016105b2565b8580fd5b634e487b7160e01b83526041600452602483fd5b82346100ba5760203660031901126100ba579061084a81610990565b606081528160408092815161085f83826109c2565b8236823760208201520152600435825260016020528082209080519061088482610990565b80518354808252848652602080872090830191875b81811061097157505050816108af9103826109c2565b8252600281519363ffffffff6001820154818116875260201c1660208601526108d883866109c2565b602084019485520154908083019182528051936020855260a08501935193608060208701528451809152602060c08701950190875b81811061095257505050519084019094905b600282106109365750508293505160808301520390f35b60208060019263ffffffff89511681520196019101909461091f565b82516001600160a01b031687526020968701969092019160010161090d565b82546001600160a01b0316845260209093019260019283019201610899565b6060810190811067ffffffffffffffff8211176109ac57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109ac57604052565b600435906001600160a01b03821682036109fa57565b600080fd5b919082519283825260005b848110610a2b575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610a0a565b6001600160a01b03168015610ad0576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303610b1957565b63118cdaa760e01b6000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615610b5d57565b631afcd79f60e31b60005260046000fdfea164736f6c634300081b000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} From fc1f9fb400c5b8cee782dabd32cc4bab2bed218d Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Sun, 15 Jun 2025 16:19:34 +0500 Subject: [PATCH 072/106] Pass Risc0 Dev mode through a CLI Flag and Pull Support Latest version (#513) * Add Risc0 Dev mode as argument * Pull the latest image * formatting * fix: permission issues in macOS --- crates/config/src/app_config.rs | 28 ++++++++++++++--------- crates/support-scripts/ctl/container | 16 +++++++++++-- crates/support-scripts/ctl/start | 21 +++++++++++------ crates/support-scripts/src/lib.rs | 26 +++++++++------------ crates/support/scripts/container/start.sh | 8 ++++++- 5 files changed, 63 insertions(+), 36 deletions(-) diff --git a/crates/config/src/app_config.rs b/crates/config/src/app_config.rs index de36e4ed38..158b0519aa 100644 --- a/crates/config/src/app_config.rs +++ b/crates/config/src/app_config.rs @@ -85,18 +85,22 @@ impl Default for NodeDefinition { } #[derive(Debug, Deserialize, Serialize, PartialEq)] -#[serde(untagged)] -pub enum Risc0Config { - Bonsai { - bonsai_api_key: String, - bonsai_api_url: String, - }, - DevMode, +pub struct Risc0Config { + #[serde(default)] + pub bonsai_api_key: Option, + #[serde(default)] + pub bonsai_api_url: Option, + #[serde(default)] + pub risc0_dev_mode: u8, } impl Default for Risc0Config { fn default() -> Self { - Risc0Config::DevMode + Risc0Config { + bonsai_api_key: None, + bonsai_api_url: None, + risc0_dev_mode: 0, + } } } @@ -483,6 +487,7 @@ program: risc0: bonsai_api_key: "12345678" bonsai_api_url: "http://my.api.com" + risc0_dev_mode: 0 nodes: ag: @@ -518,9 +523,10 @@ nodes: assert_eq!(config.quic_port(), 1234); assert_eq!( config.program().risc0(), - &Risc0Config::Bonsai { - bonsai_api_key: "12345678".to_string(), - bonsai_api_url: "http://my.api.com".to_string() + &Risc0Config { + bonsai_api_key: Some("12345678".to_string()), + bonsai_api_url: Some("http://my.api.com".to_string()), + risc0_dev_mode: 0, } ); assert!(config.peers().is_empty()); diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 22fedbc405..c8515dacac 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -17,6 +17,17 @@ cleanup() { # Set trap for signals trap cleanup EXIT INT TERM +# Pull the latest image to ensure we have the most recent version +# NOTE: This might cause issues if the CLI is not up to date +echo "Pulling latest image: $IMAGE" +docker pull "$IMAGE" || { + echo "Warning: Failed to pull latest image, using cached version" +} + +# Ensure directories exist with proper permissions +mkdir -p "$(pwd)/target" +chmod -R 777 "$(pwd)/target" + if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then docker exec -it "$CONTAINER_NAME" bash -c "$*" else @@ -25,7 +36,8 @@ else --network=host \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ + -v "$(pwd)/target:/app/target" \ -v "${CACHE_PREFIX}-cargo-cache:/usr/local/cargo" \ - -v "${CACHE_PREFIX}-target-cache:/app/target" \ + -v "$(pwd)/target:/app/target" \ "$IMAGE" bash -c "$*" -fi +fi \ No newline at end of file diff --git a/crates/support-scripts/ctl/start b/crates/support-scripts/ctl/start index ac0d067a8e..1e037ceba9 100755 --- a/crates/support-scripts/ctl/start +++ b/crates/support-scripts/ctl/start @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Clear any existing environment variables -unset API_KEY API_URL +unset API_KEY API_URL RISC0_DEV_MODE # Parse command line arguments while [[ $# -gt 0 ]]; do @@ -14,6 +14,10 @@ while [[ $# -gt 0 ]]; do API_URL="$2" shift 2 ;; + --risc0-dev-mode) + RISC0_DEV_MODE="$2" + shift 2 + ;; *) echo "Unknown argument: $1" exit 1 @@ -22,14 +26,17 @@ while [[ $# -gt 0 ]]; do done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONTAINER_ARGS=("./scripts/container/start.sh") + +if [[ -n "$RISC0_DEV_MODE" ]]; then + CONTAINER_ARGS+=("--risc0-dev-mode" "$RISC0_DEV_MODE") +fi if [[ -n "$API_KEY" && -n "$API_URL" ]]; then - # BONSAI MODE - exec "$SCRIPT_DIR/container" ./scripts/container/start.sh --api-key "$API_KEY" --api-url "$API_URL" -elif [[ -z "$API_KEY" && -z "$API_URL" ]]; then - # DEV MODE - exec "$SCRIPT_DIR/container" ./scripts/container/start.sh -else + CONTAINER_ARGS+=("--api-key" "$API_KEY" "--api-url" "$API_URL") +elif [[ -n "$API_KEY" || -n "$API_URL" ]]; then echo "Error: Both --api-key and --api-url must be provided together, or neither" exit 1 fi + +exec "$SCRIPT_DIR/container" "${CONTAINER_ARGS[@]}" diff --git a/crates/support-scripts/src/lib.rs b/crates/support-scripts/src/lib.rs index 27937ab068..438fd6981f 100644 --- a/crates/support-scripts/src/lib.rs +++ b/crates/support-scripts/src/lib.rs @@ -1,7 +1,6 @@ use anyhow::{bail, Result}; use duct::cmd; use e3_config::ProgramConfig; -use e3_config::Risc0Config; use std::{env, path::PathBuf}; use tokio::fs; use tokio::signal; @@ -59,20 +58,17 @@ pub async fn program_start(program_config: &ProgramConfig) -> Result<()> { let script = cwd.join(".enclave/support/ctl/start"); ensure_script_exists(&script).await?; - let args: Vec<&str> = match program_config.risc0() { - Risc0Config::Bonsai { - bonsai_api_key, - bonsai_api_url, - } => { - vec![ - "--api-key", - bonsai_api_key.as_str(), - "--api-url", - bonsai_api_url.as_str(), - ] - } - Risc0Config::DevMode => vec![], - }; + let risc0_config = program_config.risc0(); + let risc0_dev_mode_str = risc0_config.risc0_dev_mode.to_string(); + + let mut args = vec!["--risc0-dev-mode", risc0_dev_mode_str.as_str()]; + + if let (Some(api_key), Some(api_url)) = + (&risc0_config.bonsai_api_key, &risc0_config.bonsai_api_url) + { + args.extend(["--api-key", api_key.as_str(), "--api-url", api_url.as_str()]); + } + run_bash_script(&cwd, &script, &args).await?; Ok(()) } diff --git a/crates/support/scripts/container/start.sh b/crates/support/scripts/container/start.sh index 138d58b0ae..d4281fc9f4 100755 --- a/crates/support/scripts/container/start.sh +++ b/crates/support/scripts/container/start.sh @@ -14,6 +14,10 @@ while [[ $# -gt 0 ]]; do export BONSAI_API_URL="$2" shift 2 ;; + --risc0-dev-mode) + export RISC0_DEV_MODE="$2" + shift 2 + ;; *) echo "Unknown argument: $1" exit 1 @@ -23,7 +27,9 @@ done CARGO_INCREMENTAL=1 -[ -z "$BONSAI_API_KEY" ] && export RISC0_DEV_MODE=1 +if [ -z "$RISC0_DEV_MODE" ]; then + [ -z "$BONSAI_API_KEY" ] && export RISC0_DEV_MODE=1 +fi echo "RISC0_DEV_MODE=$RISC0_DEV_MODE" From adb567abed9c18e43bc1879652a2f1e950a1e50d Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:32:06 +0500 Subject: [PATCH 073/106] Enclaveup installer to manage enclave cli updates (#512) * Enclave up installer * Formatting * fix: improve cross-compilation setup for ARM64 Linux builds * fix: simplify cross-compilation and improve artifact names * Add Progress indicator * fix: config message * fix: dockerfile * feat: trigger binary release from package release * Remove macOS13 runner * Add enclaveup to the list --- .github/workflows/binary-releases.yml | 153 +++++++++++ .github/workflows/releases.yml | 21 ++ Cargo.lock | 85 ++++++ Cargo.toml | 1 + crates/Dockerfile | 3 +- crates/enclaveup/Cargo.toml | 24 ++ crates/enclaveup/README.md | 105 ++++++++ crates/enclaveup/src/main.rs | 371 ++++++++++++++++++++++++++ install | 203 ++++++++++++++ 9 files changed, 965 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/binary-releases.yml create mode 100644 crates/enclaveup/Cargo.toml create mode 100644 crates/enclaveup/README.md create mode 100644 crates/enclaveup/src/main.rs create mode 100755 install diff --git a/.github/workflows/binary-releases.yml b/.github/workflows/binary-releases.yml new file mode 100644 index 0000000000..c66efc734e --- /dev/null +++ b/.github/workflows/binary-releases.yml @@ -0,0 +1,153 @@ +name: Binary Releases + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: 'Tag to release' + required: true + default: 'v0.1.0' + prerelease: + description: 'Mark as pre-release' + required: false + default: false + type: boolean + repository_dispatch: + types: [binary-release] + +permissions: + contents: write + +jobs: + build: + name: Build binaries + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + os_name: linux + arch: x86_64 + - os: macos-latest + target: aarch64-apple-darwin + os_name: macos + arch: aarch64 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust targets + run: | + rustup target add ${{ matrix.target }} + + + + - name: Build enclave + run: cargo build --release --target ${{ matrix.target }} --bin enclave + + - name: Build enclaveup + run: cargo build --release --target ${{ matrix.target }} --bin enclaveup + + - name: Create release archives + run: | + mkdir -p dist + + # Get the correct binary extension + if [[ "${{ matrix.target }}" == *"windows"* ]]; then + EXT=".exe" + else + EXT="" + fi + + # Create enclave archive + cp "target/${{ matrix.target }}/release/enclave${EXT}" "./enclave${EXT}" + tar -czf "dist/enclave-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclave${EXT}" + rm "enclave${EXT}" + + # Create enclaveup archive + cp "target/${{ matrix.target }}/release/enclaveup${EXT}" "./enclaveup${EXT}" + tar -czf "dist/enclaveup-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclaveup${EXT}" + rm "enclaveup${EXT}" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: enclave-binaries-${{ matrix.os_name }}-${{ matrix.arch }}-${{ github.run_number }} + path: dist/ + + release: + name: Create Release + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist/ + + - name: Flatten artifacts + run: | + mkdir -p release-assets + find dist/ -name "*.tar.gz" -exec cp {} release-assets/ \; + ls -la release-assets/ + + - name: Get tag name and prerelease status + id: get_tag + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT + echo "prerelease=${{ github.event.inputs.prerelease }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "repository_dispatch" ]; then + VERSION="${{ github.event.client_payload.version }}" + echo "tag=v${VERSION}" >> $GITHUB_OUTPUT + echo "prerelease=false" >> $GITHUB_OUTPUT + else + TAG="${GITHUB_REF#refs/tags/}" + echo "tag=${TAG}" >> $GITHUB_OUTPUT + # Auto-detect prerelease based on tag name + if [[ "${TAG}" =~ (test|alpha|beta|rc|dev) ]]; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi + fi + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.get_tag.outputs.tag }} + name: Release ${{ steps.get_tag.outputs.tag }} + draft: false + prerelease: ${{ steps.get_tag.outputs.prerelease }} + files: release-assets/* + body: | + ## Installation + + ### Install enclaveup (the installer) + ```bash + curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash + ``` + + ### Use enclaveup to install enclave + ```bash + enclaveup install + ``` + + ## Assets + - `enclave-*`: The main Enclave CLI binary + - `enclaveup-*`: The installer binary + + Supported platforms: + - Linux (x86_64) + - macOS (x86_64, aarch64 Apple Silicon) \ No newline at end of file diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index f1e897775a..9d873df0d7 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -18,6 +18,9 @@ jobs: release-rust: name: Release Rust Crates runs-on: ubuntu-latest + outputs: + releases_created: ${{ steps.release-plz.outputs.releases_created }} + version: ${{ steps.release-plz.outputs.version }} steps: - uses: actions/checkout@v4 with: @@ -85,3 +88,21 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + trigger-binary-release: + name: Trigger Binary Release + runs-on: ubuntu-latest + needs: [release-rust, release-npm] + if: needs.release-rust.outputs.releases_created == 'true' + steps: + - uses: actions/checkout@v4 + + - name: Trigger binary release workflow + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + event-type: binary-release + client-payload: | + { + "version": "${{ needs.release-rust.outputs.version }}" + } diff --git a/Cargo.lock b/Cargo.lock index 19f6b9c997..7d65567ddf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2231,6 +2231,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys 0.5.0", +] + [[package]] name = "dirs" version = "5.0.1" @@ -2799,6 +2808,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enclaveup" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "directories", + "flate2", + "futures-util", + "indicatif", + "reqwest", + "serde", + "serde_json", + "tar", + "tokio", +] + [[package]] name = "encode_unicode" version = "1.0.0" @@ -3010,6 +3036,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "fixed-hash" version = "0.8.0" @@ -3934,6 +3972,19 @@ dependencies = [ "serde", ] +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + [[package]] name = "inout" version = "0.1.4" @@ -4523,6 +4574,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", + "redox_syscall 0.5.12", ] [[package]] @@ -5022,6 +5074,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "nybbles" version = "0.3.4" @@ -5515,6 +5573,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "powerfmt" version = "0.2.0" @@ -6816,6 +6880,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "tempfile" version = "3.19.1" @@ -7947,6 +8022,16 @@ dependencies = [ "time", ] +[[package]] +name = "xattr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +dependencies = [ + "libc", + "rustix 1.0.7", +] + [[package]] name = "xml-rs" version = "0.8.26" diff --git a/Cargo.toml b/Cargo.toml index 4acf169b6f..55567dd108 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "crates/config", "crates/crypto", "crates/data", + "crates/enclaveup", "crates/entrypoint", "crates/events", "crates/evm", diff --git a/crates/Dockerfile b/crates/Dockerfile index 4b59d61ba0..951e9cb8fc 100644 --- a/crates/Dockerfile +++ b/crates/Dockerfile @@ -33,6 +33,7 @@ COPY crates/aggregator/Cargo.toml ./aggregator/Cargo.toml COPY crates/bfv-helpers/Cargo.toml ./bfv-helpers/Cargo.toml COPY crates/cli/Cargo.toml ./cli/Cargo.toml COPY crates/compute-provider/Cargo.toml ./compute-provider/Cargo.toml +COPY crates/enclaveup/Cargo.toml ./enclaveup/Cargo.toml COPY crates/config/Cargo.toml ./config/Cargo.toml COPY crates/crypto/Cargo.toml ./crypto/Cargo.toml COPY crates/data/Cargo.toml ./data/Cargo.toml @@ -58,7 +59,7 @@ COPY crates/tests/Cargo.toml ./tests/Cargo.toml RUN echo 'fn main() { println!("cargo:warning=dependency cache build"); }' > ./entrypoint/build.rs RUN for d in ./*/ ; do \ if [ -f "$d/Cargo.toml" ]; then \ - if [ "$d" = "./cli/" ]; then \ + if [ "$d" = "./cli/" ] || [ "$d" = "./enclaveup/" ]; then \ mkdir -p "$d/src" && \ echo "fn main() {}" > "$d/src/main.rs"; \ else \ diff --git a/crates/enclaveup/Cargo.toml b/crates/enclaveup/Cargo.toml new file mode 100644 index 0000000000..a6c2aa675d --- /dev/null +++ b/crates/enclaveup/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "enclaveup" +version = "0.1.0" +edition.workspace = true +license.workspace = true +description = "Installer for the Enclave CLI tool" +repository = "https://github.com/gnosisguild/enclave" + +[[bin]] +name = "enclaveup" +path = "src/main.rs" + +[dependencies] +clap = { workspace = true } +tokio = { workspace = true } +reqwest = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +anyhow = { workspace = true } +futures-util = { workspace = true } +indicatif = "0.17.11" +flate2 = "1.0" +tar = "0.4" +directories = "6.0.0" \ No newline at end of file diff --git a/crates/enclaveup/README.md b/crates/enclaveup/README.md new file mode 100644 index 0000000000..d0039411a4 --- /dev/null +++ b/crates/enclaveup/README.md @@ -0,0 +1,105 @@ +# enclaveup + +A standalone installer for the Enclave CLI tool. + +## Installation + +### Quick Install + +Use the provided install script to download and install `enclaveup`: + +```bash +curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +Or with wget: + +```bash +wget -qO- https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +### Manual Installation + +1. Download the appropriate binary for your platform from the [releases page](https://github.com/gnosisguild/enclave/releases) +2. Extract the binary and place it in your PATH (e.g., `~/.local/bin` or `/usr/local/bin`) +3. Make sure the binary is executable: `chmod +x enclaveup` + +## Usage + +### Install the Enclave CLI + +```bash +# Install to ~/.local/bin (default) +enclaveup install + +# Install to /usr/local/bin (requires sudo) +enclaveup install --system +``` + +### Update the Enclave CLI + +```bash +# Update from ~/.local/bin +enclaveup update + +# Update from /usr/local/bin +enclaveup update --system +``` + +### Uninstall the Enclave CLI + +```bash +# Remove from ~/.local/bin +enclaveup uninstall + +# Remove from /usr/local/bin +enclaveup uninstall --system +``` + +### Get Help + +```bash +enclaveup --help +enclaveup install --help +``` + +## Building from Source + +To build `enclaveup` from source: + +```bash +cd enclaveup +cargo build --release +``` + +The binary will be available at `target/release/enclaveup`. + +## Platform Support + +| Platform | Architecture | Status | +|----------|-------------|---------| +| Linux | x86_64 | ✅ Native binary | +| macOS | Apple Silicon (M1/M2/M3) | ✅ Native binary | +| macOS | Intel | ✅ Via Rosetta 2* | + +\* Intel Macs automatically run Apple Silicon binaries through Rosetta 2 translation + +## Binary Naming Convention + +The installer expects GitHub releases to contain assets with this naming pattern: + +**For Enclave CLI:** +- `enclave-linux-x86_64.tar.gz` +- `enclave-macos-aarch64.tar.gz` + +**For enclaveup itself:** +- `enclaveup-linux-x86_64.tar.gz` +- `enclaveup-macos-aarch64.tar.gz` + +Each tarball contains the binary at the root level. + +## Dependencies + +- `curl` or `wget` (for the install script) +- `tar` (for extracting archives) +- Internet connection (for downloading releases) \ No newline at end of file diff --git a/crates/enclaveup/src/main.rs b/crates/enclaveup/src/main.rs new file mode 100644 index 0000000000..96392c03f7 --- /dev/null +++ b/crates/enclaveup/src/main.rs @@ -0,0 +1,371 @@ +use anyhow::{anyhow, Context, Result}; +use clap::{Parser, Subcommand}; +use directories::BaseDirs; +use flate2::read::GzDecoder; +use indicatif::{ProgressBar, ProgressStyle}; +use reqwest::Client; +use serde::Deserialize; +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; +use std::process::Command; +use tar::Archive; + +const GITHUB_REPO: &str = "gnosisguild/enclave"; +const BINARY_NAME: &str = "enclave"; + +#[derive(Parser)] +#[command( + name = "enclaveup", + about = "Installer for the Enclave CLI tool", + version = "0.1.0" +)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + /// Install the latest version of enclave + Install { + /// Install to /usr/local/bin instead of ~/.local/bin + #[arg(long)] + system: bool, + }, + /// Update enclave to the latest version + Update { + /// Install to /usr/local/bin instead of ~/.local/bin + #[arg(long)] + system: bool, + }, + /// Remove the installed enclave binary + Uninstall { + /// Remove from /usr/local/bin instead of ~/.local/bin + #[arg(long)] + system: bool, + }, +} + +#[derive(Debug, Deserialize)] +struct GitHubRelease { + tag_name: String, + assets: Vec, +} + +#[derive(Debug, Deserialize)] +struct GitHubAsset { + name: String, + browser_download_url: String, +} + +#[derive(Debug)] +struct Platform { + os: String, + arch: String, +} + +impl Platform { + fn detect() -> Result { + let os = match std::env::consts::OS { + "linux" => "linux", + "macos" => "macos", + _ => { + return Err(anyhow!( + "Unsupported operating system: {}", + std::env::consts::OS + )) + } + }; + + let arch = match std::env::consts::ARCH { + "x86_64" => "x86_64", + "aarch64" => "aarch64", + _ => { + return Err(anyhow!( + "Unsupported architecture: {}", + std::env::consts::ARCH + )) + } + }; + + Ok(Platform { + os: os.to_string(), + arch: arch.to_string(), + }) + } + + fn asset_pattern(&self) -> String { + format!("{}-{}-{}", BINARY_NAME, self.os, self.arch) + } +} + +struct Installer { + client: Client, + platform: Platform, +} + +impl Installer { + fn new() -> Result { + let client = Client::builder() + .user_agent("enclaveup/0.1.0") + .build() + .context("Failed to create HTTP client")?; + + let platform = Platform::detect()?; + + Ok(Installer { client, platform }) + } + + async fn get_latest_release(&self) -> Result { + let url = format!( + "https://api.github.com/repos/{}/releases/latest", + GITHUB_REPO + ); + + let response = self + .client + .get(&url) + .send() + .await + .context("Failed to fetch latest release")?; + + if !response.status().is_success() { + return Err(anyhow!( + "GitHub API request failed with status: {}", + response.status() + )); + } + + let release: GitHubRelease = response + .json() + .await + .context("Failed to parse GitHub release response")?; + + Ok(release) + } + + async fn download_with_progress(&self, url: &str) -> Result> { + let response = self + .client + .get(url) + .send() + .await + .context("Failed to start download")?; + + if !response.status().is_success() { + return Err(anyhow!( + "Download failed with status: {}", + response.status() + )); + } + + let total_size = response.content_length().unwrap_or(0); + + let pb = ProgressBar::new(total_size); + pb.set_style( + ProgressStyle::default_bar() + .template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})") + .unwrap() + .progress_chars("#>-") + ); + + let mut downloaded = 0u64; + let mut buffer = Vec::new(); + + let mut stream = response; + while let Some(chunk) = stream.chunk().await.context("Failed to read chunk")? { + buffer.extend_from_slice(&chunk); + downloaded += chunk.len() as u64; + pb.set_position(downloaded); + } + + pb.finish_with_message("Download complete"); + Ok(buffer) + } + + async fn download_and_install(&self, system: bool) -> Result<()> { + println!( + "Detecting platform: {}-{}", + self.platform.os, self.platform.arch + ); + + let release = self.get_latest_release().await?; + println!("Latest release: {}", release.tag_name); + + let asset_pattern = self.platform.asset_pattern(); + let asset = release + .assets + .iter() + .find(|asset| asset.name.contains(&asset_pattern)) + .ok_or_else(|| { + anyhow!( + "No compatible asset found for {}-{}. Available assets: {}", + self.platform.os, + self.platform.arch, + release + .assets + .iter() + .map(|a| a.name.as_str()) + .collect::>() + .join(", ") + ) + })?; + + println!("Downloading {} ...", asset.name); + let bytes = self + .download_with_progress(&asset.browser_download_url) + .await?; + + let target_dir = self.get_install_dir(system)?; + fs::create_dir_all(&target_dir).context("Failed to create target directory")?; + + let target_path = target_dir.join(BINARY_NAME); + + println!("Extracting to {} ...", target_path.display()); + let tar = GzDecoder::new(&bytes[..]); + let mut archive = Archive::new(tar); + + for entry in archive + .entries() + .context("Failed to read archive entries")? + { + let mut entry = entry.context("Failed to read archive entry")?; + let path = entry.path().context("Failed to get entry path")?; + + if path.file_name() == Some(std::ffi::OsStr::new(BINARY_NAME)) { + let mut file = + fs::File::create(&target_path).context("Failed to create target file")?; + io::copy(&mut entry, &mut file).context("Failed to extract binary")?; + break; + } + } + + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mut perms = fs::metadata(&target_path)?.permissions(); + perms.set_mode(0o755); + fs::set_permissions(&target_path, perms) + .context("Failed to set executable permissions")?; + } + + println!( + "Successfully installed {} to {}", + BINARY_NAME, + target_path.display() + ); + + self.check_path(&target_dir); + + Ok(()) + } + + fn get_install_dir(&self, system: bool) -> Result { + if system { + Ok(PathBuf::from("/usr/local/bin")) + } else { + let base_dirs = + BaseDirs::new().ok_or_else(|| anyhow!("Failed to get base directories"))?; + let local_bin = base_dirs.home_dir().join(".local/bin"); + Ok(local_bin) + } + } + + fn check_path(&self, install_dir: &Path) { + if let Ok(path_var) = std::env::var("PATH") { + let paths: Vec<&str> = path_var.split(':').collect(); + if !paths.iter().any(|&p| Path::new(p) == install_dir) { + println!("Warning: {} is not in your PATH", install_dir.display()); + println!("Add it to your PATH with:"); + println!("export PATH=\"{}:$PATH\"", install_dir.display()); + } + } + } + + async fn uninstall(&self, system: bool) -> Result<()> { + let target_dir = self.get_install_dir(system)?; + let target_path = target_dir.join(BINARY_NAME); + + if target_path.exists() { + fs::remove_file(&target_path).context("Failed to remove binary")?; + println!( + "Successfully removed {} from {}", + BINARY_NAME, + target_path.display() + ); + } else { + println!( + "{} is not installed at {}", + BINARY_NAME, + target_path.display() + ); + } + + Ok(()) + } + + async fn update(&self, system: bool) -> Result<()> { + let target_dir = self.get_install_dir(system)?; + let target_path = target_dir.join(BINARY_NAME); + + if !target_path.exists() { + println!( + "{} is not installed. Running install instead...", + BINARY_NAME + ); + return self.download_and_install(system).await; + } + let current_version = self.get_current_version(&target_path); + let latest_release = self.get_latest_release().await?; + + if let Some(current) = current_version { + if current == latest_release.tag_name { + println!("{} is already up to date ({})", BINARY_NAME, current); + return Ok(()); + } + println!( + "Updating {} from {} to {}", + BINARY_NAME, current, latest_release.tag_name + ); + } else { + println!("Updating {} to {}", BINARY_NAME, latest_release.tag_name); + } + + self.download_and_install(system).await + } + + fn get_current_version(&self, binary_path: &Path) -> Option { + Command::new(binary_path) + .arg("--version") + .output() + .ok() + .and_then(|output| { + let version_output = String::from_utf8(output.stdout).ok()?; + version_output + .split_whitespace() + .last() + .map(|v| v.to_string()) + }) + } +} + +#[tokio::main] +async fn main() -> Result<()> { + let cli = Cli::parse(); + let installer = Installer::new()?; + + match cli.command { + Commands::Install { system } => { + installer.download_and_install(system).await?; + } + Commands::Update { system } => { + installer.update(system).await?; + } + Commands::Uninstall { system } => { + installer.uninstall(system).await?; + } + } + + Ok(()) +} diff --git a/install b/install new file mode 100755 index 0000000000..b52be86e25 --- /dev/null +++ b/install @@ -0,0 +1,203 @@ +#!/bin/bash + +set -e + +GITHUB_REPO="gnosisguild/enclave" +BINARY_NAME="enclaveup" +INSTALL_DIR="$HOME/.local/bin" + +log_info() { + echo "$1" +} + +log_success() { + echo "$1" +} + +log_warning() { + echo "$1" +} + +log_error() { + echo "$1" >&2 +} + +detect_platform() { + local os="" + local arch="" + case "$(uname -s)" in + Linux*) + os="linux" + case "$(uname -m)" in + x86_64) + arch="x86_64" + ;; + arm64|aarch64) + arch="aarch64" + ;; + *) + log_error "Unsupported Linux architecture: $(uname -m)" + exit 1 + ;; + esac + ;; + Darwin*) + os="macos" + case "$(uname -m)" in + x86_64) + arch="aarch64" + log_info "Intel Mac detected - using Apple Silicon binary (runs via Rosetta 2)" + ;; + arm64|aarch64) + arch="aarch64" + ;; + *) + log_error "Unsupported macOS architecture: $(uname -m)" + exit 1 + ;; + esac + ;; + *) + log_error "Unsupported operating system: $(uname -s)" + exit 1 + ;; + esac + + echo "${os}-${arch}" +} + +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +download_file() { + local url="$1" + local output="$2" + + if command_exists curl; then + curl -fsSL "$url" -o "$output" + elif command_exists wget; then + wget -q "$url" -O "$output" + else + log_error "Neither curl nor wget is available. Please install one of them." + exit 1 + fi +} + +get_latest_release() { + local api_url="https://api.github.com/repos/${GITHUB_REPO}/releases/latest" + local temp_file=$(mktemp) + + log_info "Fetching latest release information..." + + if ! download_file "$api_url" "$temp_file"; then + log_error "Failed to fetch release information from GitHub API" + rm -f "$temp_file" + exit 1 + fi + local tag_name=$(grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' "$temp_file" | cut -d'"' -f4) + + if [ -z "$tag_name" ]; then + log_error "Failed to parse release information" + rm -f "$temp_file" + exit 1 + fi + + rm -f "$temp_file" + echo "$tag_name" +} + +get_download_url() { + local platform="$1" + local api_url="https://api.github.com/repos/${GITHUB_REPO}/releases/latest" + local temp_file=$(mktemp) + + if ! download_file "$api_url" "$temp_file"; then + log_error "Failed to fetch release information" + rm -f "$temp_file" + exit 1 + fi + local asset_pattern="${BINARY_NAME}-${platform}" + local download_url=$(grep -o '"browser_download_url"[[:space:]]*:[[:space:]]*"[^"]*'"$asset_pattern"'[^"]*"' "$temp_file" | cut -d'"' -f4) + + if [ -z "$download_url" ]; then + log_error "No compatible binary found for platform: $platform" + log_info "Available assets:" + grep -o '"name"[[:space:]]*:[[:space:]]*"[^"]*"' "$temp_file" | cut -d'"' -f4 | sed 's/^/ - /' + rm -f "$temp_file" + exit 1 + fi + + rm -f "$temp_file" + echo "$download_url" +} + +main() { + log_info "Enclave Installer" + local platform + platform=$(detect_platform) + log_info "Detected platform: $platform" + local version + version=$(get_latest_release) + log_info "Latest version: $version" + local download_url + download_url=$(get_download_url "$platform") + log_info "Download URL: $download_url" + log_info "Creating install directory: $INSTALL_DIR" + mkdir -p "$INSTALL_DIR" + local temp_file=$(mktemp) + local asset_name=$(basename "$download_url") + + log_info "Downloading $asset_name..." + if ! download_file "$download_url" "$temp_file"; then + log_error "Failed to download $asset_name" + rm -f "$temp_file" + exit 1 + fi + local target_path="$INSTALL_DIR/$BINARY_NAME" + log_info "Extracting to $target_path..." + + if ! tar -xzf "$temp_file" -C "$INSTALL_DIR" --strip-components=0 "$BINARY_NAME" 2>/dev/null; then + # Extracting without specifying the binary name (in case the structure is different) + if ! tar -xzf "$temp_file" -O | dd of="$target_path" 2>/dev/null; then + log_error "Failed to extract binary from tarball" + rm -f "$temp_file" + exit 1 + fi + fi + + rm -f "$temp_file" + chmod +x "$target_path" + log_success "Successfully installed $BINARY_NAME to $target_path" + + if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then + log_warning "$INSTALL_DIR is not in your PATH" + echo "" + echo "To add it to your PATH, run one of the following:" + echo "" + echo " # For bash users:" + echo " echo 'export PATH=\"$INSTALL_DIR:\$PATH\"' >> ~/.bashrc" + echo " source ~/.bashrc" + echo "" + echo " # For zsh users:" + echo " echo 'export PATH=\"$INSTALL_DIR:\$PATH\"' >> ~/.zshrc" + echo " source ~/.zshrc" + echo "" + echo " # For fish users:" + echo " fish_add_path $INSTALL_DIR" + echo "" + fi + + echo "" + log_success "Installation complete!" + echo "" + echo "You can now use $BINARY_NAME to install the Enclave CLI:" + echo "" + echo " $BINARY_NAME install # Install the latest enclave CLI" + echo " $BINARY_NAME update # Update to the latest version" + echo " $BINARY_NAME uninstall # Remove the enclave CLI" + echo " $BINARY_NAME --help # Show help" + echo "" +} + +main "$@" \ No newline at end of file From 07aa144d821c1c37968cf4b5539400bd19966e65 Mon Sep 17 00:00:00 2001 From: SUBHASISH BEHERA <92573882+Subhasish-Behera@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:40:50 +0530 Subject: [PATCH 074/106] change the `enclave wizard` command to enclave `config-set` (#491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: change `enclave wizard` to `enclave config-set` * cargo fmt pre push * add short flags for config-set * Call config-set when no config is present during enclave start. currently no flag is supported with enclave start. So it will be interactive for now. --------- Co-authored-by: гλ --- crates/cli/src/cli.rs | 46 ++++++++++++------- crates/cli/src/{wizard.rs => config_set.rs} | 13 +++--- crates/cli/src/main.rs | 2 +- .../src/{wizard => config_set}/mod.rs | 0 crates/entrypoint/src/lib.rs | 2 +- 5 files changed, 37 insertions(+), 26 deletions(-) rename crates/cli/src/{wizard.rs => config_set.rs} (83%) rename crates/entrypoint/src/{wizard => config_set}/mod.rs (100%) diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index dcef361341..a55933a2db 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -6,7 +6,7 @@ use crate::nodes::{self, NodeCommands}; use crate::password::PasswordCommands; use crate::program::{self, ProgramCommands}; use crate::wallet::WalletCommands; -use crate::{init, net, password, wallet, wizard}; +use crate::{config_set, init, net, password, wallet}; use crate::{print_env, start}; use anyhow::{bail, Result}; use clap::{command, ArgAction, Parser, Subcommand}; @@ -71,11 +71,11 @@ impl Cli { #[instrument(skip_all)] pub async fn execute(self) -> Result<()> { - // Attempt to load the config, but only treat “not found” as + // Attempt to load the config, but only treat "not found" as // the trigger for the init flow. All other errors bubble up. let config = match self.load_config() { Ok(cfg) => cfg, - // If the file truly doesn’t exist, fall back to init + // If the file truly doesn't exist, fall back to init Err(e) if matches!( e.downcast_ref::(), @@ -85,7 +85,7 @@ impl Cli { // Existing init branch match self.command { Commands::Init {path, template} => init::execute(path, template).await?, - Commands::Wizard { + Commands::ConfigSet { rpc_url, eth_address, password, @@ -93,7 +93,7 @@ impl Cli { net_keypair, generate_net_keypair, } => { - wizard::execute( + config_set::execute( rpc_url, eth_address, password, @@ -101,10 +101,23 @@ impl Cli { net_keypair, generate_net_keypair, ) - .await? + .await?; + println!("You can start your node using `enclave start`"); + } + Commands::Start { .. } => { + println!("No configuration found. Setting up enclave configuration..."); + config_set::execute( + None, + None, + None, + false, + None, + false, + ) + .await?; } _ => bail!( - "Configuration file not found. Have you created `enclave.config.yaml` in your project?" + "Configuration file not found. Run `enclave config-set` to create a configuration." ), }; return Ok(()); @@ -136,8 +149,8 @@ impl Cli { Commands::Compile => e3_support_scripts::program_compile().await?, Commands::PrintEnv { vite, chain } => print_env::execute(&config, &chain, vite).await?, Commands::Program { command } => program::execute(command, &config).await?, - Commands::Wizard { .. } => { - bail!("Cannot run `enclave wizard` when a configuration exists."); + Commands::ConfigSet { .. } => { + bail!("Cannot run `enclave config-set` when a configuration already exists."); } Commands::Nodes { command } => { nodes::execute( @@ -235,15 +248,14 @@ pub enum Commands { command: NetCommands, }, - #[command(hide = true)] - /// Initialize your ciphernode by setting up a configuration - Wizard { + /// Set configuration values (similar to solana config set) + ConfigSet { /// An rpc url for enclave to connect to - #[arg(long = "rpc-url")] + #[arg(long = "rpc-url", short = 'r')] rpc_url: Option, /// An Ethereum address that enclave should use to identify the node - #[arg(long = "eth-address")] + #[arg(long = "eth-address", short = 'e')] eth_address: Option, /// The password @@ -251,15 +263,15 @@ pub enum Commands { password: Option, /// Skip asking for eth - #[arg(long = "skip-eth")] + #[arg(long = "skip-eth", short = 's')] skip_eth: bool, /// The network private key (ed25519) - #[arg(long = "net-keypair")] + #[arg(long = "net-keypair", short = 'n')] net_keypair: Option, /// Generate a new network keypair - #[arg(long = "generate-net-keypair")] + #[arg(long = "generate-net-keypair", short = 'g')] generate_net_keypair: bool, }, diff --git a/crates/cli/src/wizard.rs b/crates/cli/src/config_set.rs similarity index 83% rename from crates/cli/src/wizard.rs rename to crates/cli/src/config_set.rs index bc76f3926e..bcb5ff84b0 100644 --- a/crates/cli/src/wizard.rs +++ b/crates/cli/src/config_set.rs @@ -1,6 +1,6 @@ use anyhow::Result; use dialoguer::{theme::ColorfulTheme, Input}; -use e3_entrypoint::wizard; +use e3_entrypoint::config_set; use tracing::instrument; use crate::net; @@ -19,19 +19,19 @@ pub async fn execute( ) -> Result<()> { let rpc_url = match rpc_url { Some(url) => { - wizard::validate_rpc_url(&url)?; + config_set::validate_rpc_url(&url)?; url } None => Input::::new() .with_prompt("Enter WebSocket devnet RPC URL") .default("wss://ethereum-sepolia-rpc.publicnode.com".to_string()) - .validate_with(wizard::validate_rpc_url) + .validate_with(config_set::validate_rpc_url) .interact_text()?, }; let eth_address: Option = match eth_address { Some(address) => { - wizard::validate_eth_address(&address)?; + config_set::validate_eth_address(&address)?; Some(address) } None => { @@ -41,7 +41,7 @@ pub async fn execute( Input::with_theme(&ColorfulTheme::default()) .with_prompt("Enter your Ethereum address (press Enter to skip)") .allow_empty(true) - .validate_with(wizard::validate_eth_address) + .validate_with(config_set::validate_eth_address) .interact() .ok() .map(|s| if s.is_empty() { None } else { Some(s) }) @@ -50,7 +50,7 @@ pub async fn execute( } }; - let config = wizard::execute(rpc_url, eth_address).await?; + let config = config_set::execute(rpc_url, eth_address).await?; password::execute(PasswordCommands::Set { password }, &config).await?; @@ -73,7 +73,6 @@ pub async fn execute( } println!("Enclave configuration successfully created!"); - println!("You can start your node using `enclave start`"); Ok(()) } diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 773a47f7f7..89d78edf95 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -3,6 +3,7 @@ use cli::Cli; use tracing::info; mod cli; +mod config_set; pub mod helpers; mod init; pub mod net; @@ -26,7 +27,6 @@ mod program; mod start; mod wallet; mod wallet_set; -mod wizard; const OWO: &str = r#" ___ ___ ___ ___ ___ diff --git a/crates/entrypoint/src/wizard/mod.rs b/crates/entrypoint/src/config_set/mod.rs similarity index 100% rename from crates/entrypoint/src/wizard/mod.rs rename to crates/entrypoint/src/config_set/mod.rs diff --git a/crates/entrypoint/src/lib.rs b/crates/entrypoint/src/lib.rs index cf6229f249..6a7f1a322e 100644 --- a/crates/entrypoint/src/lib.rs +++ b/crates/entrypoint/src/lib.rs @@ -1,7 +1,7 @@ +pub mod config_set; pub mod helpers; pub mod net; pub mod nodes; pub mod password; pub mod start; pub mod wallet; -pub mod wizard; From 7a7dcac680260aa5bf7ed8bd228420c4074f5c02 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Mon, 16 Jun 2025 23:48:55 +0200 Subject: [PATCH 075/106] fix default address for support compute provider (#519) --- crates/support/app/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index 8200797b17..c36e45430b 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -110,7 +110,7 @@ async fn handle_compute(req: web::Json) -> ActixResult anyhow::Result<()> { env_logger::init(); - let bind_addr = "0.0.0.0:13151"; + let bind_addr = "127.0.0.1:13151"; let server = HttpServer::new(move || { App::new() .wrap(Logger::default()) From 6b0c744249663caed79317b638db3c98366c31ff Mon Sep 17 00:00:00 2001 From: Giacomo Date: Tue, 17 Jun 2025 11:12:52 +0200 Subject: [PATCH 076/106] fix arguments (#520) --- crates/support/scripts/container/start.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/support/scripts/container/start.sh b/crates/support/scripts/container/start.sh index d4281fc9f4..c282ecc390 100755 --- a/crates/support/scripts/container/start.sh +++ b/crates/support/scripts/container/start.sh @@ -4,6 +4,7 @@ unset BONSAI_API_KEY BONSAI_API_URL # Parse command line arguments +POSITIONAL=() while [[ $# -gt 0 ]]; do case $1 in --api-key) @@ -19,12 +20,14 @@ while [[ $# -gt 0 ]]; do shift 2 ;; *) - echo "Unknown argument: $1" - exit 1 + POSITIONAL+=("$1") + shift ;; esac done +set -- "${POSITIONAL[@]}" + CARGO_INCREMENTAL=1 if [ -z "$RISC0_DEV_MODE" ]; then From 419cd9e04ddbeb4e16bcbe035481ee1ce050ce23 Mon Sep 17 00:00:00 2001 From: Giacomo Date: Tue, 17 Jun 2025 12:21:42 +0200 Subject: [PATCH 077/106] fix `macOS` (#521) * fix platform, remove duplication for target, use hacknet instead of next * revert loopback addr * fix tmux windows * add health route --- crates/support-scripts/ctl/container | 4 ++-- crates/support/app/src/main.rs | 10 +++++++++- templates/default/scripts/dev_all.sh | 21 ++++++++++----------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index c8515dacac..4c8ed7d2ae 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -1,6 +1,6 @@ #!/usr/bin/env bash CONTAINER_NAME="e3-support.1" -IMAGE="ghcr.io/gnosisguild/e3-support:next" +IMAGE="ghcr.io/gnosisguild/e3-support:hacknet" CACHE_PREFIX="e3-support" # Function to cleanup @@ -34,10 +34,10 @@ else docker run -it --rm \ --name "$CONTAINER_NAME" \ --network=host \ + --platform linux/amd64 \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ -v "$(pwd)/target:/app/target" \ -v "${CACHE_PREFIX}-cargo-cache:/usr/local/cargo" \ - -v "$(pwd)/target:/app/target" \ "$IMAGE" bash -c "$*" fi \ No newline at end of file diff --git a/crates/support/app/src/main.rs b/crates/support/app/src/main.rs index c36e45430b..6f5ff5c689 100644 --- a/crates/support/app/src/main.rs +++ b/crates/support/app/src/main.rs @@ -106,15 +106,23 @@ async fn handle_compute(req: web::Json) -> ActixResult ActixResult { + Ok(HttpResponse::Ok().json(ProcessingResponse { + status: "healthy".to_string(), + e3_id: 0, + })) +} + #[actix_web::main] async fn main() -> anyhow::Result<()> { env_logger::init(); - let bind_addr = "127.0.0.1:13151"; + let bind_addr = "0.0.0.0:13151"; let server = HttpServer::new(move || { App::new() .wrap(Logger::default()) .route("/run_compute", web::post().to(handle_compute)) + .route("/health", web::get().to(handle_health_check)) }) .bind(bind_addr)?; diff --git a/templates/default/scripts/dev_all.sh b/templates/default/scripts/dev_all.sh index 806726056f..88bac2424a 100755 --- a/templates/default/scripts/dev_all.sh +++ b/templates/default/scripts/dev_all.sh @@ -30,8 +30,9 @@ if command -v tmux &> /dev/null; then # Reorganize layout to make it more even tmux select-layout tiled - - # Run commands in each pane + + tmux send-keys -t 0 'pnpm dev:frontend' C-m + sleep 1 tmux send-keys -t 1 'pnpm dev:evm' C-m sleep 1 tmux send-keys -t 2 'pnpm dev:ciphernodes' C-m @@ -39,11 +40,9 @@ if command -v tmux &> /dev/null; then tmux send-keys -t 3 'TEST_MODE=1 pnpm dev:server' C-m sleep 1 tmux send-keys -t 4 'enclave program start' C-m - sleep 1 - tmux send-keys -t 5 'pnpm dev:frontend' C-m - # Select the first pane to start - tmux select-pane -t 1 + # Select the first pane to start (frontend will be focused) + tmux select-pane -t 0 # Attach to the session tmux attach-session -t "$SESSION_NAME" @@ -60,12 +59,12 @@ else # Run all processes concurrently using pnpm pnpm concurrently \ - --names "EVM,CIPHER,SERVER,ENCLAVE,FRONTEND" \ - --prefix-colors "cyan,magenta,yellow,green,blue" \ + --names "FRONTEND,EVM,CIPHER,SERVER,ENCLAVE" \ + --prefix-colors "blue,cyan,magenta,yellow,green" \ --kill-others-on-fail \ + "pnpm dev:frontend" \ "pnpm dev:evm" \ "pnpm dev:ciphernodes" \ "TEST_MODE=1 pnpm dev:server" \ - "enclave program start" \ - "pnpm dev:frontend" -fi + "enclave program start" +fi \ No newline at end of file From e69ec1df3ebb0cd4a10f33484c573126fe603685 Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Tue, 17 Jun 2025 15:59:52 +0500 Subject: [PATCH 078/106] Expore the support image port (#522) --- crates/support-scripts/ctl/container | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/support-scripts/ctl/container b/crates/support-scripts/ctl/container index 4c8ed7d2ae..09bf95edb3 100755 --- a/crates/support-scripts/ctl/container +++ b/crates/support-scripts/ctl/container @@ -33,8 +33,8 @@ if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then else docker run -it --rm \ --name "$CONTAINER_NAME" \ - --network=host \ --platform linux/amd64 \ + -p 13151:13151 \ -v "$(pwd)/contracts:/app/contracts" \ -v "$(pwd)/tests:/app/tests" \ -v "$(pwd)/target:/app/target" \ From 1bf6340124ac2ef8ce6d409307d5455ef68ed8ab Mon Sep 17 00:00:00 2001 From: Hamza Khalid <36852564+hmzakhalid@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:08:41 +0500 Subject: [PATCH 079/106] Upgrade Risc0 to v2.1.0 (#523) * Upgrade Risc0 to v2.1.0 * Update Risc0 Version in Dockerfile * Update Alloy Version * Fk alloy - hope this works * Formatting * Small commit * Revert small commit * Fix tests * Fix test * Tests Passing * Tests Passing * Fix networking errors in risc0 guest * Fix Nonce Issues in Ciphernode * Add Manual Nonce Management * formatting --- .vscode/settings.json | 5 +- Cargo.lock | 697 +++++-- Cargo.toml | 8 +- crates/bfv-helpers/Cargo.toml | 3 +- crates/bfv-helpers/src/lib.rs | 4 +- crates/config/Cargo.toml | 2 +- crates/config/src/app_config.rs | 2 +- .../entrypoint/src/start/aggregator_start.rs | 18 +- crates/entrypoint/src/start/start.rs | 8 +- crates/evm-helpers/Cargo.toml | 1 + crates/evm-helpers/src/contracts.rs | 97 +- crates/evm-helpers/src/listener.rs | 8 +- crates/evm-helpers/tests/helpers.rs | 27 +- crates/evm-helpers/tests/listener.rs | 30 +- crates/evm/src/ciphernode_registry_sol.rs | 42 +- crates/evm/src/enclave_sol.rs | 23 +- crates/evm/src/enclave_sol_reader.rs | 24 +- crates/evm/src/enclave_sol_writer.rs | 59 +- crates/evm/src/event_reader.rs | 107 +- crates/evm/src/helpers.rs | 252 +-- crates/evm/src/registry_filter_sol.rs | 62 +- crates/evm/tests/evm_reader.rs | 34 +- crates/indexer/tests/helpers.rs | 26 +- crates/indexer/tests/indexer.rs | 14 +- crates/support/Cargo.toml | 10 +- crates/support/Dockerfile | 2 +- crates/support/methods/guest/Cargo.toml | 2 +- deploy/local/contracts.sh | 2 +- examples/CRISP/Dockerfile | 2 +- examples/CRISP/apps/program/Cargo.lock | 720 +++---- examples/CRISP/apps/program/Cargo.toml | 14 +- .../apps/program/methods/guest/Cargo.lock | 1744 +---------------- .../apps/program/methods/guest/Cargo.toml | 6 +- examples/CRISP/apps/server/Cargo.lock | 609 ++++-- examples/CRISP/apps/server/Cargo.toml | 6 +- examples/CRISP/apps/server/Dockerfile | 2 +- examples/CRISP/apps/server/src/cli/main.rs | 16 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 989 +--------- examples/CRISP/lib/risc0-ethereum | 2 +- templates/default/lib/risc0-ethereum | 2 +- 40 files changed, 1708 insertions(+), 3973 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index dcae73898f..5f9142ac88 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,9 +7,8 @@ "solidity.formatter": "prettier", "typescript.tsdk": "node_modules/typescript/lib", "rust-analyzer.linkedProjects": [ - "packages/ciphernode/Cargo.toml", - "packages/compute_provider/Cargo.toml", - "packages/enclave-sdk/Cargo.toml", + "crates/evm/Cargo.toml", + "crates/evm-helpers/Cargo.toml", "examples/CRISP/apps/program/Cargo.toml", "examples/CRISP/apps/server/Cargo.toml", "examples/CRISP/apps/wasm-crypto/Cargo.toml" diff --git a/Cargo.lock b/Cargo.lock index 7d65567ddf..cadc1cc6df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,7 +59,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "flate2", "foldhash", @@ -174,7 +174,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 2.0.1", + "derive_more", "encoding_rs", "foldhash", "futures-core", @@ -278,7 +278,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.2", "once_cell", "version_check", "zerocopy", @@ -316,9 +315,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "18e746cb4cea9ab4cda8cb117717b16c21116004f51efd78968ee0f1ffcf2602" dependencies = [ "alloy-consensus", "alloy-contract", @@ -342,38 +341,45 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.69" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +checksum = "19a9cc9d81ace3da457883b0bdf76776e55f1b84219a9e9d55c27ad308548d3f" dependencies = [ "alloy-primitives", "num_enum", - "strum 0.27.1", + "strum", ] [[package]] name = "alloy-consensus" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "659c33e85c4a9f8bb1b9a2400f4f3d0dd52fbc4bd3650e08d22df1e17d5d92ee" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-trie", + "alloy-tx-macros", "auto_impl", "c-kzg", - "derive_more 1.0.0", + "derive_more", + "either", "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", "serde", + "serde_with", + "thiserror 2.0.12", ] [[package]] name = "alloy-consensus-any" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +checksum = "d48fdc146414932cec2114f749f5f65a8960ee7547b1638a97bb0d04160d09e4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -385,10 +391,11 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +checksum = "c711bfed1579611565ab831166c7bbaf123baea785ea945f02ed3620950f6fe1" dependencies = [ + "alloy-consensus", "alloy-dyn-abi", "alloy-json-abi", "alloy-network", @@ -401,14 +408,15 @@ dependencies = [ "alloy-transport", "futures", "futures-util", + "serde_json", "thiserror 2.0.12", ] [[package]] name = "alloy-core" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +checksum = "5968f48d7a62587cd874bd84034831da4f7f577ce5de984828e376766efc0f32" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -419,26 +427,38 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +checksum = "f9135eb501feccf7f4cb8a183afd406a65483fdad7bbd7332d0470e5d725c92f" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "const-hex", "itoa", "serde", "serde_json", "winnow", ] +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.12", +] + [[package]] name = "alloy-eip2930" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -447,52 +467,68 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.4.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more 1.0.0", "k256", "serde", + "thiserror 2.0.12", ] [[package]] name = "alloy-eips" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +checksum = "8390cb5c872d53560635dabc02d616c1bb626dd0f7d6893f8725edb822573fed" dependencies = [ + "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", "alloy-primitives", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", - "derive_more 1.0.0", - "once_cell", + "derive_more", + "either", "serde", "sha2", ] [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "a18ce1538291d8409d4a7d826176d461a6f9eb28632d7185f801bda43a138260" dependencies = [ + "alloy-eips", "alloy-primitives", "alloy-serde", "alloy-trie", "serde", ] +[[package]] +name = "alloy-hardforks" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "977d2492ce210e34baf7b36afaacea272c96fbe6774c47e23f97d14033c0e94f" +dependencies = [ + "alloy-chains", + "alloy-eip2124", + "alloy-primitives", + "auto_impl", + "dyn-clone", +] + [[package]] name = "alloy-json-abi" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +checksum = "8b26fdd571915bafe857fccba4ee1a4f352965800e46a53e4a5f50187b7776fa" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -502,12 +538,13 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +checksum = "0b91481d12dcd964f4a838271d6abffac2d4082695fc3f73a15429166ea1692d" dependencies = [ "alloy-primitives", "alloy-sol-types", + "http 1.3.1", "serde", "serde_json", "thiserror 2.0.12", @@ -516,9 +553,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "c8b245fa9d76cc9fc58cf78844f2d4e481333449ba679b2044f09b983fc96f85" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -533,6 +570,7 @@ dependencies = [ "alloy-sol-types", "async-trait", "auto_impl", + "derive_more", "futures-utils-wasm", "serde", "serde_json", @@ -541,9 +579,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +checksum = "7cecb975fc2f2e1eb09c513428c34e0d8c13e28b5ff1dbdf68e0f64a1a92c5f3" dependencies = [ "alloy-consensus", "alloy-eips", @@ -554,12 +592,16 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +checksum = "f4131fe12c27e13a99d79bc8e02f9ce4f23f98a6f2e90458fe09992e99e46a9a" dependencies = [ "alloy-genesis", + "alloy-hardforks", + "alloy-network", "alloy-primitives", + "alloy-signer", + "alloy-signer-local", "k256", "rand 0.8.5", "serde_json", @@ -571,15 +613,15 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +checksum = "a326d47106039f38b811057215a92139f46eef7983a4b77b10930a0ea5685b1e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 2.0.1", + "derive_more", "foldhash", "hashbrown 0.15.3", "indexmap 2.9.0", @@ -588,7 +630,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.8.5", + "rand 0.9.1", "ruint", "rustc-hash", "serde", @@ -598,9 +640,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "ecac2cbea1cb3da53b4e68a078e57f9da8d12d86e2017db1240df222e2498397" dependencies = [ "alloy-chains", "alloy-consensus", @@ -613,9 +655,12 @@ dependencies = [ "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-anvil", + "alloy-rpc-types-debug", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", "alloy-signer", - "alloy-signer-local", + "alloy-sol-types", "alloy-transport", "alloy-transport-http", "alloy-transport-ipc", @@ -624,13 +669,14 @@ dependencies = [ "async-trait", "auto_impl", "dashmap", + "either", "futures", "futures-utils-wasm", - "lru", + "http 1.3.1", + "lru 0.13.0", "parking_lot 0.12.3", "pin-project", "reqwest", - "schnellru", "serde", "serde_json", "thiserror 2.0.12", @@ -642,21 +688,23 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" +checksum = "db1d3c2316590910ba697485aa75cdafef89735010d338d197f8af5baa79df92" dependencies = [ "alloy-json-rpc", "alloy-primitives", "alloy-transport", "bimap", "futures", + "parking_lot 0.12.3", "serde", "serde_json", "tokio", "tokio-stream", "tower 0.5.2", "tracing", + "wasmtimer", ] [[package]] @@ -683,9 +731,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +checksum = "e0bed8157038003c702dd1861a6b72d4b1a8f46aeffad35e81580223642170fa" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -694,6 +742,7 @@ dependencies = [ "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", + "async-stream", "futures", "pin-project", "reqwest", @@ -703,28 +752,32 @@ dependencies = [ "tokio-stream", "tower 0.5.2", "tracing", + "tracing-futures", "url", "wasmtimer", ] [[package]] name = "alloy-rpc-types" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +checksum = "82fed036edc62cd79476fe0340277a1c47b07c173f6ac0244f24193e1183b8e4" dependencies = [ "alloy-primitives", + "alloy-rpc-types-anvil", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-anvil" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +checksum = "9f2e3dc925ec6722524f8d7412b9a6845a3350c7037f8a37892ada00c9018125" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -734,36 +787,47 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +checksum = "caf6702dd7eb929068ab075869679e745d68c4eb611c5a0cf72617688b85b5f4" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", "alloy-serde", ] +[[package]] +name = "alloy-rpc-types-debug" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e982f72ff47c0f754cb6aa579e456220d768e1ec07675e66cfce970dad70292" +dependencies = [ + "alloy-primitives", + "serde", +] + [[package]] name = "alloy-rpc-types-engine" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" +checksum = "505224e162e239980c6df7632c99f0bc5abbcf630017502810979e9e01f3c86e" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", - "derive_more 1.0.0", + "derive_more", + "rand 0.8.5", "serde", - "strum 0.26.3", + "strum", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "20ff509ca40537042b7cc9bede6b415ef807c9c5c48024e9fe10b8c8ad0757ef" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -773,17 +837,43 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", + "itertools 0.14.0", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51dc49d5865f2227c810a416c8d14141db7716a0174bfa6cff1c1a984b678b5e" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", "serde", "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c962ec5193084873353ad7a65568056b4e704203302e6ba81374e95a22deba4d" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", ] [[package]] name = "alloy-serde" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +checksum = "f9873512b1e99505f4a65e1d3a3105cb689f112f8e3cab3c632b20a97a46adae" dependencies = [ "alloy-primitives", "serde", @@ -792,13 +882,14 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +checksum = "c2d4d95d8431a11e0daee724c3b7635dc8e9d3d60d0b803023a8125c74a77899" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", + "either", "elliptic-curve", "k256", "thiserror 2.0.12", @@ -806,9 +897,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +checksum = "cb03eca937485b258d8e791d143e95b50dbfae0e18f92e1b1271c38959cd00fb" dependencies = [ "alloy-consensus", "alloy-network", @@ -822,9 +913,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +checksum = "d4be1ce1274ddd7fdfac86e5ece1b225e9bba1f2327e20fbb30ee6b9cc1423fe" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -836,9 +927,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +checksum = "01e92f3708ea4e0d9139001c86c051c538af0146944a2a9c7181753bd944bf57" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -855,9 +946,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +checksum = "9afe1bd348a41f8c9b4b54dfb314886786d6201235b0b3f47198b9d910c86bb2" dependencies = [ "alloy-json-abi", "const-hex", @@ -873,9 +964,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +checksum = "d6195df2acd42df92a380a8db6205a5c7b41282d0ce3f4c665ecf7911ac292f1" dependencies = [ "serde", "winnow", @@ -883,27 +974,29 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +checksum = "6185e98a79cf19010722f48a74b5a65d153631d2f038cabd250f4b9e9813b8ad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", - "const-hex", "serde", ] [[package]] name = "alloy-transport" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "468a871d7ea52e31ef3abf5ccde612cb3723794f484d26dca6a04a3a776db739" dependencies = [ "alloy-json-rpc", + "alloy-primitives", "base64", - "futures-util", + "derive_more", + "futures", "futures-utils-wasm", + "parking_lot 0.12.3", "serde", "serde_json", "thiserror 2.0.12", @@ -916,9 +1009,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "6e969c254b189f7da95f07bab53673dd418f8595abfe3397b2cf8d7ba7955487" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -931,9 +1024,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" +checksum = "cb134aaa80c2e1e03eebc101e7c513f08a529726738506d8c306ec9f3c9a7f3b" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -942,6 +1035,7 @@ dependencies = [ "futures", "interprocess", "pin-project", + "serde", "serde_json", "tokio", "tokio-util", @@ -950,9 +1044,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.8.3" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +checksum = "e57f13346af9441cafa99d5b80d95c2480870dd18bd274464f7131df01ad692a" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -968,20 +1062,48 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more 1.0.0", + "derive_more", "nybbles", "serde", "smallvec", "tracing", ] +[[package]] +name = "alloy-tx-macros" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d642ba58c32547ad9742c613f9849a2aedc47914b02948224326e4cb62b91040" +dependencies = [ + "alloy-primitives", + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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 = "anstream" version = "0.6.18" @@ -1592,6 +1714,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1742,9 +1880,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "1.0.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" dependencies = [ "blst", "cc", @@ -1784,7 +1922,11 @@ version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ + "android-tzdata", + "iana-time-zone", "num-traits", + "serde", + "windows-link", ] [[package]] @@ -1963,6 +2105,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +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.2" @@ -2071,6 +2228,41 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -2142,6 +2334,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -2155,34 +2348,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -2329,6 +2501,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "e3-aggregator" version = "0.1.0" @@ -2351,7 +2529,8 @@ dependencies = [ name = "e3-bfv-helpers" version = "0.1.0" dependencies = [ - "alloy", + "alloy-dyn-abi", + "alloy-primitives", "anyhow", "fhe", "fhe-traits", @@ -2408,7 +2587,7 @@ dependencies = [ name = "e3-config" version = "0.1.0" dependencies = [ - "alloy", + "alloy-primitives", "anyhow", "dirs 5.0.1", "e3-events", @@ -2544,6 +2723,7 @@ dependencies = [ "eyre", "futures", "futures-util", + "once_cell", "tokio", ] @@ -2754,6 +2934,7 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] @@ -2788,6 +2969,9 @@ name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "elliptic-curve" @@ -2804,6 +2988,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", + "serdect", "subtle", "zeroize", ] @@ -3480,6 +3665,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex_fmt" version = "0.3.0" @@ -3728,6 +3922,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[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 = "icu_collections" version = "1.5.0" @@ -3846,6 +4064,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -3959,6 +4183,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -4060,15 +4285,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -4114,6 +4330,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2", ] @@ -4340,7 +4557,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-swarm", - "lru", + "lru 0.12.5", "quick-protobuf", "quick-protobuf-codec", "smallvec", @@ -4491,7 +4708,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-swarm-derive", - "lru", + "lru 0.12.5", "multistream-select", "once_cell", "rand 0.8.5", @@ -4684,6 +4901,15 @@ dependencies = [ "hashbrown 0.15.3", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.3", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -5909,6 +6135,7 @@ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -5947,6 +6174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.2", + "serde", ] [[package]] @@ -6042,6 +6270,26 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "regex" version = "1.11.1" @@ -6412,14 +6660,15 @@ dependencies = [ ] [[package]] -name = "schnellru" -version = "0.2.4" +name = "schemars" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -6438,10 +6687,32 @@ dependencies = [ "der", "generic-array", "pkcs8", + "serdect", "subtle", "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -6539,6 +6810,37 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "schemars", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -6552,6 +6854,16 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -6749,35 +7061,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - [[package]] name = "strum" version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ - "strum_macros 0.27.1", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", + "strum_macros", ] [[package]] @@ -6823,9 +7113,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.25" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +checksum = "14c8c8f496c33dc6343dac05b4be8d9e0bca180a4caa81d7b8416b10cc2273cd" dependencies = [ "paste", "proc-macro2", @@ -6893,9 +7183,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", "getrandom 0.3.2", @@ -7091,9 +7381,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" dependencies = [ "futures-util", "log", @@ -7241,6 +7531,18 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "futures", + "futures-task", + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -7297,21 +7599,20 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ - "byteorder", "bytes", "data-encoding", "http 1.3.1", "httparse", "log", - "rand 0.8.5", + "rand 0.9.1", "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.69", + "thiserror 2.0.12", "utf-8", ] @@ -7667,7 +7968,7 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "windows-core", + "windows-core 0.53.0", "windows-targets 0.52.6", ] @@ -7681,6 +7982,41 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "windows-link" version = "0.1.1" @@ -7694,7 +8030,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result 0.3.2", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -7725,6 +8061,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index 55567dd108..39bc42475f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,13 +80,13 @@ e3-tests = { version = "0.1.0", path = "./crates/tests" } actix = "0.13.5" actix-web = "4.10.2" aes-gcm = "0.10.3" -alloy = { version = "0.8.3", features = ["node-bindings", "full"] } -alloy-primitives = { version = "0.8", default-features = false, features = [ +alloy = { version = "1.0.11", features = ["node-bindings", "full"] } +alloy-primitives = { version = "1.0", default-features = false, features = [ "rlp", "serde", "std", ] } -alloy-sol-types = "0.8" +alloy-sol-types = "1.0" alloy-dyn-abi = "1.1.0" argon2 = "0.5.2" anyhow = "1.0.86" @@ -134,7 +134,7 @@ sled = "0.34.7" serde_yaml = "0.9.34" sha2 = "0.10.8" shellexpand = "3.1.0" -tempfile = "3.14.0" +tempfile = "3.20.0" thiserror = { version = "1.0.58" } tokio = { version = "1.38", features = ["full"] } tracing = "0.1.37" diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index 78599a620d..618ee03cf1 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -7,7 +7,8 @@ description = "E3 - Enclave BFV Helpers" repository = "https://github.com/gnosisguild/enclave/crates/bfv-helpers" [dependencies] -alloy = { version = "0.8.3" , features = ["dyn-abi", "rlp", "serde"] } +alloy-dyn-abi = { workspace = true } +alloy-primitives = { workspace = true } fhe-traits.workspace = true fhe_rs.workspace = true diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index 908d67ee9e..df277fa092 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -1,5 +1,5 @@ -use alloy::dyn_abi::{DynSolType, DynSolValue}; -use alloy::primitives::U256; +use alloy_dyn_abi::{DynSolType, DynSolValue}; +use alloy_primitives::U256; use fhe_rs::bfv::{BfvParameters, BfvParametersBuilder}; use std::sync::Arc; /// Predefined BFV parameters for common use cases diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 82113a09ab..ba704bfc64 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -7,7 +7,7 @@ description = "E3 - Enclave Ciphernode Configuration" repository = "https://github.com/gnosisguild/enclave/crates/config" [dependencies] -alloy = { workspace = true } +alloy-primitives = { workspace = true } anyhow = { workspace = true } dirs = { workspace = true } e3-events = { workspace = true } diff --git a/crates/config/src/app_config.rs b/crates/config/src/app_config.rs index 158b0519aa..1e7d94dd9a 100644 --- a/crates/config/src/app_config.rs +++ b/crates/config/src/app_config.rs @@ -4,7 +4,7 @@ use crate::load_config::resolve_config_path; use crate::paths_engine::PathsEngine; use crate::paths_engine::DEFAULT_CONFIG_NAME; use crate::yaml::load_yaml_with_env; -use alloy::primitives::Address; +use alloy_primitives::Address; use anyhow::bail; use anyhow::Context; use anyhow::Result; diff --git a/crates/entrypoint/src/start/aggregator_start.rs b/crates/entrypoint/src/start/aggregator_start.rs index 42d9ce034c..809d827c0b 100644 --- a/crates/entrypoint/src/start/aggregator_start.rs +++ b/crates/entrypoint/src/start/aggregator_start.rs @@ -6,7 +6,7 @@ use e3_crypto::Cipher; use e3_data::RepositoriesFactory; use e3_events::{get_enclave_event_bus, EnclaveEvent, EventBus}; use e3_evm::{ - helpers::{get_signer_from_repository, ProviderConfig}, + helpers::{load_signer_from_repository, ProviderConfig}, CiphernodeRegistryReaderRepositoryFactory, CiphernodeRegistrySol, EnclaveSol, EnclaveSolReaderRepositoryFactory, EthPrivateKeyRepositoryFactory, RegistryFilterSol, }; @@ -37,7 +37,7 @@ pub async fn execute( let repositories = store.repositories(); let sortition = Sortition::attach(&bus, repositories.sortition()).await?; let cipher = Arc::new(Cipher::from_config(config).await?); - let signer = get_signer_from_repository(repositories.eth_private_key(), &cipher).await?; + let signer = load_signer_from_repository(repositories.eth_private_key(), &cipher).await?; for chain in config .chains() @@ -47,29 +47,29 @@ pub async fn execute( let rpc_url = chain.rpc_url()?; let provider_config = ProviderConfig::new(rpc_url, chain.rpc_auth.clone()); let read_provider = provider_config.create_readonly_provider().await?; - let write_provider = provider_config.create_ws_signer_provider(&signer).await?; + let write_provider = provider_config.create_signer_provider(&signer).await?; EnclaveSol::attach( &bus, - &read_provider, - &write_provider, + read_provider.clone(), + write_provider.clone(), &chain.contracts.enclave.address(), - &repositories.enclave_sol_reader(read_provider.get_chain_id()), + &repositories.enclave_sol_reader(read_provider.chain_id()), chain.contracts.enclave.deploy_block(), chain.rpc_url.clone(), ) .await?; RegistryFilterSol::attach( &bus, - &write_provider, + write_provider.clone(), &chain.contracts.filter_registry.address(), ) .await?; CiphernodeRegistrySol::attach( &bus, - &read_provider, + read_provider.clone(), &chain.contracts.ciphernode_registry.address(), - &repositories.ciphernode_registry_reader(read_provider.get_chain_id()), + &repositories.ciphernode_registry_reader(read_provider.chain_id()), chain.contracts.ciphernode_registry.deploy_block(), chain.rpc_url.clone(), ) diff --git a/crates/entrypoint/src/start/start.rs b/crates/entrypoint/src/start/start.rs index 5d1b45e06c..730a8030aa 100644 --- a/crates/entrypoint/src/start/start.rs +++ b/crates/entrypoint/src/start/start.rs @@ -53,18 +53,18 @@ pub async fn execute( let read_provider = provider_config.create_readonly_provider().await?; EnclaveSolReader::attach( &bus, - &read_provider, + read_provider.clone(), &chain.contracts.enclave.address(), - &repositories.enclave_sol_reader(read_provider.get_chain_id()), + &repositories.enclave_sol_reader(read_provider.chain_id()), chain.contracts.enclave.deploy_block(), chain.rpc_url.clone(), ) .await?; CiphernodeRegistrySol::attach( &bus, - &read_provider, + read_provider.clone(), &chain.contracts.ciphernode_registry.address(), - &repositories.ciphernode_registry_reader(read_provider.get_chain_id()), + &repositories.ciphernode_registry_reader(read_provider.chain_id()), chain.contracts.ciphernode_registry.deploy_block(), chain.rpc_url.clone(), ) diff --git a/crates/evm-helpers/Cargo.toml b/crates/evm-helpers/Cargo.toml index fc62de17f7..38ab647994 100644 --- a/crates/evm-helpers/Cargo.toml +++ b/crates/evm-helpers/Cargo.toml @@ -12,4 +12,5 @@ async-trait.workspace = true eyre.workspace = true futures.workspace = true futures-util.workspace = true +once_cell.workspace = true tokio.workspace = true diff --git a/crates/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs index 89ac3425b3..3541924400 100644 --- a/crates/evm-helpers/src/contracts.rs +++ b/crates/evm-helpers/src/contracts.rs @@ -5,16 +5,32 @@ use alloy::{ providers::fillers::{ ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller, }, - providers::{Identity, Provider, ProviderBuilder, RootProvider}, - rpc::types::TransactionReceipt, + providers::{Identity, Provider, ProviderBuilder, RootProvider, WalletProvider}, + rpc::types::{BlockNumberOrTag, TransactionReceipt}, signers::local::PrivateKeySigner, sol, transports::BoxTransport, }; use async_trait::async_trait; use eyre::Result; +use once_cell::sync::Lazy; use std::marker::PhantomData; use std::sync::Arc; +use tokio::sync::Mutex; + +static NONCE_LOCK: Lazy> = Lazy::new(|| Mutex::new(())); + +pub async fn next_pending_nonce

)} - {error && { }} />} + {error && {}} />} {isSuccess && transactionHash && (
@@ -267,7 +265,7 @@ const ActivateE3Step: React.FC = ({ e3State, isRequesting,
)} - {error && { }} />} + {error && {}} />} {isSuccess && transactionHash && (
@@ -542,7 +540,6 @@ const ResultsStep: React.FC = ({ input1, input2, result, e3Sta const WizardSDK: React.FC = () => { const { isConnected } = useAccount() - const { isLoaded: isWasmLoaded, encryptInput } = useWebAssemblyHook() if (HAS_MISSING_ENV_VARS) { return @@ -783,8 +780,8 @@ const WizardSDK: React.FC = () => { const publicKeyBytes = hexToBytes(e3State.publicKey) // Encrypt both inputs - const encryptedInput1 = await encryptInput(num1, publicKeyBytes) - const encryptedInput2 = await encryptInput(num2, publicKeyBytes) + const encryptedInput1 = await encryptNumber(num1, publicKeyBytes) + const encryptedInput2 = await encryptNumber(num2, publicKeyBytes) if (!encryptedInput1 || !encryptedInput2) { throw new Error('Failed to encrypt inputs') @@ -862,8 +859,9 @@ const WizardSDK: React.FC = () => { {[1, 2, 3, 4, 5, 6].map((step) => (
= step ? 'border-enclave-400 bg-enclave-100 text-enclave-600' : 'border-slate-300 bg-slate-100 text-slate-400' - }`} + className={`flex h-10 w-10 items-center justify-center rounded-full border-2 transition-all duration-200 ${ + currentStep >= step ? 'border-enclave-400 bg-enclave-100 text-enclave-600' : 'border-slate-300 bg-slate-100 text-slate-400' + }`} > {getStepIcon(step as WizardStep)}
@@ -967,12 +965,6 @@ const WizardSDK: React.FC = () => { {renderStepIndicator()}
{renderStepContent()}
- - {!isWasmLoaded && ( -
-

Loading encryption module...

-
- )}
) diff --git a/templates/default/client/vite.config.ts b/templates/default/client/vite.config.ts index 3d87036415..3cc3baa97e 100644 --- a/templates/default/client/vite.config.ts +++ b/templates/default/client/vite.config.ts @@ -5,21 +5,13 @@ import wasm from 'vite-plugin-wasm' import topLevelAwait from 'vite-plugin-top-level-await' import path from 'path' -// const development: boolean = !process.env.NODE_ENV || process.env.NODE_ENV === 'development' - export default defineConfig({ base: '/', define: { - // here is the main update global: 'globalThis', }, optimizeDeps: { - exclude: ['@rollup/browser'], - include: [ - '@gnosis-guild/enclave/sdk', - '@gnosis-guild/enclave-react', - ], - force: true, + exclude: ['@rollup/browser', '@gnosis-guild/e3-wasm'], }, build: { commonjsOptions: { @@ -28,23 +20,11 @@ export default defineConfig({ }, resolve: { alias: { - react: path.resolve(__dirname, 'node_modules/react'), - 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'), - wagmi: path.resolve(__dirname, 'node_modules/wagmi'), - '@gnosis-guild/enclave-react': path.resolve( - __dirname, - 'node_modules/@gnosis-guild/enclave-react' - ), '@': path.resolve(__dirname, './src'), libs: path.resolve(__dirname, './libs'), }, }, - plugins: [ - wasm(), - topLevelAwait(), - react(), - viteTsconfigPaths(), - ], + plugins: [wasm(), topLevelAwait(), react(), viteTsconfigPaths()], server: { open: true, port: 3000, diff --git a/templates/default/client/wasm/Cargo.lock b/templates/default/client/wasm/Cargo.lock deleted file mode 100644 index 5ef6361fe5..0000000000 --- a/templates/default/client/wasm/Cargo.lock +++ /dev/null @@ -1,5777 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-provider", - "alloy-rpc-client", - "alloy-serde", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.1.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum 0.27.1", -] - -[[package]] -name = "alloy-consensus" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-core" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more 1.0.0", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more 1.0.0", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 2.0.1", - "foldhash", - "hashbrown 0.15.3", - "indexmap", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.8.5", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest 0.12.18", - "schnellru", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest 0.12.18", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more 1.0.0", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror 2.0.12", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" -dependencies = [ - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.18", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more 1.0.0", - "nybbles", - "serde", - "smallvec", - "tracing", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[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 = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cc" -version = "1.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac", - "k256", - "serde", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.7", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror 1.0.69", -] - -[[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", -] - -[[package]] -name = "const-hex" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "e3-bfv-helpers" -version = "0.1.0" -dependencies = [ - "alloy", - "fhe", - "fhe-traits", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ena" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" -dependencies = [ - "log", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" -dependencies = [ - "base64 0.21.7", - "bytes", - "hex", - "k256", - "log", - "rand 0.8.5", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand 0.8.5", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror 1.0.69", - "uuid", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror 1.0.69", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "ethers-etherscan", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest 0.11.27", - "serde", - "serde_json", - "syn 2.0.101", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.101", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum 0.26.3", - "syn 2.0.101", - "tempfile", - "thiserror 1.0.69", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" -dependencies = [ - "chrono", - "ethers-core", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.7", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http 0.2.12", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand 0.8.5", - "sha2", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" -dependencies = [ - "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core", - "glob", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver 1.0.26", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror 1.0.69", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "ethnum" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fhe" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "doc-comment", - "fhe-math", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-traits", - "prost", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "thiserror 1.0.69", - "zeroize", - "zeroize_derive", -] - -[[package]] -name = "fhe-math" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "ethnum", - "fhe-traits", - "fhe-util", - "itertools 0.12.1", - "ndarray", - "num-bigint", - "num-bigint-dig", - "num-traits", - "prost", - "prost-build", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sha2", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "fhe-traits" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "fhe-util" -version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs.git#11cdd749a8e01c486160d5f62572c4520af5358f" -dependencies = [ - "itertools 0.12.1", - "num-bigint-dig", - "num-traits", - "prime_factorization", - "rand 0.8.5", - "rayon", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" -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 = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[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 = "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.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.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.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -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 = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.3.1", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.6.0", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown 0.15.3", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.7", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lalrpop" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" -dependencies = [ - "ascii-canvas", - "bit-set 0.5.3", - "ena", - "itertools 0.11.0", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", - "walkdir", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", -] - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.3", -] - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "matrixmultiply" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minicov" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" -dependencies = [ - "cc", - "walkdir", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[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", - "serde", - "smallvec", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[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.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "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.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parity-scale-codec" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" -dependencies = [ - "proc-macro2", - "syn 2.0.101", -] - -[[package]] -name = "prime_factorization" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" -dependencies = [ - "itertools 0.10.5", - "num", - "rand 0.8.5", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" -dependencies = [ - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.1", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.101", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[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_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[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 = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.6.0", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[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 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[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 = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ruint" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.1", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[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.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.26", -] - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki", - "sct", -] - -[[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 = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[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 = "scale-info" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" -dependencies = [ - "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[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 = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "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 = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[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 = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.12", - "time", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "solang-parser" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" -dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "svm-rs" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest 0.11.27", - "semver 1.0.26", - "serde", - "serde_json", - "sha2", - "thiserror 1.0.69", - "url", - "zip", -] - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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 = "tempfile" -version = "3.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -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.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[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-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", -] - -[[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 = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[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 = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.16", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" -dependencies = [ - "js-sys", - "minicov", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "wasm-crypto" -version = "0.1.0" -dependencies = [ - "bincode", - "console", - "console_log", - "e3-bfv-helpers", - "ethers", - "fhe", - "fhe-math", - "fhe-traits", - "fhe-util", - "getrandom 0.2.16", - "itertools 0.13.0", - "log", - "ndarray", - "num-bigint", - "num-traits", - "rand 0.8.5", - "rayon", - "serde", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - -[[package]] -name = "wasmtimer" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper 0.6.0", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.101", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/templates/default/client/wasm/Cargo.toml b/templates/default/client/wasm/Cargo.toml deleted file mode 100644 index 43460017b1..0000000000 --- a/templates/default/client/wasm/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "wasm-crypto" -version = "0.1.0" -edition = "2021" -repository = "https://github.com/gnosisguild/enclave" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies] -web-sys = { version = "0.3", features = ["console"] } -console = "0.15.7" -fhe_rs = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs.git" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } -rand = "0.8.5" -ethers = "2.0.14" -getrandom = { version = "0.2.11", features = ["js"] } -bincode = "1.3.3" -e3-bfv-helpers = { git = "https://github.com/gnosisguild/enclave.git", rev = "2ca0aa5f47dd962add5d1d0f74900d9bceb957e5" } -rayon = "1.10.0" -ndarray = "0.15.6" -itertools = "0.13.0" -num-bigint = "0.4.6" -num-traits = "0.2" -serde = { version = "1.0.208", features = ["derive"] } -serde_json = "1.0.133" -wasm-bindgen = "0.2.93" -wasm-bindgen-test = "0.3.43" -console_log = "0.2" -log = "0.4" - -[lib] -crate-type = ["cdylib", "rlib"] diff --git a/templates/default/client/wasm/README.md b/templates/default/client/wasm/README.md deleted file mode 100644 index 72699c2019..0000000000 --- a/templates/default/client/wasm/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# CRISP-Web - -A Rust WebAssembly (WASM) implementation of Fully Homomorphic Encryption (FHE) for secure voting systems. - -## Features - -- BFV encryption scheme implementation -- WASM integration for browser-based encryption -- Greco protocol implementation for input validation - -## Prerequisites - -- Rust (latest stable version) -- wasm-pack -- Node.js (for running tests) - -## Installation - -1. Install wasm-pack -`cargo install wasm-pack` - -## Building - -Build the WebAssembly package: -``` -wasm-pack build --target web --release -``` - - -## Running Tests - -Run the tests: -``` -wasm-pack test --node --release -``` diff --git a/templates/default/client/wasm/build.sh b/templates/default/client/wasm/build.sh deleted file mode 100755 index 1dd8700df9..0000000000 --- a/templates/default/client/wasm/build.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Check if wasm-pack is installed -if ! command -v wasm-pack >/dev/null 2>&1; then - echo 'Error: wasm-pack is not installed. Please install it by running:' - echo 'cargo install wasm-pack' - exit 1 -fi - -# Function to check if wasm32 target is available -check_wasm_target() { - rustc --print target-list | grep -q wasm32-unknown-unknown -} - -# Function to try installing wasm32 target -install_wasm_target() { - if command -v rustup >/dev/null 2>&1; then - echo "Installing wasm32-unknown-unknown target..." - rustup target add wasm32-unknown-unknown - return 0 - else - echo "Rustup not found. Cannot install wasm32-unknown-unknown target automatically." - echo "For Nix users: Please ensure your development environment includes the wasm32 target." - echo "You may need to add it to your shell.nix or flake.nix configuration." - return 1 - fi -} - -# Check if wasm32 target is available -if ! check_wasm_target; then - echo "wasm32-unknown-unknown target not found" - - # Try to install it - if ! install_wasm_target; then - exit 1 - fi -fi - -# Build WASM package if it doesn't exist -if [ ! -f libs/wasm/pkg/wasm_crypto.js ]; then - echo 'Building WASM package...' - cd wasm && wasm-pack build --target web --release --out-dir ../libs/wasm/pkg -else - echo 'WASM package already exists' -fi diff --git a/templates/default/client/wasm/src/lib.rs b/templates/default/client/wasm/src/lib.rs deleted file mode 100644 index 6fc1fc2dc0..0000000000 --- a/templates/default/client/wasm/src/lib.rs +++ /dev/null @@ -1,39 +0,0 @@ -use e3_bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; -use fhe_rs::bfv::{Encoding, Plaintext, PublicKey}; -use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; -use rand::thread_rng; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -pub struct Encrypt { - encrypted_data: Vec, -} - -#[wasm_bindgen] -impl Encrypt { - #[wasm_bindgen(constructor)] - pub fn new() -> Encrypt { - Encrypt { - encrypted_data: Vec::new(), - } - } - - pub fn encrypt(&mut self, data: u64, public_key: Vec) -> Result, JsValue> { - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); - - let pk = PublicKey::from_bytes(&public_key, ¶ms) - .map_err(|e| JsValue::from_str(&format!("Error deserializing public key: {}", e)))?; - - let input = vec![data]; - let pt = Plaintext::try_encode(&input, Encoding::poly(), ¶ms) - .map_err(|e| JsValue::from_str(&format!("Error encoding plaintext: {}", e)))?; - - let ct = pk - .try_encrypt(&pt, &mut thread_rng()) - .map_err(|e| JsValue::from_str(&format!("Error encrypting data: {}", e)))?; - - self.encrypted_data = ct.to_bytes(); - Ok(self.encrypted_data.clone()) - } -} diff --git a/templates/default/package.json b/templates/default/package.json index b64748fd8d..a8fde872c4 100644 --- a/templates/default/package.json +++ b/templates/default/package.json @@ -17,9 +17,10 @@ }, "dependencies": { "@gnosis-guild/enclave": "workspace:*", + "@gnosis-guild/enclave-sdk": "workspace:*", "@types/yargs": "^17.0.33", - "yargs": "^18.0.0", - "viem": "2.30.6" + "viem": "2.30.6", + "yargs": "^18.0.0" }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", @@ -47,9 +48,10 @@ "poseidon-lite": "^0.3.0", "solidity-coverage": "^0.8.0", "ts-node": "^10.9.2", + "tsx": "^4.20.3", "typechain": "^8.3.0", "typed-rpc": "^6.1.1", - "typescript": ">=4.5.0", + "typescript": "^5.8.3", "wait-on": "^8.0.3" } } diff --git a/templates/default/scripts/dev_server.sh b/templates/default/scripts/dev_server.sh index def10e352d..f5aeaefbf5 100755 --- a/templates/default/scripts/dev_server.sh +++ b/templates/default/scripts/dev_server.sh @@ -7,4 +7,4 @@ pnpm wait-on http://localhost:8545 && \ (export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" CHAIN_ID=31337 && \ export $(enclave print-env --chain hardhat) && \ export RPC_URL="http://localhost:8545" && \ - pnpm ts-node ./server) + pnpm tsx ./server/index.ts) diff --git a/templates/default/scripts/test_integration.sh b/templates/default/scripts/test_integration.sh index e3bcc074f3..442b43cbf2 100755 --- a/templates/default/scripts/test_integration.sh +++ b/templates/default/scripts/test_integration.sh @@ -25,7 +25,7 @@ export $(enclave print-env --chain hardhat) --prefix-colors "blue,cyan,magenta,yellow,green" \ --kill-others \ --success first \ - "wait-on http://localhost:13151/health && pnpm ts-node ./tests/integration.spec.ts" \ + "wait-on http://localhost:13151/health && pnpm tsx ./tests/integration.spec.ts" \ "pnpm dev:evm" \ "pnpm dev:ciphernodes" \ "TEST_MODE=1 pnpm dev:server" \ diff --git a/templates/default/server/index.ts b/templates/default/server/index.ts index 305ec7f604..86e4bd8156 100644 --- a/templates/default/server/index.ts +++ b/templates/default/server/index.ts @@ -4,7 +4,7 @@ import { EnclaveEventType, type E3ActivatedData, type InputPublishedData, -} from "@gnosis-guild/enclave/sdk"; +} from "@gnosis-guild/enclave-sdk"; import { handleTestInteraction } from "./testHandler"; import { getCheckedEnvVars } from "./utils"; import { callFheRunner } from "./runner"; @@ -95,8 +95,8 @@ async function runProgram(e3Id: bigint): Promise { } function defer() { - let resolve: () => void = () => { }; - let reject: (e?: any) => void = () => { }; + let resolve: () => void = () => {}; + let reject: (e?: any) => void = () => {}; const promise = new Promise((res, rej) => { resolve = res; diff --git a/templates/default/tests/integration.spec.ts b/templates/default/tests/integration.spec.ts index b29bf3d01e..c9dbf0eda9 100644 --- a/templates/default/tests/integration.spec.ts +++ b/templates/default/tests/integration.spec.ts @@ -1,18 +1,18 @@ import { + AllEventTypes, calculateStartWindow, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, + E3, + EnclaveEvent, EnclaveEventType, EnclaveSDK, encodeBfvParams, encodeComputeProviderParams, - RegistryEventType, - AllEventTypes, - EnclaveEvent, encryptNumber, -} from "@gnosis-guild/enclave/sdk"; + RegistryEventType, +} from "@gnosis-guild/enclave-sdk"; import { hexToBytes } from "viem"; -import { E3 } from "@gnosis-guild/enclave/sdk/types.js"; import assert from "assert"; export function getContractAddresses() { @@ -222,8 +222,8 @@ async function main() { const num1 = 12n; const num2 = 21n; const publicKeyBytes = hexToBytes(state.publicKey); - const enc1 = encryptNumber(num1, publicKeyBytes); - const enc2 = encryptNumber(num2, publicKeyBytes); + const enc1 = await encryptNumber(num1, publicKeyBytes); + const enc2 = await encryptNumber(num2, publicKeyBytes); await waitForEvent(EnclaveEventType.INPUT_PUBLISHED, async () => { await sdk.publishInput( diff --git a/templates/default/tsconfig.json b/templates/default/tsconfig.json index d17b82c638..b91e93146e 100644 --- a/templates/default/tsconfig.json +++ b/templates/default/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "nodenext", "esModuleInterop": true, "moduleResolution": "nodenext", From 7d61acd85496c8a6d6f283bdf454f82006b825a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Sun, 20 Jul 2025 21:58:30 +0000 Subject: [PATCH 104/106] Enclave init is not working (#576) * Add test for enclave init * Name tasks appropriately * Exit with code 1 * Add sdk package to init * Add pnpm * Add version * Wrong position * Add version to all packages * Update release * Update version * Make packages public * Add typechain as dependency to compiling ts * Remove incorrect dependency * Remove pnpm lock * Add current branch in init test * Use the sha * Calculate branch --- .github/workflows/ci.yml | 53 +- crates/init/src/lib.rs | 13 +- crates/wasm/package.json | 7 +- package.json | 5 +- packages/enclave-config/package.json | 6 +- packages/enclave-react/package.json | 5 +- packages/enclave-sdk/package.json | 7 +- packages/evm/package.json | 2 +- templates/default/pnpm-lock.yaml | 5207 -------------------------- 9 files changed, 76 insertions(+), 5229 deletions(-) delete mode 100644 templates/default/pnpm-lock.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c72f9fa83..4b0a4b8045 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,8 +67,7 @@ jobs: - name: Run tests run: "pnpm ciphernode:test" - build: - name: Compile and push Support Dockerfile + build_e3_support_risc0: runs-on: ubuntu-latest outputs: image_tag: ${{ steps.version.outputs.version }} @@ -168,7 +167,7 @@ jobs: echo "## Test results" >> $GITHUB_STEP_SUMMARY echo "✅ Passed" >> $GITHUB_STEP_SUMMARY - test-net: + test_net: runs-on: "ubuntu-latest" steps: - name: "Check out the repo" @@ -187,7 +186,6 @@ jobs: echo "✅ Passed" >> $GITHUB_STEP_SUMMARY integration_prebuild: - name: Prebuild Integration Tools runs-on: "ubuntu-latest" steps: - name: "Check out the repo" @@ -234,8 +232,7 @@ jobs: if-no-files-found: error ciphernode_integration_test: - name: Ciphernode Integration Test - needs: [integration_prebuild, build_enclave_cli, build_sdk] + needs: [integration_prebuild, build_enclave_cli] runs-on: "ubuntu-latest" strategy: matrix: @@ -297,7 +294,6 @@ jobs: echo "✅ Passed" >> $GITHUB_STEP_SUMMARY build_enclave_cli: - name: Build Enclave CLI runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -334,8 +330,7 @@ jobs: path: ~/.cargo/bin/enclave retention-days: 1 - build_support_scripts: - name: Build Support Scripts + build_e3_support_dev: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -369,7 +364,6 @@ jobs: if-no-files-found: error build_sdk: - name: Build SDK runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -424,9 +418,8 @@ jobs: if-no-files-found: warn template_integration: - name: Template Integration runs-on: ubuntu-latest - needs: [build_enclave_cli, build_support_scripts, build_sdk] + needs: [build_enclave_cli, build_e3_support_dev, build_sdk] steps: - uses: actions/checkout@v4 with: @@ -477,3 +470,39 @@ jobs: chmod 755 contracts tests chmod 644 contracts/ImageID.sol pnpm test:integration + + test_enclave_init: + runs-on: ubuntu-latest + needs: [build_enclave_cli, build_e3_support_dev] + steps: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.7.1 + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.85.1 + - name: Download enclave binary + uses: actions/download-artifact@v4 + with: + name: enclave-binary + path: ~/.cargo/bin/ + - name: Make binaries executable + run: | + chmod +x ~/.cargo/bin/enclave + - name: Verify downloaded artifacts + run: | + ls -la ~/.cargo/bin/enclave || echo "enclave binary not found" + - name: Enclave init + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + BRANCH="${{ github.head_ref }}" + else + BRANCH="${{ github.ref_name }}" + fi + enclave init mycitest --template=${{ github.server_url }}/${{ github.repository }}.git#${BRANCH}:templates/default diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index 02ed4df561..c1f139587c 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -12,6 +12,7 @@ use package_json::DependencyType; use pkgman::PkgMan; use std::env; use std::path::PathBuf; +use std::process::exit; use tokio::fs; // const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-2"; @@ -42,6 +43,11 @@ async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> ) .await?; + println!("Getting workspace version for enclave-sdk..."); + let sdk_version = package_json::get_version_from_package_json( + &PathBuf::from(TEMP_DIR).join("packages/enclave-sdk/package.json"), + ) + .await?; let src = PathBuf::from(TEMP_DIR).join(template_path); println!("Copy with filters..."); @@ -59,6 +65,11 @@ async fn install_enclave(cwd: &PathBuf, template: Option) -> Result<()> r#""@gnosis-guild/enclave-react":\s*"[^"]*""#, &format!(r#""@gnosis-guild/enclave-react": "{}""#, react_version), ), + Filter::new( + "**/package.json", + r#""@gnosis-guild/enclave-sdk":\s*"[^"]*""#, + &format!(r#""@gnosis-guild/enclave-sdk": "{}""#, sdk_version), + ), ], ) .await?; @@ -182,7 +193,7 @@ pub async fn execute( eprintln!("\nSorry about this but there was an error running the installer. "); eprintln!("\n Error: {}\n", e); eprintln!("Enclave is currently under active development please share this with our team:\n\n https://github.com/gnosisguild/enclave/issues/new\n"); - Ok(()) + exit(1); } } } diff --git a/crates/wasm/package.json b/crates/wasm/package.json index d5f67280a7..d86ed6e344 100644 --- a/crates/wasm/package.json +++ b/crates/wasm/package.json @@ -1,6 +1,7 @@ { "name": "@gnosis-guild/e3-wasm", - "version": "0.0.5-test.22", + "private": false, + "version": "0.0.6-test", "description": "Wasm modules for enclave.", "main": "index.js", "files": [ @@ -8,7 +9,9 @@ "dist/**/*" ], "scripts": { - "build": "./scripts/build.sh" + "build": "./scripts/build.sh", + "prerelease": "pnpm build", + "release": "pnpm publish --access=public" }, "exports": { ".": { diff --git a/package.json b/package.json index 3fa212a618..01f373e5f5 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,11 @@ "react:build": "cd packages/enclave-react && pnpm build", "sdk:build": "cd packages/enclave-sdk && pnpm build", "sdk:test": "cd packages/enclave-sdk && pnpm test", + "sdk:release": "cd packages/enclave-sdk && pnpm release", + "wasm:release": "cd crates/wasm && pnpm release", + "config:release": "cd packages/enclave-config && pnpm release", "react:release": "cd packages/enclave-react && pnpm release", - "npm:release": "pnpm build && pnpm evm:release && pnpm react:release", + "npm:release": "pnpm build && pnpm config:release && pnpm evm:release && pnpm wasm:release && pnpm sdk:release && pnpm react:release", "support:build": "cd crates/support && ./scripts/build.sh", "build": "pnpm compile", "changeset": "changeset", diff --git a/packages/enclave-config/package.json b/packages/enclave-config/package.json index 917405a8d8..1c8f5e0cea 100644 --- a/packages/enclave-config/package.json +++ b/packages/enclave-config/package.json @@ -1,6 +1,7 @@ { "name": "@gnosis-guild/enclave-config", - "version": "0.0.0", + "private": false, + "version": "0.0.6-test", "description": "", "module": true, "main": "index.js", @@ -10,6 +11,9 @@ "./tsconfig.json": "./tsconfig.json", "./dom.tsconfig.json": "./dom.tsconfig.json" }, + "scripts": { + "release": "pnpm publish --access=public" + }, "keywords": [], "author": "", "license": "LGPL-3.0-only", diff --git a/packages/enclave-react/package.json b/packages/enclave-react/package.json index 225126bdbd..0dfbea7e1a 100644 --- a/packages/enclave-react/package.json +++ b/packages/enclave-react/package.json @@ -1,8 +1,9 @@ { "name": "@gnosis-guild/enclave-react", - "version": "0.0.5-test.22", + "version": "0.0.6-test", "description": "React hooks and utilities for Enclave SDK", "type": "module", + "private": false, "exports": { ".": { "types": "./dist/index.d.ts", @@ -18,7 +19,7 @@ "dev": "tsup --watch", "clean": "rm -rf dist", "prepublishOnly": "pnpm run clean && pnpm run build", - "release": "pnpm publish" + "release": "pnpm publish --access=public" }, "keywords": [ "react", diff --git a/packages/enclave-sdk/package.json b/packages/enclave-sdk/package.json index b70810044b..e13c442055 100644 --- a/packages/enclave-sdk/package.json +++ b/packages/enclave-sdk/package.json @@ -1,6 +1,7 @@ { "name": "@gnosis-guild/enclave-sdk", - "version": "0.0.0", + "private": false, + "version": "0.0.6-test", "type": "module", "exports": { ".": { @@ -13,7 +14,9 @@ "build": "tsup", "dev": "tsup --watch", "clean": "rm -rf dist", - "test": "vitest --run" + "test": "vitest --run", + "prerelease": "pnpm clean && pnpm build", + "release": "pnpm publish --access=public" }, "devDependencies": { "@gnosis-guild/enclave-config": "workspace:*", diff --git a/packages/evm/package.json b/packages/evm/package.json index 2f01432893..f17acb84e1 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,7 +1,7 @@ { "name": "@gnosis-guild/enclave", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.5-test.22", + "version": "0.0.6-test", "license": "LGPL-3.0-only", "author": { "name": "gnosisguild", diff --git a/templates/default/pnpm-lock.yaml b/templates/default/pnpm-lock.yaml deleted file mode 100644 index 39c88fd7c3..0000000000 --- a/templates/default/pnpm-lock.yaml +++ /dev/null @@ -1,5207 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - '@gnosis-guild/enclave': - specifier: 0.0.5-test.8* - version: 0.0.5-test.8(typescript@5.8.3) - '@nomicfoundation/hardhat-chai-matchers': - specifier: ^2.0.0 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.0 - version: 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ignition': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ignition-ethers': - specifier: ^0.15.0 - version: 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-toolbox': - specifier: ^5.0.0 - version: 5.0.0(f32a611d4f5c894495d781d8153f6317) - '@nomicfoundation/hardhat-verify': - specifier: ^2.0.0 - version: 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@openzeppelin/contracts': - specifier: 5.3.0 - version: 5.3.0 - '@risc0/ethereum': - specifier: file:lib/risc0-ethereum - version: file:lib/risc0-ethereum - '@typechain/ethers-v6': - specifier: ^0.5.0 - version: 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': - specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3)) - '@types/chai': - specifier: ^4.2.0 - version: 4.3.20 - '@types/express': - specifier: ^5.0.2 - version: 5.0.2 - '@types/mocha': - specifier: '>=9.1.0' - version: 10.0.10 - '@types/node': - specifier: '>=18.0.0' - version: 22.15.29 - chai: - specifier: ^4.2.0 - version: 4.5.0 - concurrently: - specifier: ^9.1.2 - version: 9.1.2 - ethers: - specifier: ^6.4.0 - version: 6.14.3 - express: - specifier: ^5.1.0 - version: 5.1.0 - hardhat: - specifier: ^2.14.0 - version: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - hardhat-deploy: - specifier: ^0.12.1 - version: 0.12.4 - hardhat-gas-reporter: - specifier: ^1.0.8 - version: 1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - solidity-coverage: - specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) - typechain: - specifier: ^8.3.0 - version: 8.3.2(typescript@5.8.3) - typed-rpc: - specifier: ^6.1.1 - version: 6.1.1 - typescript: - specifier: '>=4.5.0' - version: 5.8.3 - -packages: - - '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/rlp@5.0.2': - resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} - engines: {node: '>=18'} - hasBin: true - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethereumjs/util@9.1.0': - resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} - engines: {node: '>=18'} - - '@ethersproject/abi@5.8.0': - resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} - - '@ethersproject/abstract-provider@5.8.0': - resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} - - '@ethersproject/abstract-signer@5.8.0': - resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} - - '@ethersproject/address@5.6.1': - resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} - - '@ethersproject/address@5.8.0': - resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} - - '@ethersproject/base64@5.8.0': - resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} - - '@ethersproject/basex@5.8.0': - resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} - - '@ethersproject/bignumber@5.8.0': - resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} - - '@ethersproject/bytes@5.8.0': - resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} - - '@ethersproject/constants@5.8.0': - resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} - - '@ethersproject/contracts@5.8.0': - resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} - - '@ethersproject/hash@5.8.0': - resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} - - '@ethersproject/hdnode@5.8.0': - resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} - - '@ethersproject/json-wallets@5.8.0': - resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} - - '@ethersproject/keccak256@5.8.0': - resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} - - '@ethersproject/logger@5.8.0': - resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} - - '@ethersproject/networks@5.8.0': - resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} - - '@ethersproject/pbkdf2@5.8.0': - resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} - - '@ethersproject/properties@5.8.0': - resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} - - '@ethersproject/providers@5.8.0': - resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} - - '@ethersproject/random@5.8.0': - resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} - - '@ethersproject/rlp@5.8.0': - resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} - - '@ethersproject/sha2@5.8.0': - resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} - - '@ethersproject/signing-key@5.8.0': - resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} - - '@ethersproject/solidity@5.8.0': - resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} - - '@ethersproject/strings@5.8.0': - resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} - - '@ethersproject/transactions@5.8.0': - resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} - - '@ethersproject/units@5.8.0': - resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} - - '@ethersproject/wallet@5.8.0': - resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} - - '@ethersproject/web@5.8.0': - resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} - - '@ethersproject/wordlists@5.8.0': - resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} - - '@excubiae/contracts@0.4.0': - resolution: {integrity: sha512-jrR+IpelmoRW9adg6Dq+KlPMJfBr0dWPKjjuAIeZae883twnfk5+MWHGBBxFL7Rykx7URuQHpMvhYYamExL3Ow==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@gnosis-guild/enclave@0.0.5-test.8': - resolution: {integrity: sha512-zkqBY9KX28tGWwDQEh91VNMbMKZXI7uMir40G9b8eS4K11BY6c3saukUi8PDD7UwWcOIErGXU4QtcOSDeMKjxw==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/curves@1.8.2': - resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.2.0': - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.7.2': - resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@noble/secp256k1@1.7.1': - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nomicfoundation/edr-darwin-arm64@0.11.0': - resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-darwin-x64@0.11.0': - resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': - resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': - resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': - resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-x64-musl@0.11.0': - resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': - resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr@0.11.0': - resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} - engines: {node: '>= 18'} - - '@nomicfoundation/hardhat-chai-matchers@2.0.8': - resolution: {integrity: sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.0 - chai: ^4.2.0 - ethers: ^6.1.0 - hardhat: ^2.9.4 - - '@nomicfoundation/hardhat-ethers@3.0.8': - resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} - peerDependencies: - ethers: ^6.1.0 - hardhat: ^2.0.0 - - '@nomicfoundation/hardhat-ignition-ethers@0.15.11': - resolution: {integrity: sha512-srXzvf7qCDHLrnvQWtpVA9gWpcbp4BcnsOqJt6ISet9OlUnxk4GgRMbdFq4YpM48bHQTX397jS9yk1AtJCjt/g==} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.4 - '@nomicfoundation/hardhat-ignition': ^0.15.11 - '@nomicfoundation/ignition-core': ^0.15.11 - ethers: ^6.7.0 - hardhat: ^2.18.0 - - '@nomicfoundation/hardhat-ignition@0.15.11': - resolution: {integrity: sha512-OXebmK9FCMwwbb4mIeHBbVFFicAGgyGKJT2zrONrpixrROxrVs6KEi1gzsiN25qtQhCQePt8BTjjYrgy86Dfxg==} - peerDependencies: - '@nomicfoundation/hardhat-verify': ^2.0.1 - hardhat: ^2.18.0 - - '@nomicfoundation/hardhat-network-helpers@1.0.12': - resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} - peerDependencies: - hardhat: ^2.9.5 - - '@nomicfoundation/hardhat-toolbox@5.0.0': - resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} - peerDependencies: - '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 - '@nomicfoundation/hardhat-ethers': ^3.0.0 - '@nomicfoundation/hardhat-ignition-ethers': ^0.15.0 - '@nomicfoundation/hardhat-network-helpers': ^1.0.0 - '@nomicfoundation/hardhat-verify': ^2.0.0 - '@typechain/ethers-v6': ^0.5.0 - '@typechain/hardhat': ^9.0.0 - '@types/chai': ^4.2.0 - '@types/mocha': '>=9.1.0' - '@types/node': '>=18.0.0' - chai: ^4.2.0 - ethers: ^6.4.0 - hardhat: ^2.11.0 - hardhat-gas-reporter: ^1.0.8 - solidity-coverage: ^0.8.1 - ts-node: '>=8.0.0' - typechain: ^8.3.0 - typescript: '>=4.5.0' - - '@nomicfoundation/hardhat-verify@2.0.14': - resolution: {integrity: sha512-z3iVF1WYZHzcdMMUuureFpSAfcnlfJbJx3faOnGrOYg6PRTki1Ut9JAuRccnFzMHf1AmTEoSUpWcyvBCoxL5Rg==} - peerDependencies: - hardhat: ^2.24.1 - - '@nomicfoundation/ignition-core@0.15.11': - resolution: {integrity: sha512-PeYKRlrQ0koT72yRnlyyG66cXMFiv5X/cIB8hBFPl3ekeg5tPXcHAgs/VZhOsgwEox4ejphTtItLESb1IDBw0w==} - - '@nomicfoundation/ignition-ui@0.15.11': - resolution: {integrity: sha512-VPOVl5xqCKhYCyPOQlposx+stjCwqXQ+BCs5lnw/f2YUfgII+G5Ye0JfHiJOfCJGmqyS03WertBslcj9zQg50A==} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': - resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': - resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': - resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': - resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': - resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': - resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': - resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer@0.1.2': - resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} - engines: {node: '>= 12'} - - '@openzeppelin/contracts@5.3.0': - resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} - - '@risc0/ethereum@file:lib/risc0-ethereum': - resolution: {directory: lib/risc0-ethereum, type: directory} - - '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - - '@scure/base@1.2.6': - resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - - '@scure/bip32@1.1.5': - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - - '@scure/bip32@1.4.0': - resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - - '@scure/bip32@1.7.0': - resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - - '@scure/bip39@1.1.1': - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - - '@scure/bip39@1.3.0': - resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - - '@scure/bip39@1.6.0': - resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - - '@semaphore-protocol/contracts@4.11.1': - resolution: {integrity: sha512-WYh598A6UE4+akDxxw+jU8DMKWqDgJBdV/iEUdzdXE+YGVJav4uOQJY8KetNKAakJf3z3/8rgkPab+dk3fJyuQ==} - - '@sentry/core@5.30.0': - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} - - '@sentry/hub@5.30.0': - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} - - '@sentry/minimal@5.30.0': - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} - - '@sentry/node@5.30.0': - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} - - '@sentry/tracing@5.30.0': - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} - - '@sentry/types@5.30.0': - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} - - '@sentry/utils@5.30.0': - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} - - '@solidity-parser/parser@0.14.5': - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - - '@solidity-parser/parser@0.20.1': - resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@typechain/ethers-v6@0.5.1': - resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} - peerDependencies: - ethers: 6.x - typechain: ^8.3.2 - typescript: '>=4.7.0' - - '@typechain/hardhat@9.1.0': - resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} - peerDependencies: - '@typechain/ethers-v6': ^0.5.1 - ethers: ^6.1.0 - hardhat: ^2.9.9 - typechain: ^8.3.2 - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/chai-as-promised@7.1.8': - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/concat-stream@1.6.1': - resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - - '@types/express@5.0.2': - resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} - - '@types/form-data@0.0.33': - resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/mocha@10.0.10': - resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - - '@types/node@10.17.60': - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - - '@types/node@22.15.29': - resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} - - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - - '@types/node@8.10.66': - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - - '@types/pbkdf2@3.1.2': - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/secp256k1@4.0.6': - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@zk-kit/lean-imt.sol@2.0.1': - resolution: {integrity: sha512-2dy/wfzch2vy5QtDCFmQwN7E4GZP0xBcucTb2mfZoJP5V69cjPRdy6KcbS0YOcBMH/Lb7BgXLsekRYjh9JNKEw==} - - abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - - adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} - - aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - - aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - - array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - - bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - - bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - - boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} - - cbor@9.0.2: - resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} - engines: {node: '>=16'} - - chai-as-promised@7.1.2: - resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} - peerDependencies: - chai: '>= 2.1.2 < 6' - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - - cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} - engines: {node: '>= 0.10'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - - cli-table3@0.5.1: - resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} - engines: {node: '>=6'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - - command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - - command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - concurrently@9.1.2: - resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} - engines: {node: '>=18'} - hasBin: true - - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - - death@1.1.0: - resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} - hasBin: true - - esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} - peerDependencies: - '@codechecks/client': ^0.1.0 - peerDependenciesMeta: - '@codechecks/client': - optional: true - - ethereum-bloom-filters@1.2.0: - resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} - - ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - - ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - - ethereum-cryptography@2.2.1: - resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - - ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} - - ethers@5.8.0: - resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} - - ethers@6.14.3: - resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} - engines: {node: '>=14.0.0'} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} - - find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fmix@0.1.0: - resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@2.5.3: - resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} - engines: {node: '>= 0.12'} - - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} - hasBin: true - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hardhat-deploy@0.12.4: - resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} - - hardhat-gas-reporter@1.0.10: - resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} - peerDependencies: - hardhat: ^2.0.2 - - hardhat@2.24.2: - resolution: {integrity: sha512-oYt+tcN2379Z3kqIhvVw6IFgWqTm/ixcrTvyAuQdE2RbD+kknwF7hDfUeggy0akrw6xdgCtXvnw9DFrxAB70hA==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - - has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - immer@10.0.2: - resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - - imul@1.0.1: - resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} - engines: {node: '>=0.10.0'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isows@1.0.7: - resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} - peerDependencies: - ws: '*' - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stream-stringify@3.1.6: - resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} - engines: {node: '>=7.10.1'} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonschema@1.5.0: - resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} - - keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} - - match-all@1.2.7: - resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micro-eth-signer@0.14.0: - resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micro-packed@0.7.3: - resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} - hasBin: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - murmur-128@0.2.1: - resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} - - ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} - - nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obliterator@2.0.5: - resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - - ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - ox@0.7.1: - resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - poseidon-solidity@0.0.5: - resolution: {integrity: sha512-NzrvSwHzvZgT4hvg2GyGqeR+UOU/eLSEt4wAoXEua+VaR7NTKKwx1X9bPlh1VMBEVEno+IWvkRBbidFGzTeAqQ==} - - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} - - reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - - req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} - - req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - - resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - - resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - - rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} - hasBin: true - - scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - secp256k1@4.0.4: - resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} - engines: {node: '>=18.0.0'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - - sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} - - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - - solady@0.1.19: - resolution: {integrity: sha512-G++8xhNVkRaCw7uySX1obmhYLOk7nFjeCc1XcTmA+WQ7cQXqYDca+DoDpWI/N6iWKOcQQXoLwx+5Vkx9LDSABw==} - - solady@0.1.4: - resolution: {integrity: sha512-BQKpX9Ezdp6WpUcT3H7cWdZKH31Ih7yZiUOQ6SUYzJ6gYjCB0KXPg77bS+pzmeQEtdMNK56gjlaqtn6ptFPSXQ==} - - solc@0.8.26: - resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} - engines: {node: '>=10.0.0'} - hasBin: true - - solidity-coverage@0.8.16: - resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} - hasBin: true - peerDependencies: - hardhat: ^2.11.0 - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stacktrace-parser@0.1.11: - resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} - engines: {node: '>=6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} - - sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} - - table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} - - table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} - - then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true - - ts-essentials@7.0.3: - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - - typechain@8.3.2: - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' - - typed-rpc@6.1.1: - resolution: {integrity: sha512-PZCwvDWNyXHp5ZuHJqixU59jw+61JIL95jkW71VUXPJagYRJtpmRdFdIF3EL5tEz6XHLaBtrqgJEBysHIu4vOw==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - - typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - viem@2.30.6: - resolution: {integrity: sha512-N3vGy3pZ+EVgQRuWqQhZPFXxQE8qMRrBd3uM+KLc1Ub2w6+vkyr7umeWQCM4c+wlsCdByUgh2630MDMLquMtpg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} - - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zksync-ethers@5.10.0: - resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} - engines: {node: '>=16.0.0'} - peerDependencies: - ethers: ~5.7.0 - -snapshots: - - '@adraffy/ens-normalize@1.10.1': {} - - '@adraffy/ens-normalize@1.11.0': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@ethereumjs/rlp@4.0.1': {} - - '@ethereumjs/rlp@5.0.2': {} - - '@ethereumjs/util@8.1.0': - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.2.1 - micro-ftch: 0.3.1 - - '@ethereumjs/util@9.1.0': - dependencies: - '@ethereumjs/rlp': 5.0.2 - ethereum-cryptography: 2.2.1 - - '@ethersproject/abi@5.8.0': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/abstract-provider@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 - - '@ethersproject/abstract-signer@5.8.0': - dependencies: - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - - '@ethersproject/address@5.6.1': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/rlp': 5.8.0 - - '@ethersproject/address@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/rlp': 5.8.0 - - '@ethersproject/base64@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - - '@ethersproject/basex@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/properties': 5.8.0 - - '@ethersproject/bignumber@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - bn.js: 5.2.2 - - '@ethersproject/bytes@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/constants@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - - '@ethersproject/contracts@5.8.0': - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - - '@ethersproject/hash@5.8.0': - dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/hdnode@5.8.0': - dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 - - '@ethersproject/json-wallets@5.8.0': - dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - - '@ethersproject/keccak256@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - js-sha3: 0.8.0 - - '@ethersproject/logger@5.8.0': {} - - '@ethersproject/networks@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/pbkdf2@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/sha2': 5.8.0 - - '@ethersproject/properties@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/providers@5.8.0': - dependencies: - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 - bech32: 1.1.4 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@ethersproject/random@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/rlp@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/sha2@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - hash.js: 1.1.7 - - '@ethersproject/signing-key@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - bn.js: 5.2.2 - elliptic: 6.6.1 - hash.js: 1.1.7 - - '@ethersproject/solidity@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/strings@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/transactions@5.8.0': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - - '@ethersproject/units@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/wallet@5.8.0': - dependencies: - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/json-wallets': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 - - '@ethersproject/web@5.8.0': - dependencies: - '@ethersproject/base64': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/wordlists@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@excubiae/contracts@0.4.0': - dependencies: - '@openzeppelin/contracts': 5.3.0 - '@semaphore-protocol/contracts': 4.11.1 - solady: 0.1.4 - - '@fastify/busboy@2.1.1': {} - - '@gnosis-guild/enclave@0.0.5-test.8(typescript@5.8.3)': - dependencies: - '@excubiae/contracts': 0.4.0 - solady: 0.1.19 - viem: 2.30.6(typescript@5.8.3) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@noble/ciphers@1.3.0': {} - - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/curves@1.8.2': - dependencies: - '@noble/hashes': 1.7.2 - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.2.0': {} - - '@noble/hashes@1.3.2': {} - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.7.2': {} - - '@noble/hashes@1.8.0': {} - - '@noble/secp256k1@1.7.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@nomicfoundation/edr-darwin-arm64@0.11.0': {} - - '@nomicfoundation/edr-darwin-x64@0.11.0': {} - - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} - - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} - - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} - - '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} - - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} - - '@nomicfoundation/edr@0.11.0': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.0 - '@nomicfoundation/edr-darwin-x64': 0.11.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-x64-musl': 0.11.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@types/chai-as-promised': 7.1.8 - chai: 4.5.0 - chai-as-promised: 7.1.2(chai@4.5.0) - deep-eql: 4.1.4 - ethers: 6.14.3 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - ordinal: 1.0.3 - - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - ethers: 6.14.3 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-ignition-ethers@0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ignition': 0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/ignition-core': 0.15.11 - ethers: 6.14.3 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - - '@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/ignition-core': 0.15.11 - '@nomicfoundation/ignition-ui': 0.15.11 - chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) - fs-extra: 10.1.0 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - json5: 2.2.3 - prompts: 2.4.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - - '@nomicfoundation/hardhat-toolbox@5.0.0(f32a611d4f5c894495d781d8153f6317)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(chai@4.5.0)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.11(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/hardhat-ignition@0.15.11(@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)))(@nomicfoundation/ignition-core@0.15.11)(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@nomicfoundation/hardhat-verify': 2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3)) - '@types/chai': 4.3.20 - '@types/mocha': 10.0.10 - '@types/node': 22.15.29 - chai: 4.5.0 - ethers: 6.14.3 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - hardhat-gas-reporter: 1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - solidity-coverage: 0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)) - ts-node: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - typescript: 5.8.3 - - '@nomicfoundation/hardhat-verify@2.0.14(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))': - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/address': 5.8.0 - cbor: 8.1.0 - debug: 4.4.1(supports-color@8.1.1) - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - lodash.clonedeep: 4.5.0 - picocolors: 1.1.1 - semver: 6.3.1 - table: 6.9.0 - undici: 5.29.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/ignition-core@0.15.11': - dependencies: - '@ethersproject/address': 5.6.1 - '@nomicfoundation/solidity-analyzer': 0.1.2 - cbor: 9.0.2 - debug: 4.4.1(supports-color@8.1.1) - ethers: 6.14.3 - fs-extra: 10.1.0 - immer: 10.0.2 - lodash: 4.17.21 - ndjson: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/ignition-ui@0.15.11': {} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer@0.1.2': - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - - '@openzeppelin/contracts@5.3.0': {} - - '@risc0/ethereum@file:lib/risc0-ethereum': {} - - '@scure/base@1.1.9': {} - - '@scure/base@1.2.6': {} - - '@scure/bip32@1.1.5': - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.9 - - '@scure/bip32@1.4.0': - dependencies: - '@noble/curves': 1.4.2 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.9 - - '@scure/bip32@1.7.0': - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 - - '@scure/bip39@1.1.1': - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.9 - - '@scure/bip39@1.3.0': - dependencies: - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.9 - - '@scure/bip39@1.6.0': - dependencies: - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 - - '@semaphore-protocol/contracts@4.11.1': - dependencies: - '@zk-kit/lean-imt.sol': 2.0.1 - - '@sentry/core@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/hub@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/minimal@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sentry/node@5.30.0': - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - - '@sentry/tracing@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/types@5.30.0': {} - - '@sentry/utils@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@solidity-parser/parser@0.14.5': - dependencies: - antlr4ts: 0.5.0-alpha.4 - - '@solidity-parser/parser@0.20.1': {} - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': - dependencies: - ethers: 6.14.3 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - typescript: 5.8.3 - - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3))(ethers@6.14.3)(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3))(typechain@8.3.2(typescript@5.8.3))': - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.14.3)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) - ethers: 6.14.3 - fs-extra: 9.1.0 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - typechain: 8.3.2(typescript@5.8.3) - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.29 - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.15.29 - - '@types/chai-as-promised@7.1.8': - dependencies: - '@types/chai': 4.3.20 - - '@types/chai@4.3.20': {} - - '@types/concat-stream@1.6.1': - dependencies: - '@types/node': 22.15.29 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.29 - - '@types/express-serve-static-core@5.0.6': - dependencies: - '@types/node': 22.15.29 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@5.0.2': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 - - '@types/form-data@0.0.33': - dependencies: - '@types/node': 22.15.29 - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.15.29 - - '@types/http-errors@2.0.4': {} - - '@types/lru-cache@5.1.1': {} - - '@types/mime@1.3.5': {} - - '@types/minimatch@5.1.2': {} - - '@types/mocha@10.0.10': {} - - '@types/node@10.17.60': {} - - '@types/node@22.15.29': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.7.5': - dependencies: - undici-types: 6.19.8 - - '@types/node@8.10.66': {} - - '@types/pbkdf2@3.1.2': - dependencies: - '@types/node': 22.15.29 - - '@types/prettier@2.7.3': {} - - '@types/qs@6.14.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/secp256k1@4.0.6': - dependencies: - '@types/node': 22.15.29 - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.15.29 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.15.29 - '@types/send': 0.17.4 - - '@zk-kit/lean-imt.sol@2.0.1': - dependencies: - poseidon-solidity: 0.0.5 - - abbrev@1.0.9: {} - - abitype@1.0.8(typescript@5.8.3): - optionalDependencies: - typescript: 5.8.3 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 - - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} - - adm-zip@0.4.16: {} - - aes-js@3.0.0: {} - - aes-js@4.0.0-beta.5: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - amdefine@1.0.1: - optional: true - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@4.1.3: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-regex@3.0.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - antlr4ts@0.5.0-alpha.4: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-back@3.1.0: {} - - array-back@4.0.2: {} - - array-union@2.1.0: {} - - array-uniq@1.0.3: {} - - asap@2.0.6: {} - - assertion-error@1.1.0: {} - - astral-regex@2.0.0: {} - - async@1.5.2: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - axios@0.21.4(debug@4.4.1): - dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - transitivePeerDependencies: - - debug - - axios@1.9.0: - dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.2 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - bech32@1.1.4: {} - - binary-extensions@2.3.0: {} - - blakejs@1.2.1: {} - - bn.js@4.11.6: {} - - bn.js@4.12.2: {} - - bn.js@5.2.2: {} - - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - brorand@1.1.0: {} - - browser-stdout@1.3.1: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.6 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - - buffer-from@1.1.2: {} - - buffer-xor@1.0.3: {} - - bytes@3.1.2: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelcase@6.3.0: {} - - caseless@0.12.0: {} - - cbor@8.1.0: - dependencies: - nofilter: 3.1.0 - - cbor@9.0.2: - dependencies: - nofilter: 3.1.0 - - chai-as-promised@7.1.2(chai@4.5.0): - dependencies: - chai: 4.5.0 - check-error: 1.0.3 - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - charenc@0.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - ci-info@2.0.0: {} - - cipher-base@1.0.6: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - clean-stack@2.2.0: {} - - cli-boxes@2.2.1: {} - - cli-table3@0.5.1: - dependencies: - object-assign: 4.1.1 - string-width: 2.1.1 - optionalDependencies: - colors: 1.4.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colors@1.4.0: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - command-exists@1.2.9: {} - - command-line-args@5.2.1: - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - - command-line-usage@6.1.3: - dependencies: - array-back: 4.0.2 - chalk: 2.4.2 - table-layout: 1.0.2 - typical: 5.2.0 - - commander@8.3.0: {} - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - concurrently@9.1.2: - dependencies: - chalk: 4.1.2 - lodash: 4.17.21 - rxjs: 7.8.2 - shell-quote: 1.8.3 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.2.2: {} - - cookie@0.4.2: {} - - cookie@0.7.2: {} - - core-util-is@1.0.3: {} - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.6 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.6 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - create-require@1.1.1: {} - - crypt@0.0.2: {} - - death@1.1.0: {} - - debug@4.4.1(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - diff@4.0.2: {} - - diff@5.2.0: {} - - difflib@0.2.4: - dependencies: - heap: 0.2.7 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - ee-first@1.1.1: {} - - elliptic@6.6.1: - dependencies: - bn.js: 4.12.2 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - emoji-regex@8.0.0: {} - - encode-utf8@1.0.3: {} - - encodeurl@2.0.0: {} - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - env-paths@2.2.1: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@1.8.1: - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - - esprima@2.7.3: {} - - esprima@4.0.1: {} - - estraverse@1.9.3: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - eth-gas-reporter@0.2.27: - dependencies: - '@solidity-parser/parser': 0.14.5 - axios: 1.9.0 - cli-table3: 0.5.1 - colors: 1.4.0 - ethereum-cryptography: 1.2.0 - ethers: 5.8.0 - fs-readdir-recursive: 1.1.0 - lodash: 4.17.21 - markdown-table: 1.1.3 - mocha: 10.8.2 - req-cwd: 2.0.0 - sha1: 1.1.1 - sync-request: 6.1.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - - ethereum-bloom-filters@1.2.0: - dependencies: - '@noble/hashes': 1.8.0 - - ethereum-cryptography@0.1.3: - dependencies: - '@types/pbkdf2': 3.1.2 - '@types/secp256k1': 4.0.6 - blakejs: 1.2.1 - browserify-aes: 1.2.0 - bs58check: 2.1.2 - create-hash: 1.2.0 - create-hmac: 1.1.7 - hash.js: 1.1.7 - keccak: 3.0.4 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - scrypt-js: 3.0.1 - secp256k1: 4.0.4 - setimmediate: 1.0.5 - - ethereum-cryptography@1.2.0: - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/bip32': 1.1.5 - '@scure/bip39': 1.1.1 - - ethereum-cryptography@2.2.1: - dependencies: - '@noble/curves': 1.4.2 - '@noble/hashes': 1.4.0 - '@scure/bip32': 1.4.0 - '@scure/bip39': 1.3.0 - - ethereumjs-util@7.1.5: - dependencies: - '@types/bn.js': 5.1.6 - bn.js: 5.2.2 - create-hash: 1.2.0 - ethereum-cryptography: 0.1.3 - rlp: 2.2.7 - - ethers@5.8.0: - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/contracts': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/json-wallets': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/providers': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/solidity': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/units': 5.8.0 - '@ethersproject/wallet': 5.8.0 - '@ethersproject/web': 5.8.0 - '@ethersproject/wordlists': 5.8.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethers@6.14.3: - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 22.7.5 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethjs-unit@0.1.6: - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - - eventemitter3@5.0.1: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.6: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - fdir@6.4.5(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@2.1.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - find-replace@3.0.0: - dependencies: - array-back: 3.1.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fmix@0.1.0: - dependencies: - imul: 1.0.1 - - follow-redirects@1.15.9(debug@4.4.1): - optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) - - form-data@2.5.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fp-ts@1.19.3: {} - - fresh@2.0.0: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-readdir-recursive@1.1.0: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-port@3.2.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - ghost-testrpc@0.0.2: - dependencies: - chalk: 2.4.2 - node-emoji: 1.11.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@5.0.15: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.1.7: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - - globby@10.0.2: - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - glob: 7.2.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - hardhat-deploy@0.12.4: - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/contracts': 5.8.0 - '@ethersproject/providers': 5.8.0 - '@ethersproject/solidity': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wallet': 5.8.0 - '@types/qs': 6.14.0 - axios: 0.21.4(debug@4.4.1) - chalk: 4.1.2 - chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) - enquirer: 2.4.1 - ethers: 5.8.0 - form-data: 4.0.2 - fs-extra: 10.1.0 - match-all: 1.2.7 - murmur-128: 0.2.1 - qs: 6.14.0 - zksync-ethers: 5.10.0(ethers@5.8.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - hardhat-gas-reporter@1.0.10(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)): - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: 0.2.27 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - debug - - utf-8-validate - - hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3): - dependencies: - '@ethereumjs/util': 9.1.0 - '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chokidar: 4.0.3 - ci-info: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - find-up: 5.0.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - immutable: 4.3.7 - io-ts: 1.10.4 - json-stream-stringify: 3.1.6 - keccak: 3.0.4 - lodash: 4.17.21 - micro-eth-signer: 0.14.0 - mnemonist: 0.38.5 - mocha: 10.8.2 - p-map: 4.0.0 - picocolors: 1.1.1 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 - tsort: 0.0.1 - undici: 5.29.0 - uuid: 8.3.2 - ws: 7.5.10 - optionalDependencies: - ts-node: 10.9.2(@types/node@22.15.29)(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - has-flag@1.0.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hash-base@3.1.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - heap@0.2.7: {} - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - http-basic@8.1.3: - dependencies: - caseless: 0.12.0 - concat-stream: 1.6.2 - http-response-object: 3.0.2 - parse-cache-control: 1.0.1 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-response-object@3.0.2: - dependencies: - '@types/node': 10.17.60 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - immer@10.0.2: {} - - immutable@4.3.7: {} - - imul@1.0.1: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - interpret@1.4.0: {} - - io-ts@1.10.4: - dependencies: - fp-ts: 1.19.3 - - ipaddr.js@1.9.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hex-prefixed@1.0.0: {} - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-promise@4.0.0: {} - - is-unicode-supported@0.1.0: {} - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - isows@1.0.7(ws@8.18.2): - dependencies: - ws: 8.18.2 - - js-sha3@0.8.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-schema-traverse@1.0.0: {} - - json-stream-stringify@3.1.6: {} - - json-stringify-safe@5.0.1: {} - - json5@2.2.3: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonschema@1.5.0: {} - - keccak@3.0.4: - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.8.4 - readable-stream: 3.6.2 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.camelcase@4.3.0: {} - - lodash.clonedeep@4.5.0: {} - - lodash.isequal@4.5.0: {} - - lodash.truncate@4.4.2: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lru_map@0.3.3: {} - - make-error@1.3.6: {} - - markdown-table@1.1.3: {} - - match-all@1.2.7: {} - - math-intrinsics@1.1.0: {} - - md5.js@1.3.5: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - media-typer@1.1.0: {} - - memorystream@0.3.1: {} - - merge-descriptors@2.0.0: {} - - merge2@1.4.1: {} - - micro-eth-signer@0.14.0: - dependencies: - '@noble/curves': 1.8.2 - '@noble/hashes': 1.7.2 - micro-packed: 0.7.3 - - micro-ftch@0.3.1: {} - - micro-packed@0.7.3: - dependencies: - '@scure/base': 1.2.6 - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mnemonist@0.38.5: - dependencies: - obliterator: 2.0.5 - - mocha@10.8.2: - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - - ms@2.1.3: {} - - murmur-128@0.2.1: - dependencies: - encode-utf8: 1.0.3 - fmix: 0.1.0 - imul: 1.0.1 - - ndjson@2.0.0: - dependencies: - json-stringify-safe: 5.0.1 - minimist: 1.2.8 - readable-stream: 3.6.2 - split2: 3.2.2 - through2: 4.0.2 - - negotiator@1.0.0: {} - - neo-async@2.6.2: {} - - node-addon-api@2.0.2: {} - - node-addon-api@5.1.0: {} - - node-emoji@1.11.0: - dependencies: - lodash: 4.17.21 - - node-gyp-build@4.8.4: {} - - nofilter@3.1.0: {} - - nopt@3.0.6: - dependencies: - abbrev: 1.0.9 - - normalize-path@3.0.0: {} - - number-to-bn@1.7.0: - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - obliterator@2.0.5: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - - ordinal@1.0.3: {} - - os-tmpdir@1.0.2: {} - - ox@0.7.1(typescript@5.8.3): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - zod - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - parse-cache-control@1.0.1: {} - - parseurl@1.3.3: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-parse@1.0.7: {} - - path-to-regexp@8.2.0: {} - - path-type@4.0.0: {} - - pathval@1.1.1: {} - - pbkdf2@3.1.2: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pify@4.0.1: {} - - poseidon-solidity@0.0.5: {} - - prelude-ls@1.1.2: {} - - prettier@2.8.8: {} - - process-nextick-args@2.0.1: {} - - promise@8.3.0: - dependencies: - asap: 2.0.6 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@1.1.0: {} - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.1.2: {} - - rechoir@0.6.2: - dependencies: - resolve: 1.22.10 - - recursive-readdir@2.2.3: - dependencies: - minimatch: 3.1.2 - - reduce-flatten@2.0.0: {} - - req-cwd@2.0.0: - dependencies: - req-from: 2.0.0 - - req-from@2.0.0: - dependencies: - resolve-from: 3.0.0 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - resolve-from@3.0.0: {} - - resolve@1.1.7: {} - - resolve@1.17.0: - dependencies: - path-parse: 1.0.7 - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.1.0: {} - - ripemd160@2.0.2: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - - rlp@2.2.7: - dependencies: - bn.js: 5.2.2 - - router@2.2.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - sc-istanbul@0.4.6: - dependencies: - abbrev: 1.0.9 - async: 1.5.2 - escodegen: 1.8.1 - esprima: 2.7.3 - glob: 5.0.15 - handlebars: 4.7.8 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - nopt: 3.0.6 - once: 1.4.0 - resolve: 1.1.7 - supports-color: 3.2.3 - which: 1.3.1 - wordwrap: 1.0.0 - - scrypt-js@3.0.1: {} - - secp256k1@4.0.4: - dependencies: - elliptic: 6.6.1 - node-addon-api: 5.1.0 - node-gyp-build: 4.8.4 - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.7.2: {} - - send@1.2.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - - setimmediate@1.0.5: {} - - setprototypeof@1.2.0: {} - - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - sha1@1.1.1: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - - shell-quote@1.8.3: {} - - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - solady@0.1.19: {} - - solady@0.1.4: {} - - solc@0.8.26(debug@4.4.1): - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) - js-sha3: 0.8.0 - memorystream: 0.3.1 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - - solidity-coverage@0.8.16(hardhat@2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3)): - dependencies: - '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - ghost-testrpc: 0.0.2 - global-modules: 2.0.0 - globby: 10.0.2 - hardhat: 2.24.2(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3))(typescript@5.8.3) - jsonschema: 1.5.0 - lodash: 4.17.21 - mocha: 10.8.2 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.7.2 - shelljs: 0.8.5 - web3-utils: 1.10.4 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.2.0: - dependencies: - amdefine: 1.0.1 - optional: true - - source-map@0.6.1: {} - - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - - sprintf-js@1.0.3: {} - - stacktrace-parser@0.1.11: - dependencies: - type-fest: 0.7.1 - - statuses@2.0.1: {} - - string-format@2.0.0: {} - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-hex-prefix@1.0.0: - dependencies: - is-hex-prefixed: 1.0.0 - - strip-json-comments@3.1.1: {} - - supports-color@3.2.3: - dependencies: - has-flag: 1.0.0 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - sync-request@6.1.0: - dependencies: - http-response-object: 3.0.2 - sync-rpc: 1.3.6 - then-request: 6.0.2 - - sync-rpc@1.3.6: - dependencies: - get-port: 3.2.0 - - table-layout@1.0.2: - dependencies: - array-back: 4.0.2 - deep-extend: 0.6.0 - typical: 5.2.0 - wordwrapjs: 4.0.1 - - table@6.9.0: - dependencies: - ajv: 8.17.1 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - then-request@6.0.2: - dependencies: - '@types/concat-stream': 1.6.1 - '@types/form-data': 0.0.33 - '@types/node': 8.10.66 - '@types/qs': 6.14.0 - caseless: 0.12.0 - concat-stream: 1.6.2 - form-data: 2.5.3 - http-basic: 8.1.3 - http-response-object: 3.0.2 - promise: 8.3.0 - qs: 6.14.0 - - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.5(picomatch@4.0.2) - picomatch: 4.0.2 - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tree-kill@1.2.2: {} - - ts-command-line-args@2.5.1: - dependencies: - chalk: 4.1.2 - command-line-args: 5.2.1 - command-line-usage: 6.1.3 - string-format: 2.0.0 - - ts-essentials@7.0.3(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - - ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.29 - acorn: 8.14.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tslib@1.14.1: {} - - tslib@2.7.0: {} - - tslib@2.8.1: {} - - tsort@0.0.1: {} - - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - - type-detect@4.1.0: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-fest@0.7.1: {} - - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - - typechain@8.3.2(typescript@5.8.3): - dependencies: - '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - typed-rpc@6.1.1: {} - - typedarray@0.0.6: {} - - typescript@5.8.3: {} - - typical@4.0.0: {} - - typical@5.2.0: {} - - uglify-js@3.19.3: - optional: true - - undici-types@6.19.8: {} - - undici-types@6.21.0: {} - - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 - - universalify@0.1.2: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - utf8@3.0.0: {} - - util-deprecate@1.0.2: {} - - uuid@8.3.2: {} - - v8-compile-cache-lib@3.0.1: {} - - vary@1.1.2: {} - - viem@2.30.6(typescript@5.8.3): - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - isows: 1.0.7(ws@8.18.2) - ox: 0.7.1(typescript@5.8.3) - ws: 8.18.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - web3-utils@1.10.4: - dependencies: - '@ethereumjs/util': 8.1.0 - bn.js: 5.2.2 - ethereum-bloom-filters: 1.2.0 - ethereum-cryptography: 2.2.1 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - - word-wrap@1.2.5: {} - - wordwrap@1.0.0: {} - - wordwrapjs@4.0.1: - dependencies: - reduce-flatten: 2.0.0 - typical: 5.2.0 - - workerpool@6.5.1: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10: {} - - ws@8.17.1: {} - - ws@8.18.0: {} - - ws@8.18.2: {} - - y18n@5.0.8: {} - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} - - zksync-ethers@5.10.0(ethers@5.8.0): - dependencies: - ethers: 5.8.0 From 31b1c9a29a17485fad622447fbbb4fe3f78df652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 21 Jul 2025 15:00:38 +0000 Subject: [PATCH 105/106] Update actions to remove hacknet (#578) --- .github/workflows/ci.yml | 4 ---- .github/workflows/crisp-docker.yml | 20 +++++++++----------- .github/workflows/crisp-e2e.yaml | 3 +-- .github/workflows/ec2-deployment.yml | 2 -- .github/workflows/publish-evm.yml | 15 +++++++++++---- 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b0a4b8045..c2cbf797cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,11 +4,9 @@ on: pull_request: branches: - main - - hacknet push: branches: - main - - hacknet env: DOCKERFILE_PATH: crates/support/Dockerfile IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/e3-support @@ -84,8 +82,6 @@ jobs: TAGS="${{ env.IMAGE_NAME }}:$VERSION" if [ "${{ github.ref }}" = "refs/heads/main" ]; then TAGS="$TAGS,${{ env.IMAGE_NAME }}:latest" - elif [ "${{ github.ref }}" = "refs/heads/hacknet" ]; then - TAGS="$TAGS,${{ env.IMAGE_NAME }}:hacknet" fi echo "tags=$TAGS" >> $GITHUB_OUTPUT - name: Set up BuildKit diff --git a/.github/workflows/crisp-docker.yml b/.github/workflows/crisp-docker.yml index cc88afca38..bdcf940873 100644 --- a/.github/workflows/crisp-docker.yml +++ b/.github/workflows/crisp-docker.yml @@ -6,16 +6,14 @@ on: branches: - release - main - - hacknet paths: - - 'examples/CRISP/apps/server/**' + - "examples/CRISP/apps/server/**" pull_request: branches: - release - main - - hacknet paths: - - 'examples/CRISP/apps/server/**' + - "examples/CRISP/apps/server/**" env: DOCKERFILE_PATH: examples/CRISP/apps/server/Dockerfile @@ -30,24 +28,24 @@ jobs: name: Build & Push Image runs-on: ubuntu-latest outputs: - image_tag: ${{ steps.version.outputs.version }} + image_tag: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v4 - + - name: Generate version tag id: version run: | echo "version=$(date +'%Y%m%d')-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT - + - name: Set up BuildKit uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Prepare .dockerignore run: cp examples/CRISP/apps/server/.dockerignore .dockerignore @@ -72,4 +70,4 @@ jobs: type=gha,mode=max,scope=cargo-registry type=gha,mode=max,scope=cargo-git type=gha,mode=max,scope=cargo-target - type=gha,mode=max,scope=buildcache \ No newline at end of file + type=gha,mode=max,scope=buildcache diff --git a/.github/workflows/crisp-e2e.yaml b/.github/workflows/crisp-e2e.yaml index f961b1a140..865f951829 100644 --- a/.github/workflows/crisp-e2e.yaml +++ b/.github/workflows/crisp-e2e.yaml @@ -6,7 +6,6 @@ on: push: branches: - main - - hacknet jobs: test: @@ -86,4 +85,4 @@ jobs: with: name: playwright-report path: ./examples/CRISP/playwright-report/ - retention-days: 30 \ No newline at end of file + retention-days: 30 diff --git a/.github/workflows/ec2-deployment.yml b/.github/workflows/ec2-deployment.yml index 3b3fca5b54..aa389f5c6a 100644 --- a/.github/workflows/ec2-deployment.yml +++ b/.github/workflows/ec2-deployment.yml @@ -4,7 +4,6 @@ on: branches: - release - main - - hacknet paths: - "Cargo.*" - "crates/**" @@ -13,7 +12,6 @@ on: branches: - release - main - - hacknet paths: - "Cargo.*" - "crates/**" diff --git a/.github/workflows/publish-evm.yml b/.github/workflows/publish-evm.yml index ad1010ac79..06f0c8aebd 100644 --- a/.github/workflows/publish-evm.yml +++ b/.github/workflows/publish-evm.yml @@ -13,16 +13,23 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: 20 - registry-url: 'https://registry.npmjs.org/' + node-version: 22 + registry-url: "https://registry.npmjs.org/" - name: pnpm-setup uses: pnpm/action-setup@v4 - run: pnpm install + - run: pnpm config:release + env: + NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - run: pnpm evm:release env: NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet + - run: pnpm wasm:release + env: + NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} + - run: pnpm sdk:release + env: + NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - run: pnpm react:release env: NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - NPM_CONFIG_GIT_CHECKS: false # while we are using hacknet From d8bb299af34e58c7bc3ca3d3aebe2d150e93a969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B3=CE=BB?= Date: Mon, 21 Jul 2025 15:52:28 +0000 Subject: [PATCH 106/106] Further hacknet refs (#579) --- crates/cli/build.rs | 2 +- crates/cli/src/cli.rs | 2 +- crates/init/src/git.rs | 4 ++-- crates/init/src/lib.rs | 2 +- examples/CRISP/apps/wasm-crypto/Cargo.lock | 2 ++ templates/default/README.md | 2 +- templates/default/contracts/InputValidator.sol | 2 +- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/cli/build.rs b/crates/cli/build.rs index de4c6cde3f..3401609c32 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -28,7 +28,7 @@ fn get_remote_commit_hash() -> Option { .args(&[ "ls-remote", "https://github.com/gnosisguild/enclave", - "refs/heads/hacknet", // change to main branch once committed + "refs/heads/main", ]) .output() .ok()?; diff --git a/crates/cli/src/cli.rs b/crates/cli/src/cli.rs index 4a3697ff08..ccc629b4fb 100644 --- a/crates/cli/src/cli.rs +++ b/crates/cli/src/cli.rs @@ -227,7 +227,7 @@ pub enum Commands { /// Path to the location where the project should be initialized path: Option, - /// Template repository to use. Expecting the form `git+https://github.com/gnosisguild/enclave.git#hacknet:template/default` + /// Template repository to use. Expecting the form `git+https://github.com/gnosisguild/enclave.git#main:template/default` #[arg(long)] template: Option, diff --git a/crates/init/src/git.rs b/crates/init/src/git.rs index 5c47183116..c1ef26894e 100644 --- a/crates/init/src/git.rs +++ b/crates/init/src/git.rs @@ -144,10 +144,10 @@ mod tests { #[test] fn test_git_url() -> Result<()> { let g = parse_git_url( - "git+https://github.com/gnosisguild/enclave.git#hacknet:template/default".to_string(), + "git+https://github.com/gnosisguild/enclave.git#main:template/default".to_string(), )?; - assert_eq!(g.branch, Some("hacknet".to_string())); + assert_eq!(g.branch, Some("main".to_string())); assert_eq!( g.base_url, "https://github.com/gnosisguild/enclave.git".to_string() diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index c1f139587c..6f99357351 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -17,7 +17,7 @@ use tokio::fs; // const GIT_URL: &str = "https://github.com/gnosisguild/enclave.git#ry/support-alterations-2"; const DEFAULT_TEMPLATE_URL: &str = - "https://github.com/gnosisguild/enclave.git#hacknet:templates/default"; + "https://github.com/gnosisguild/enclave.git#main:templates/default"; const TEMP_DIR: &str = "/tmp/__enclave-tmp-folder.1"; const DEFAULT_TEMPLATE_PATH: &str = "."; const DEFAULT_BRANCH: &str = "main"; diff --git a/examples/CRISP/apps/wasm-crypto/Cargo.lock b/examples/CRISP/apps/wasm-crypto/Cargo.lock index aafa250f22..41a96c132e 100644 --- a/examples/CRISP/apps/wasm-crypto/Cargo.lock +++ b/examples/CRISP/apps/wasm-crypto/Cargo.lock @@ -1143,8 +1143,10 @@ version = "0.1.0" dependencies = [ "alloy-dyn-abi", "alloy-primitives", + "anyhow", "fhe", "fhe-traits", + "rand 0.8.5", ] [[package]] diff --git a/templates/default/README.md b/templates/default/README.md index 33cc566a62..13bacf87b1 100644 --- a/templates/default/README.md +++ b/templates/default/README.md @@ -57,7 +57,7 @@ tmux -V Install the Enclave CLI tool from the official repository: ```bash -cargo install --git https://github.com/gnosisguild/enclave --branch hacknet e3-cli +cargo install --git https://github.com/gnosisguild/enclave --branch main e3-cli ``` ### 2. Install wasm-pack diff --git a/templates/default/contracts/InputValidator.sol b/templates/default/contracts/InputValidator.sol index 04127f4724..ab2766ff7f 100644 --- a/templates/default/contracts/InputValidator.sol +++ b/templates/default/contracts/InputValidator.sol @@ -17,7 +17,7 @@ contract InputValidator is IInputValidator { if (data.length == 0) revert EmptyInputData(); // You can add your own validation logic here. - // EXAMPLE: https://github.com/gnosisguild/enclave/blob/hacknet/examples/CRISP/contracts/CRISPInputValidator.sol + // EXAMPLE: https://github.com/gnosisguild/enclave/blob/main/examples/CRISP/contracts/CRISPInputValidator.sol input = data; }